运行MySQLDump而不locking表
我想要将生产数据库复制到我的本地开发数据库中。 有没有办法做到这一点,而不locking生产数据库?
我目前正在使用:
mysqldump -u root --password=xxx -h xxx my_db1 | mysql -u root --password=xxx -h localhost my_db1
但它locking每个表运行。
--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,你不担心在转储时locking,只需使用以下选项:
--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
老实说,我会为此设置复制,就好像你不锁表一样,你将得到不一致的数据。
如果转储需要较长的时间,那么已经转储的表可能会随着某个仅仅被转储的表而改变。
所以要么locking表或使用复制。
相比于那个说他迟到的人来说,这和他原来的回答差不多,但就我而言(通过Windows 7上的WAMP使用MySQL),我不得不使用:
--skip-lock-tables
对于InnoDB表使用 – 单一事务
“它在BEGIN发布的时候转储数据库的一致性状态而不阻塞任何应用程序” MySQL DOCS
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
由于这些方法都不适合我,我只是做了一个:
mysqldump [...] | grep -v "LOCK TABLE" | mysql [...]
它将排除LOCK TABLE <x>
和UNLOCK TABLES
命令。
注意:希望您的数据不包含该string!
另一个晚回答:
如果您正在尝试制作服务器数据库的热备份(在Linux环境中),并且所有表的数据库引擎都是MyISAM,则应该使用mysqlhotcopy
。
根据文件:
它使用FLUSH TABLES,LOCK TABLES和cp或scp来进行数据库备份。 这是对数据库或单个表进行备份的快速方法,但只能在数据库目录所在的同一台机器上运行。 mysqlhotcopy只能用于备份MyISAM和ARCHIVE表。
LOCK TABLES
时间取决于服务器可以复制MySQL文件的时间(不会进行转储)。