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

我目前正在使用:

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

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


当前回答

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

其他回答

这和那个说他迟到的人比起来差不多晚了,但在我的情况下(在Windows 7上通过WAMP下载MySQL),我不得不使用:

--skip-lock-tables

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

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

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

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

另一个迟来的回答是:

如果您正在尝试对服务器数据库进行热复制(在linux环境中),并且所有表的数据库引擎都是MyISAM,您应该使用mysqlhotcopy。

相应的文件:

它使用FLUSH TABLES、LOCK TABLES和cp或scp来创建数据库 备份。这是一种快速备份数据库或单个数据库的方法 表,但是它只能在数据库所在的同一台机器上运行 目录被定位。Mysqlhotcopy只适用于备份 MyISAM和ARCHIVE表。

LOCK TABLES时间取决于服务器复制MySQL文件的时间(它不转储)。

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

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

MySQL文档

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

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

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