Rumah > pangkalan data > tutorial mysql > 关于mysqldump的实例详解

关于mysqldump的实例详解

零下一度
Lepaskan: 2017-07-19 16:06:23
asal
1576 orang telah melayarinya

部分生产环境采用mysqldump --single-transaction的方式在夜间进行数据库备份,而同事恰好在备份期间执行了alter table操作,操作部分成功部分失败,为啥呢?

测试在MySQL 5.6.36上执行,该问题存在版本差异!

##========================================================================##

在mysqldump对single-transaction参数的解释为:

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.
Salin selepas log masuk

红色字体部分是重点,但是看得有些迷糊,还是动手测试下。

根据《mysqldump的几个主要选项探究》的介绍,我们备份执行的命令mysqldump --single-transaction --master-data相当于执行下面代码:

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=1SHWO CREATE TABLE 'xxx'SHOW FIELDS FROM 'xxx'SHOW TABLE STATUS LIKE 'xxx'SELECT /*!40001 SQL_NO_CACHE */ * FROM  xxx

QUIT
Salin selepas log masuk

场景1:mysqldump开始但尚未备份到表tb001时,另外回话对表tb001进行alter操作,然后mysqldump对表tb001进行导出

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 */;
Salin selepas log masuk

总结: 

single-transaction参数通过Innodb的多版本来获得数据一致性,而ALTER TABLE, DROP TABLE, RENAME TABLE,TRUNCATE TABLE等操作会破坏数据一致性,两种操作不能并发执行。

如果修改表操作在 ”mysqldump开启后但还未导出修改表数据前“ 的时间段内开始,则修改表操作成功完成,而mysqldump会执行失败;

如果修改表操作在 “mysqldum已导出修改表数据但还未结束mysqldump操作前”的时间段内开始,则修改表操作被阻塞,mysqldum能成功完成,在mysqldump操作完成后修改表操作方可正常执行。

Atas ialah kandungan terperinci 关于mysqldump的实例详解. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan