我想将实时生产数据库复制到本地开发数据库中。有没有一种方法可以不锁定生产数据库?
我目前正在使用:
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
但是它在运行时锁定每个表。
Answers:
该--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
--single-transaction
。
FLUSH TABLES WITH READ LOCK
。
--skip-add-locks
对我有帮助
--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时转储数据库的一致状态,而不会阻止任何应用程序
MySQL DOCS
http://dev.mysql.com/doc/refman/5.1/en/mysqldump.html#option_mysqldump_single-transaction
--skip-lock-tables
。
老实说,我将为此设置复制,就像您不锁定表一样,将从转储中获取不一致的数据。
如果转储需要更长的时间,则已经转储的表可能会与仅将要转储的某些表一起更改。
因此,要么锁定表,要么使用复制。
与那个说他迟到原始答案的人相比,这差不多晚了,但是对于我而言(在Windows 7上是通过WAMP的MySQL),我不得不使用:
--skip-lock-tables
由于这些方法都不适合我,因此我做了一个:
mysqldump [...] | grep -v "LOCK TABLE" | mysql [...]
它将同时排除LOCK TABLE <x>
和UNLOCK TABLES
命令。
注意:希望您的数据中不包含该字符串!
由于https://dev.mysql.com/doc/refman/5.7/en/mysqldump.html#option_mysqldump_lock-tables:
某些选项(例如--opt(默认启用))会自动启用--lock-tables。如果要覆盖此选项,请在选项列表末尾使用--skip-lock-tables。
另一个较晚的答案:
如果您要制作服务器数据库的热副本(在Linux环境中),并且所有表的数据库引擎均为MyISAM,则应使用mysqlhotcopy
。
根据文档:
它使用FLUSH TABLES,LOCK TABLES和cp或scp进行数据库备份。这是备份数据库或单个表的快速方法,但是只能在数据库目录所在的同一台计算机上运行。mysqlhotcopy仅适用于备份MyISAM和ARCHIVE表。
该LOCK TABLES
时间取决于时间的服务器可以复制MySQL文件(它没有转储)。