首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫

MySQL innodb_flush_log_at_trx_commit 參數深度解析:0/1/2 三值差異與數據安全權衡

     編輯:MySQL 資料庫相關知識

參數定義

Command-Line: --innodb_flush_log_at_trx_commit[=#]
Config-File: innodb_flush_log_at_trx_commit
Scope: Global | Dynamic: Yes | Type: numeric
Default: 1 | Valid: 0, 1, 2

三值行為對比

值Log Buffer 寫入 Log FileFlush 到磁盤事務提交時動作數據安全性性能
0每秒 1 次每秒 1 次無動作mysqld 崩潰丟失 1 秒事務最快
1(默認)每次提交每次提交寫入 + FlushACID 完全合規最慢
2每次提交每秒 1 次寫入(不 Flush)僅 OS 崩潰/斷電丟失 1 秒折中
註:每秒 Flush 非 100% 保證,受進程調度影響。

ACID 與崩潰恢復

  • 1 為 ACID 合規必要值
  • InnoDB Crash Recovery 利用 Redo Log 恢復,不受此參數影響:參數只影響「提交時是否持久化」,恢復時按 Log File 內容恢復多少

主從復制建議

為達最大持久性與一致性,Master my.cnf 同時設置:

innodb_flush_log_at_trx_commit = 1
sync_binlog = 1

sync_binlog 參數補充

值行為
0(默認)依賴 OS 刷盤,不主動同步
1每次事務/語句提交 fdatasync() 強制刷盤,最安全最慢
N>1每 N 次寫入同步一次

帶電池備援的 RAID 卡/磁盤緩存可大幅降低 sync_binlog=1 的性能損耗。

硬件層面的「偽 Flush」風險

  • 許多 OS/磁盤控制器回報「已刷盤」實際未寫入物理介質
  • 即使 innodb_flush_log_at_trx_commit=1 也可能丟數據
  • 對策:電池備援磁盤緩存、hdparm 關閉寫緩存、廠商專用工具

fdatasync() vs fsync()

fdatasync():僅刷數據緩衝區,不更新元數據(如 atime),比 fsync() 輕量
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved