在不锁定表的情况下运行MySQLDump


437

我想将实时生产数据库复制到本地开发数据库中。有没有一种方法可以不锁定生产数据库?

我目前正在使用:

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

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


另一个较晚的解决方案:您还可以使用Percona XtraBackup来转储生产数据库,而不会中断事务处理。它允许进行热备份,即不影响当前活动。参见此处:percona.com/software/mysql-database/percona-xtrabackup(我与Percona没有任何联系。)
delx

Answers:


625

--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

23
对于innodb DB mysqldump --single-transaction = TRUE -u用户名-p DB
AMB 2015年

19
如果您拥有innodb和myisam,该怎么办?
CMCDragonkai 2015年

默认情况下启用吗?
CMCDragonkai 2015年

显然在(即锁定)?
evandrix

290

这个年龄已经来不及了,但对正在搜索该主题的任何人都有利。如果您不是innoDB,并且您不担心在转储时锁定,则只需使用以下选项:

--lock-tables=false

1
感谢沃伦(Warren)的回复,这非常有帮助,而且像灵丹妙药一样有效。
加文

7
使用'--lock-table = false --quick'使用最少的服务器资源
SyntaxGoonoo 2013年

43
但是您应该担心锁定表。如果在mysqldump运行时(并且您使用外键)写入了多个表,则您的转储可能不一致。您将不知道,直到您还原它并碰巧对不一致的数据运行JOIN查询。发现不一致的数据可能要花一些时间,因为JOIN是由您的应用程序而非Mysql(带有MyISAM表)使用的;还原将正常工作,mysql不会警告您不一致之处。因此:MyIsam->始终锁定您的表。InnoDB的- >使用--single-transaction
2013年

12
@Costa我认为锁定表对于MyISAM表来说还不够。如果mysqldump将表锁定在应用程序执行的查询之间,则最终会出现相同的不一致情况。答案更简单:MyISAM->使用InnoDB。
cdhowie 2015年

@Costa您绝对应该担心锁定表,但前提是您确实需要一致的转储。在某些情况下,您可能会不这样做。例如,在数据库范围的转储(调试)上使用粗略的fgrep:我敢打赌,不要让用户等待约20分钟来创建生产数据库的转储(真实情况)。如果不仅要尽快转储,而且要保持一致性,那么就应该转储复制的从属服务器或使用较低级别的快照(lvm,zfs,btrfs等),请牢记FLUSH TABLES WITH READ LOCK
Alex Offshore

44

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


35

--skip-add-locks 对我有帮助


2
或--compact以包括其他优化的跳过锁。
ppostma1 2013年

77
这将从转储文件中删除LOCK TABLES和UNLOCK TABLES语句,它不影响导出期间的锁定。
dabest1年

11
不,这不是您要找的东西!请参阅dabest1的评论。这样做并不能防止在执行mysqldump时锁定表。这不是问题的答案。
2016年

@dabest和@orrd是正确的:--skip-add-locks只会使转储恢复更快。这不是正确答案。
dr_



10

老实说,我将为此设置复制,就像您不锁定表一样,将从转储中获取不一致的数据。

如果转储需要更长的时间,则已经转储的表可能会与仅将要转储的某些表一起更改。

因此,要么锁定表,要么使用复制。


整个数据库几乎完全是只读的,因此我不必担心它会发生变化。
格雷格

2
此评论不正确。MVCC允许读取一致状态而无需锁定InnoDB。
Scott Hyndman

5
如果尚未设置复制,则需要进行转储以进行设置。存在相同的问题。
Matt Connolly13年

3
如果尚未设置复制,则需要锁定表以进行转储以确保数据完整性。所以这是一个
难处。22

9

与那个说他迟到原始答案的人相比,这差不多晚了,但是对于我而言(在Windows 7上是通过WAMP的MySQL),我不得不使用:

--skip-lock-tables

这就是我转储information_schema的工作,而没有出现错误“使用锁定表时拒绝用户'debian-sys-maint'@'localhost'访问数据库'information_schema'”
Rui F Ribeiro,2016年

6
    mysqldump -uuid -ppwd --skip-opt --single-transaction --max_allowed_packet=1G -q db |   mysql -u root --password=xxx -h localhost db

投上一票,这个对我
有用的

1
我不建议为此目的使用“ --skip-opt”。这远远超出了原始问题的要求。它关闭快速模式,它不包含的字符集,等等等等
orrd


1

由于这些方法都不适合我,因此我做了一个:

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

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

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


2
--skip-add-locks在转储期间也这样做
codewandler


0

另一个较晚的答案:

如果您要制作服务器数据库的热副本(在Linux环境中),并且所有表的数据库引擎均为MyISAM,则应使用mysqlhotcopy

根据文档:

它使用FLUSH TABLES,LOCK TABLES和cp或scp进行数据库备份。这是备份数据库或单个表的快速方法,但是只能在数据库目录所在的同一台计算机上运行。mysqlhotcopy仅适用于备份MyISAM和ARCHIVE表。

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


0

今天,即使我也遇到了同样的问题,但是我无权访问命令行。所以我在记事本编辑器中打开了sql文件,并从表格的下面删除了该行

LOCK TABLES `yourtable name` WRITE;

然后我导入了我的开发环境。工作正常。希望对大家有帮助

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.