MySQL--當mysqldump --single-transaction遇到alter table(1)

部分生產環境採用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操做完成後修改表操做方可正常執行。

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

相關文章
相關標籤/搜索