我想将生产环境的数据库复制到本地开发环境的数据库。有没有一种方法可以在不锁定生产环境数据库的情况下完成此操作?
我目前正在使用:
mysqldump -u root --password=xxx -h xxx my_db1 | mysql -u root --password=xxx -h localhost my_db1
但它在运行时会锁定每个表。
我想将生产环境的数据库复制到本地开发环境的数据库。有没有一种方法可以在不锁定生产环境数据库的情况下完成此操作?
我目前正在使用:
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 数据库:
mysqldump --single-transaction=TRUE -u username -p DB
mysqldump --single-transaction=TRUE -u用户名 -p 数据库名
。 - user1642018虽然来得有些晚了,但对于任何正在搜索这个主题的人都是好消息。如果您不使用InnoDB,并且在转储时不担心锁定问题,只需使用以下选项:
--lock-tables=false
--single-transaction
。 - Costa答案取决于您使用的存储引擎。理想情况是如果您使用InnoDB。在这种情况下,您可以使用--single-transaction
标志,在转储开始时将为您提供数据库的一致快照。
--skip-add-locks
对我有帮助
--skip-add-locks
只会使备份恢复速度更快。这不是一个正确的答案。 - dr_mysqldump
在转储数据时,AWS Aurora(我使用的是5.7.~something驱动程序)将在插入时锁定表,包括日志表。这将引发错误“您无法在日志表上使用锁定。”而重新插入。我只转储迁移所需的数据,因此我认为这将优雅地解决我的问题。 - Richard Tyler Miles要转储大型数据表,应将--single-transaction选项与--quick选项结合使用。
http://dev.mysql.com/doc/refman/5.1/en/mysqldump.html#option_mysqldump_single-transaction
--single-transaction
。该命令会在不阻止任何应用程序的情况下,在执行BEGIN时,将数据库处于一致状态的转储输出。--skip-lock-tables
。 - Xavi Montero相对于那个说他迟到了的人和最初的答案而言,我的情况(在Windows 7上通过WAMP使用MySQL)需要使用:
--skip-lock-tables
--skip-add-locks
的答案吗?那绝对不同于--skip-lock-tables
。感谢你花时间在9年后错误地指出这一点。 :) - dtbarne老实说,我会为此设置复制,因为如果您不锁定表格,您将从转储中获取不一致的数据。
如果转储需要更长时间,那么已经转储的表格可能已经发生了变化,以及某些即将被转储的表格。
因此,请锁定表格或使用复制。
mysqldump -uuid -ppwd --skip-opt --single-transaction --max_allowed_packet=1G -q db | mysql -u root --password=xxx -h localhost db