我想将一个实时生产数据库复制到本地开发数据库中。是否有一种方法可以在不锁定生产数据库的情况下做到这一点?

我目前正在使用:

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

但是它在运行时锁定了每个表。


当前回答

由于这些方法对我都不起作用,我只是做了一个:

mysqldump [...] | grep -v "LOCK TABLE" | mysql [...]

它将排除LOCK TABLE <x>和UNLOCK TABLES命令。

注意:希望您的数据中不包含该字符串!

其他回答

要转储大型表,您应该结合使用——single-transaction选项和——quick。

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

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

对于InnoDB表使用flag——single-transaction

它在BEGIN时转储数据库的一致状态 没有阻止任何申请

MySQL文档

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

由于这些方法对我都不起作用,我只是做了一个:

mysqldump [...] | grep -v "LOCK TABLE" | mysql [...]

它将排除LOCK TABLE <x>和UNLOCK TABLES命令。

注意:希望您的数据中不包含该字符串!

——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