mysqldump與innobackupex備份過程你知多少(二)

沃趣科技發表於2017-07-17
沃趣科技  羅小波



1.2.3. 使用WITH CONSISTENT SNAPSHOT子句的作用



START TRANSACTION語句使用WITH CONSISTENT SNAPSHOT子句時,會為事務啟動一致性讀(該子句僅適用於InnoDB)。其行為與執行START TRANSACTION語句之後+一個SELECT語句效果相同(會獲取一個事務號,在read view中佔個坑,但是不會請求任何鎖)。WITH CONSISTENT SNAPSHOT子句不會自動修改當前的事務隔離級別,由於WITH CONSISTENT SNAPSHOT子句要求必須RR隔離級別下才會自動啟用,因此只有當前隔離級別為RR時才會啟用一致性快照,非RR隔離級別下,會忽略WITH CONSISTENT SNAPSHOT子句。從MySQL 5.7.2起,當WITH CONSISTENT SNAPSHOT子句被忽略時,會產生一個警告(類似上一篇mysqldump與innobackupex備份過程你知多少(一)提到的警告資訊)。

為了使得更清晰地瞭解mysqldump在備份過程中使用WITH CONSISTENT SNAPSHOT子句的作用,下面我們們來演示一下帶與不帶WITH CONSISTENT SNAPSHOT子句會發生什麼?

  • 開啟兩個會話,操作同一張表

mysqldump與innobackupex備份過程你知多少(二)

mysqldump與innobackupex備份過程你知多少(二)

mysqldump與innobackupex備份過程你知多少(二)

mysqldump與innobackupex備份過程你知多少(二)

mysqldump與innobackupex備份過程你知多少(二)

mysqldump與innobackupex備份過程你知多少(二)

mysqldump與innobackupex備份過程你知多少(二)

從上面的表格對比結果中可以看到:

  • WITH CONSISTENT SNAPSHOT子句的作用就相當於START TRANSACTION+ SELECT語句,目地是為了在開啟事務的那一刻往mvcc的read view中立即加入這個事務,就好像read view在事務一開始就被固定了一樣,使得後續其他事務的DML不會影響到該事務的查詢結果,這就是所說的一致性讀

  • 如果不使用WITH CONSISTENT SNAPSHOT子句,在使用START TRANSACTION語句顯式開啟一個事務之後,在執行SELECT語句之前,這段時間內如果有別的事務發起了DML操作,就會導致該事務查詢該表的時候讀取的資料與事務開始時間點不一致。


1.2.4. 使用savepoint來設定回滾點的作用


大家都知道,設定SAVEPOINT是為了回滾在設定這個點時候發生變更的資料,但是mysqldump備份只是使用select語句做查詢,為什麼要使用savepoint呢?需要回滾什麼呢?請看下文分析:

  • SAVEPOINT 'identifier' 語句,為事務設定一個命名的事務儲存點(回滾點),該字串為事務儲存點的識別符號。

  • ROLLBACK TO SAVEPOINT 語句的作用是將事務回滾到指定的儲存點的位置,而不終止事務。當前事務在回滾點之後的修改的行資料將被撤銷(注:InnoDB不會釋放這些發生修改且被撤銷行的行鎖,注意是修改,不是新插入,這些發生修改的資料行行鎖被儲存在記憶體中),對於設定了儲存點之後,新插入的行資料也會被撤銷(注:這些鎖資訊被儲存在行資料中的事務ID上,這些行鎖不會單獨儲存在記憶體中,在這種情況下,這些新插入的行資料在被回滾之後,對應的行鎖將被釋放)。另外,回滾到某個儲存點之後,比這個儲存點在時間上更晚設定的儲存點將被刪除。

  • ROLLBACK TO SAVEPOINT 語句還有一個作用,可以釋放在設定儲存點之後事務持有的MDL鎖,這點便是mysqldump需要使用儲存點的關鍵點。

為了更清晰地瞭解mysqldump在備份過程中使用SAVEPOINT sp + ROLLBACK TO SAVEPOINT sp語句的作用,下面使用兩個會話演示一下使用與不使用儲存點會發生什麼?

mysqldump與innobackupex備份過程你知多少(二)

mysqldump與innobackupex備份過程你知多少(二)

mysqldump與innobackupex備份過程你知多少(二)

mysqldump與innobackupex備份過程你知多少(二)

mysqldump與innobackupex備份過程你知多少(二)

mysqldump與innobackupex備份過程你知多少(二)

從上面的對比結果中可以得知:

  • mysqldump使用savepoint的作用就是,當一個顯式開啟的事務回滾到儲存點時,除了回滾資料變更之外,還會釋放儲存點之後select語句獲取的MDL鎖,使得其他會話的DDL語句可以正常執行。對於mysqldump來說,select 語句執行完成之後就代表著該表的資料已經備份完成,無需再繼續持有MDL鎖,使用savepoint就實現了在select 執行完成之後釋放MDL鎖的目的(注:在事務內,執行select *語句雖然不會有資料行鎖,但是會持有表的MDL鎖)。

  • with consistent snapshot子句對應mysqldump實現一致性備份來說至關重要,不僅僅是資料的一致性,使用該子句時,表定義也保持事務開啟的那一刻,所以,從上面的對比結果中可以看到,使用了with consistent snapshot子句開啟一個一致性快照事務之後,如果一旦表結構定義發生改變,事務將無法重複查詢表。

  • 從上面的演示過程中,我們也可以看到,使用 with consistent snapshot子句顯式開啟一個事務之後,如果該事務沒有對任何表做任何操作時,此時是沒有獲得任何鎖的,所以,如果在該事務對某表執行操作之前其他事務對該表執行了DDL操作之後,將導致該事務無法再對錶執行查詢,會報表結構發生變化的錯誤;當然,如果顯式開啟事務後立即對某表執行查詢,那麼其他會話的DDL是會發生阻塞的;當在該事務使用savepoint實現方式釋放表的MDL鎖之後,其他會話允許執行DDL,但是執行了DDL語句之後,該事務就無法再對該表執行查詢。當然,如果不使用 with consistent snapshot子句,則其他會話執行的DDL對錶定義的變更不會影響到該事務重複對錶執行查詢。

下一篇"mysqldump與innobackupex備份過程你知多少(三)"我們將接著介紹"關於mysqldump的那些坑”,精彩內容不容錯過,敬請期待!!


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/28218939/viewspace-2142166/,如需轉載,請註明出處,否則將追究法律責任。

相關文章