部分生产环境采用mysqldump --single-transaction的方式在夜间进行数据库备份,而同事刚好在备份期间执行了alter table操做,操做部分红功部分失败,为啥呢?html
##========================================================================##mysql
如下测试在MySQL 5.6.36上执行,该问题存在版本差别!sql
MySQL 5.5 版本测试结果:《MySQL--当mysqldump --single-transaction遇到alter table(2)》数据库
##========================================================================##并发
在mysqldump对single-transaction参数的解释为:post
Creates a consistent snapshot by dumping all tables in a
single transaction. Works ONLY for tables stored in
storage engines which support multiversioning (currently
only InnoDB does); the dump is NOT guaranteed to be
consistent for other storage engines. While a
--single-transaction dump is in process, to ensure a
valid dump file (correct table contents and binary log
position), no other connection should use the following
statements: ALTER TABLE, DROP TABLE, RENAME TABLE,
TRUNCATE TABLE, as consistent snapshot is not isolated
from them. Option automatically turns off --lock-tables.测试
红色字体部分是重点,可是看得有些迷糊,仍是动手测试下。字体
根据《mysqldump的几个主要选项探究》的介绍,咱们备份执行的命令mysqldump --single-transaction --master-data至关于执行下面代码:url
FLUSH TABLES; FLUSH TABLES WITH READ LOCK; SET SESSION TRANSACTION ISOLATION LEVEL REPEATABLE READ; START TRANSACTION WITH CONSISTENT SNAPSHOT; SHOW MASTER STATUS; UNLOCK TABLES; SHOW TABLES LIKE 'xxx' SET OPTION SQL_QUOTE_SHOW_CREATE=1 SHWO CREATE TABLE 'xxx' SHOW FIELDS FROM 'xxx' SHOW TABLE STATUS LIKE 'xxx' SELECT /*!40001 SQL_NO_CACHE */ * FROM xxx QUIT
场景1:mysqldump开始但还没有备份到表tb001时,另外回话对表tb001进行alter操做,而后mysqldump对表tb001进行导出spa
alter操做顺利完成,可是mysqldump操做失败。
场景2:mysqldump开始备份并完成tb001的导出,在对其余表进行导出过程当中,其余回话对表进行alter操做
alter table操做被阻塞直至mysqldump完成或失败后退出。
使用mysqldump备份时,模拟场景2的环境,报错信息为:
mysqldump: Error 1412: Table definition has changed, please retry transaction when dumping table `tb1002` at row: 0
查看导出文件,最后内容为:
-- -- Dumping data for table `tb1002` -- LOCK TABLES `tb1002` WRITE; /*!40000 ALTER TABLE `tb1002` DISABLE KEYS */;
##========================================================================##
总结:
single-transaction参数经过Innodb的多版原本得到数据一致性,而ALTER TABLE, DROP TABLE, RENAME TABLE,TRUNCATE TABLE等操做会破坏数据一致性,两种操做不能并发执行。
若是修改表操做在 ”mysqldump开启后但还未导出修改表数据前“ 的时间段内开始,则修改表操做成功完成,而mysqldump会执行失败;
若是修改表操做在 “mysqldum已导出修改表数据但还未结束mysqldump操做前”的时间段内开始,则修改表操做被阻塞,mysqldum能成功完成,在mysqldump操做完成后修改表操做方可正常执行。
##========================================================================##