1. 程式人生 > >關的快還是開的快?細數innodb_fast_shutdown和innodb_force_recovery的優與劣(更新中)

關的快還是開的快?細數innodb_fast_shutdown和innodb_force_recovery的優與劣(更新中)

MySQL在啟動的時候,會進行前滾(利用redo log實現)和回滾(利用undo log和bin log實現)事物,來保證與前一次資料庫服務關閉前的資料版本的最終一致性。

Crash Recovery的過程,可查閱參考文件一。

我們知道,不同的落盤機制影響著redo、undo、binlog以及資料本身的重新整理策略。

1、Redo log

innodb_log_buffer_size控制著redo log的緩衝池大小,執行緒:master therad、引數:innodb_flush_log_at_trx_commit、以及快取池的剩餘容量觸發(1/2大小)同時控制著redo log落盤的頻率

2、Undo log

每做一次記錄的修改操作,都會伴隨著undo log的產生,修改操作所在的事物提交後,如果undo log不再被其他事物引用,就會被purge掉(正常情況下,會定期刪除那些標記為刪除並且不再被MVCC或rollback需要的undo頁)。

注:insert操作的undo可以在所在事物提交後立即刪除。相反,update和delete則仍然需要在一段時間內儲存undo

3、binlog

sync_binlog,innodb_flush_log_at_trx_commit 控制著事物提交是如何影響binlog落盤的。

而innodb_support_xa同時限制著redo log和binlog。

4、Data

BP中髒頁的重新整理,在關閉時,由innodb_fast_shutdown控制。

innodb_fast_shutdown決定了InnoDB在關閉時需要做那些事情,可選取值:0、1、2

0、對所有undo頁進行purge(資料庫重啟意味著所有的undo頁都變為無用的了),對change buffer進行merge,重新整理BP中的髒頁。稱之為“slow shutdown”或者“clean shutdown”,可能會耗費幾分鐘,甚至幾小時。在進行MySQL大版本升降級時,需要如此設定。

1、預設值。在=0的操作的基礎上,跳過那些一定要flush的操作(certain flush operations)僅重新整理髒頁,稱之為“fast shutdown”。

2、不重新整理BP中的髒頁到磁碟上,僅重新整理redo log buffer之後就直接shutdown,就好似MySQL是crash掉的。(下次重啟時將會耗時在crash recovery的過程中)。一般用於緊急情況下,需要儘快關機的情況。

由於模式0在資料庫重啟時,不需要做crash recovery,所以啟動速度是最快的;而模式1需要做少量的crash recovery,速度適中;反觀模式2,則要耗費大量的時間在這個過程上。

總結如下:

取值 purge all merge change buffer flush dirty pages
0
1 × ×
2 × × 僅flush redo log buffer

innodb_force_recovery決定了InnoDB在開啟時需要做那些事情,可選取值:0~6。預設0

參考文件: