背景
innodb_flush_log_at_trx_commit 這個參數可以說是InnoDB裡面最重要的參數之一,它控制了重做日志(redo log)的寫盤和落盤策略。 具體的參數意義見手冊
簡單說來,可選值的安全性從0->2->1遞增,分別對應於mysqld 進程crash可能丟失 -> OS crash可能丟失 -> 事務安全。
以上是路人皆知的故事,並且似乎板上釘釘,無可八卦。
innodb_use_global_flush_log_at_trx_commit
直到2010年的某一天,Percona的CTO Vadim同學覺得這種一刀切的風格不夠靈活,最好把這個變量設置成session級別,每個session自己控制。
但同時爲了保持Super權限對提交行爲的控制,同時增加了innodb_use_global_flush_log_at_trx_commit參數。 這兩個參數的配合邏輯爲:
1、若innodb_use_global_flush_log_at_trx_commit爲OFF,則使用session.innodb_flush_log_at_trx_commit;
2、若innodb_use_global_flush_log_at_trx_commit爲ON,則使用global .innodb_flush_log_at_trx_commit(此時session中仍能設置,但無效)
3、每個session新建時,以當前的global.innodb_flush_log_at_trx_commit 爲默認值。
業務應用
這個特性可以用在一些對表的重要性做等級定義的場景。比如同一個實例下,某些表數據有外部數據備份,或允許丟失部分事務的情況,對這些表的更新,可以設置 Session.innodb_flush_log_at_trx_commit爲非1值。
在阿裡雲RDS服務中,我們對數據可靠性和可用性要求更高,將 innodb_use_global_flush_log_at_trx_commit設置爲ON,因此修改session.innodb_flush_log_at_trx_commit也沒有作用,統一使用 global.innodb_flush_log_at_trx_commit = 1。