我想将一个实时生产数据库复制到我的本地开发数据库中.有没有办法在不锁定生产数据库的情况下执行此操作?
我目前正在使用:
mysqldump -u root --password=xxx -h xxx my_db1 | mysql -u root --password=xxx -h localhost my_db1
但它在运行时锁定每个表.
该--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,并且在转储时不担心锁定,只需使用以下选项:
--lock-tables=false
答案取决于您使用的存储引擎.理想的情况是你使用的是InnoDB.在这种情况下,您可以使用该--single-transaction
标志,该标志将在转储开始时为您提供数据库的连贯快照.
--skip-add-locks
对我有帮助
要转储大型表,您应该将--single-transaction选项与--quick结合使用.
http://dev.mysql.com/doc/refman/5.1/en/mysqldump.html#option_mysqldump_single-transaction
老实说,我会为此设置复制,就好像你没有锁定表,你将从转储中获得不一致的数据.
如果转储需要更长的时间,那么已经转储的表可能会随着一些只是要转储的表一起发生变化.
因此要么锁定表,要么使用复制.
对于InnoDB表,使用--single-transaction
"它在发布BEGIN时转储数据库的一致状态而不阻塞任何应用程序" --single-transaction
http://dev.mysql.com/doc/refman/5.1/en/mysqldump.html#option_mysqldump_single-transaction
与那个说他迟到的家伙相比,这个问题要晚得多,但在我的情况下(MySQL通过Windows 7上的WAMP),我不得不使用:
--skip-lock-tables
mysqldump -uuid -ppwd --skip-opt --single-transaction --max_allowed_packet=1G -q db | mysql -u root --password=xxx -h localhost db