InnoDB儲存引擎——重新整理鄰接頁、啟動、關閉和恢復

readyao發表於2017-03-14

重新整理鄰接頁

InnoDB儲存引擎還提供了Flush Neighbor Page(重新整理鄰接頁)的特性。其工作原理為:當重新整理一個髒頁時,InnoDB儲存引擎會檢測該頁所在區(extent)的所有頁,如果是髒頁,那麼一起進行重新整理。
有兩個問題:
1)是不是可能將不怎麼髒的頁進行了寫入,而該頁之後又會 很快變成髒頁?
2)固態硬碟有著較高的IOPS,是否還需要這個特性?
所以,InnoDB1.2.x版本開始提供了引數innodb_flush_neighbors,用來控制是否啟用該特性。對於傳統機械硬碟建議啟用該特性,而對於固態硬碟有著較高的IOPS效能的磁碟,則建議將該引數設定為0,即關閉該特性。

啟動、關閉和恢復

InnoDB儲存引擎是MySql資料庫的儲存引擎之一,因此InnoDB儲存引擎的啟動和關閉,或者說MySql資料庫伺服器的啟動和關閉過程對InnoDB儲存引擎的處理過程。
在關閉時,引數 innodb_fast_shutdown影響著表的InnoDB儲存引擎的行為,該引數可以為0,1,2,預設值為1;

mysql> show variables like 'innodb_fast_shutdown';  
+----------------------+-------+
| Variable_name        | Value |
+----------------------+-------+
| innodb_fast_shutdown | 1     |
+----------------------+-------+
1 row in set (0.00 sec)

(1)為0時,表示在MySql資料庫關閉時,InnoDB需要完成所有的full purge和merge insert buffer,並且將所有的髒頁重新整理回磁碟。這需要一些時間,有時甚至需要幾個小時來完成。如果在進行InnoDB升級時,必須將這個引數設定為0,然後再關閉資料庫。
(2)1是引數 innodb_fast_shutdown的預設值,表示不需要完成上述的full purge和merge insert buffer操作,但是在緩衝池中的一些資料髒頁還是會重新整理回磁碟。
(3)2表示不完成full purge和merge insert buffer操作,也不將緩衝池中的資料髒頁寫回磁碟,而是將日誌都寫入日誌檔案。這樣不會有任何事務的丟失,但是下次MySql資料庫啟動時,會進行恢復操作。

當正常關閉MySql資料庫時,下次的啟動應該會非常正常。但是如果沒有正常地關閉資料庫,如用kill命令關閉資料庫,在MySql資料庫執行中重啟了伺服器,或者在關閉資料庫時,將引數innodb_fast_shutdown設定為了2,下次MySql資料庫啟動時都會對InnoDB儲存引擎的表進行恢復操作。

引數innodb_force_recovery影響了整個InnoDB儲存引擎恢復的狀態。該引數預設值為0,表示當發生需要恢復時,進行所有的恢復操作,當不能進行有效恢復時,如資料頁發生了corruption,MySql資料庫可能發生當機(crash),並把錯誤寫入錯誤日誌中去。

mysql> show variables like 'innodb_force_recovery';
+-----------------------+-------+
| Variable_name         | Value |
+-----------------------+-------+
| innodb_force_recovery | 0     |
+-----------------------+-------+
1 row in set (0.00 sec)

某些情況下,可能並不需要進行完整的恢復操作,因為使用者自己知道怎麼進行恢復。比如在對一個表進行alter table操作時發生了意外,資料庫重啟時會對InnoDB表進行回滾操作,對於一個大表來說這需要很長時間,可能是幾個小時。這時使用者可以自行進行恢復,如可以把表刪除,從備份中重新匯入資料到表,可能這些操作的速度要遠遠快於回滾操作。

引數innodb_force_recovery還可以設定為6個非零值:1-6,大的數字表示包含了前面所有小數字表示的影響。具體情況如下:
1:忽略檢查到的corrupt頁。
2:阻止Master Thread執行緒的執行,如Master Thread執行緒需要進行full purge,而這會導致crash。
3:不進行事務的回滾操作。
4:不進行插入緩衝的合併操作。
5:不檢視撤銷日誌(Undo Log),InnoDB儲存引擎會將未提交的事務視為已提交。
6:不進行前滾的操作。

引數innodb_force_recovery的值大於0時,可以對錶進行select,creaete和drop操作,但是insert,update和delete這類DML操作是不允許的。

相關文章