当前位置:  开发笔记 > 后端 > 正文

运行MySQLDump而不锁定表

如何解决《运行MySQLDump而不锁定表》经验,为你挑选了9个好方法。

我想将一个实时生产数据库复制到我的本地开发数据库中.有没有办法在不锁定生产数据库的情况下执行此操作?

我目前正在使用:

mysqldump -u root --password=xxx -h xxx my_db1 | mysql -u root --password=xxx -h localhost my_db1

但它在运行时锁定每个表.



1> John Milliki..:

--lock-tables=false选项是否有效?

根据手册页,如果要转储InnoDB表,可以使用以下--single-transaction选项:

--lock-tables, -l

Lock all tables before dumping them. The tables are locked with READ
LOCAL to allow concurrent inserts in the case of MyISAM tables. For
transactional tables such as InnoDB and BDB, --single-transaction is
a much better option, because it does not need to lock the tables at
all.

对于innodb DB:

mysqldump --single-transaction=TRUE -u username -p DB


对于innodb DB mysqldump --single-transaction = TRUE -u username -p DB
如果你有innodb和myisam怎么办?

2> 小智..:

这已经太晚了,但对搜索主题的任何人都有好处.如果您不是innoDB,并且在转储时不担心锁定,只需使用以下选项:

--lock-tables=false


但你*应该担心锁定表格.如果在mysqldump运行时(并且您使用外键)写入多个表,则转储可能不一致.在恢复它并碰巧对不一致的数据运行JOIN查询之前,您不会知道.可能需要一段时间才能发现不一致的数据,因为您的应用程序使用JOIN而不是Mysql(使用MyISAM表); 恢复将正常工作,mysql不会警告你不一致.所以:MyIsam - >总是锁定你的桌子.InnoDB - >使用`--single-transaction`.
@Costa我认为锁定表甚至不足以支持MyISAM表.如果mysqldump锁定应用程序执行的*查询之间的表*,那么最终会出现相同的不一致.答案更简单:MyISAM - >使用InnoDB.
使用'--lock-table = false --quick'使用最少的服务器资源

3> dvorak..:

答案取决于您使用的存储引擎.理想的情况是你使用的是InnoDB.在这种情况下,您可以使用该--single-transaction标志,该标志将在转储开始时为您提供数据库的连贯快照.



4> 小智..:

--skip-add-locks 对我有帮助


这将从转储文件中删除LOCK TABLES和UNLOCK TABLES语句,它不会影响导出期间的锁定.
不,这不是你想要的!请参阅dabest1的评论.这并不妨碍你的表在执行mysqldump时被锁定.这不是问题的答案.
或者--compact包含其他优化的跳过锁.

5> 小智..:

要转储大型表,您应该将--single-transaction选项与--quick结合使用.

http://dev.mysql.com/doc/refman/5.1/en/mysqldump.html#option_mysqldump_single-transaction


选项--quick是选项的一部分 - 现在是.并且 - 默认情况下启用--opt.

6> michal krali..:

老实说,我会为此设置复制,就好像你没有锁定表,你将从转储中获得不一致的数据.

如果转储需要更长的时间,那么已经转储的表可能会随着一些只是要转储的表一起发生变化.

因此要么锁定表,要么使用复制.


如果您尚未设置复制,则需要执行转储以进行设置.存在同样的问题.
如果您尚未设置复制,则需要锁定表以执行转储以确保数据完整性.所以这是一个问题22.
此评论不正确.MVCC允许在没有InnoDB锁定的情况下读取一致状态.

7> Lex..:

对于InnoDB表,使用--single-transaction

"它在发布BEGIN时转储数据库的一致状态而不阻塞任何应用程序" --single-transaction

http://dev.mysql.com/doc/refman/5.1/en/mysqldump.html#option_mysqldump_single-transaction



8> dtbarne..:

与那个说他迟到的家伙相比,这个问题要晚得多,但在我的情况下(MySQL通过Windows 7上的WAMP),我不得不使用:

--skip-lock-tables



9> naveen_sfx..:
    mysqldump -uuid -ppwd --skip-opt --single-transaction --max_allowed_packet=1G -q db |   mysql -u root --password=xxx -h localhost db

推荐阅读
放ch养奶牛
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有