在使用mysqldump(或者mysqlpump)备份mysql数据库时,有如下三个参数值得研究:
--lock-all-tables
保证整个数据库(所有schema)的数据具有一致性快照。
在mysqldump导出的整个过程中以read方式锁住所有表(锁住方式类似 flush tables with read lock 的全局锁)。
比如当前数据库有如下schema:
information_schema(不会导出)
mysql
performance_schema(不会导出)
sys(不会导出)
test
test1
test2
那么我们在使用mysqldump导出时:
C:\Users\Administrator>mysqldump --lock-all-tables --set-gtid-purged=on -AER > d:\temp\mysql.2016-4-1.dump
指定--lock-all-tables参数,那么从一开始就对整个mysql实例加global read lock锁。
这整个全局读锁会一直持续到导出结束。
所以在这个过程中,数据库实际严格处于read only状态。
所以导出的数据库在数据一致性上是被严格保证的,也就是数据是一致性的。
由于这个参数会将数据库置于read only状态(也相当于不可使用状态),所以默认不加该参数。
这相当于脱机备份的感觉,所以生产数据库的备份策略上,也很少使用该参数。
使用该参数的话,也会自动将 --single-transaction 及 --lock-tables 参数置于 off 状态。
该参数默认off。
--single-transaction
保证各个表具有数据一致性快照。
指定 --single-transaction 参数,那么导出过程中只能保证每个表的数据一致性(利用多版本特性实现,目前只能针对InnoDB事务表)。
比如有一个大表,mysqldump对该表的导出需要1分钟,那么在这1分钟的过程中,该表时可以被正常访问的。
(正常访问包括增删改查,但是alter table等对表结构发生更改的语句要被挂起。)
mysqldump能够保证从开始对该表进行导出,一直到对该表的导出结束,该表的数据都是开始的一致性数据快照状态。
所以该参数明显不能保证各个表之间的数据一致性(特别是外键约束的父表和子表之间)。
但是该参数能够让数据库处于可使用(就是应用感觉数据库可用)状态,相当于联机备份,所以被经常使用。
该参数默认off。
--lock-tables
保证各个schema具有数据一致性快照。
指定 --lock-tables 参数,那么在导出过程中能够保证各个schema的数据一致性。
比如导出 cms 库(该库有155张表)时:
C:\Users\Administrator>mysqldump --lock-tables --set-gtid-purged=off -ER -B cms> d:\temp\mysql.cms.2016-4-1.dump
从命令开始,就对 cms 库的155张表加类似 lock table xxx read 的读锁。
这会导致在导出整个cms库的过程中,cms库实际上整体处于read only状态。
但是如果我们指定如下命令:
C:\Users\Administrator>mysqldump --lock-tables --set-gtid-purged=on -AER > d:\temp\mysql.2016-4-1.dump
来导出全部mysql库,那么当导出cms库的过程中,其他 schema 实际上是可以被正常访问的。
这个正常访问就是可以接受所有合法的sql语句。
所以该参数只能保证各个schema自己的数据一致性快照。
该参数默认on。