我想将实时生产数据库复制到本地开发数据库中。 有没有一种方法可以不锁定生产数据库?
我目前正在使用:
mysqldump -u root --password=xxx -h xxx my_db1 | mysql -u root --password=xxx -h localhost my_db1
但是它在运行时锁定每个表。
#1楼
mysqldump -uuid -ppwd --skip-opt --single-transaction --max_allowed_packet=1G -q db | mysql -u root --password=xxx -h localhost db
#2楼
要转储大表,应将--single-transaction选项与--quick结合使用。
http://dev.mysql.com/doc/refman/5.1/en/mysqldump.html#option_mysqldump_single-transaction
#3楼
--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
#4楼
老实说,我将为此设置复制,就像您不锁定表一样,将从转储中获取不一致的数据。
如果转储需要更长的时间,则已经转储的表可能会与仅将要转储的某些表一起更改。
因此,要么锁定表,要么使用复制。
#5楼
答案因您使用的存储引擎而异。 理想的情况是使用InnoDB。 在这种情况下,您可以使用--single-transaction
标志,这将在转储开始时为您提供数据库的一致快照。
#6楼
与那个说他迟到原始答案的人相比,这差不多晚了,但是在我的情况下(Windows 7上通过WAMP的MySQL),我不得不使用:
--skip-lock-tables
#7楼
这个年龄已经来不及了,但对正在搜索该主题的任何人都有利。 如果您不是innoDB,并且您不担心在转储时锁定,则只需使用以下选项:
--lock-tables=false
#8楼
对于InnoDB表,请使用标志--single-transaction
它会在发出BEGIN时转储数据库的一致状态,而不会阻止任何应用程序
MySQL DOCS
http://dev.mysql.com/doc/refman/5.1/en/mysqldump.html#option_mysqldump_single-transaction
#9楼
由于这些方法都不适合我,因此我做了一个:
mysqldump [...] | grep -v "LOCK TABLE" | mysql [...]
它将同时排除LOCK TABLE <x>
和UNLOCK TABLES
命令。
注意:希望您的数据中不包含该字符串!
#10楼
--skip-add-locks
对我有帮助
#11楼
另一个较晚的答案:
如果您尝试制作服务器数据库的热副本(在Linux环境中),并且所有表的数据库引擎均为MyISAM, 则应使用mysqlhotcopy
。
根据文档:
它使用FLUSH TABLES,LOCK TABLES和cp或scp进行数据库备份。 这是备份数据库或单个表的快速方法,但是只能在数据库目录所在的同一台计算机上运行。 mysqlhotcopy仅适用于备份MyISAM和ARCHIVE表。
LOCK TABLES
时间取决于服务器可以复制MySQL文件的时间(不进行转储)。
#12楼
今天,即使我也遇到了同样的问题,但是我无权访问命令行。所以我在记事本编辑器中打开了sql文件,并从表格的下面删除了
LOCK TABLES `yourtable name` WRITE;
然后我导入了我的开发环境。工作正常。 希望对大家有帮助
#13楼
由于https://dev.mysql.com/doc/refman/5.7/en/mysqldump.html#option_mysqldump_lock-tables :
某些选项(例如--opt(默认启用))会自动启用--lock-tables。 如果要覆盖此选项,请在选项列表末尾使用--skip-lock-tables。
#14楼
使用MySQL Workbench时,在“数据导出”中,单击“高级选项”,然后取消选中“锁定表”选项。