mysql 參數 innodb_flush_log_at_trx_commit


問題,項目後臺有一個定時任務,需要跑一批數據,跑完後存入到一個表裏,用來做信息查詢,數據大,邏輯複雜,耗時,多線程處理數據?


解答:以爲程序的問題,把所有的關鍵點步驟都加上了日誌,拿開發環境的日誌看,一點沒毛病,後來排查到Mysql,是不是服務器掛了,通過命令來查看,確實沒有掛,是不是項目過載,也掛了,也沒有,最後想起來,mysql可能不是實時刷入磁盤的,所有像運維拿到了my.cnf配置文件,果然是一個參數問題。運維讓插入數據度快,innodb_flush_log_at_trx_commit 這個參數設置了2,後來查閱了資料,看到這些代表的意義。


innodb引擎。 


設置一個參數  innodb_flush_log_at_trx_commit = 2   插入速度立馬變快,提升了數十倍。  這個參數有什麼意義? 該參數取值可以是0,1,2


innodb_flush_log_at_trx_commit = 0,Innodb 中的Log Thread 沒隔1 秒鐘會將log buffer中的數據寫入到文件,同時還會通知文件系統進行文件同步的flush 操作,保證數據確實已經寫入到磁盤上面的物理文件。但是,每次事務的結束(commit 或者是rollback)並不會觸發Log Thread 將log buffer 中的數據寫入文件。所以,當設置爲0 的時候,當MySQL Crash 和OS Crash 或者主機斷電之後,最極端的情況是丟失1 秒時間的數據變更。



innodb_flush_log_at_trx_commit = 1,這也是Innodb 的默認設置。我們每次事務的結束都會觸發Log Thread 將log buffer 中的數據寫入文件並通知文件系統同步文件。這個設置是最安全的設置,能夠保證不論是MySQL Crash 還是OS Crash 或者是主機斷電都不會丟失任何已經提交的數據。



innodb_flush_log_at_trx_commit = 2,當我們設置爲2 的時候,Log Thread 會在我們每次事務結束的時候將數據寫入事務日誌,但是這裏的寫入僅僅是調用了文件系統的文件寫入操作。而我們的文件系統都是有緩存機制的,所以Log Thread 的這個寫入並不能保證內容真的已經寫入到物理磁盤上面完成持久化的動作。文件系統什麼時候會將緩存中的這個數據同步到物理磁盤文件Log Thread 就完全不知道了。所以,當設置爲2 的時候,MySQL Crash 並不會造成數據的丟失,但是OS Crash 或者是主機斷電後可能丟失的數據量就完全控制在文件系統上了。




發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章