控制 mysql 磁碟寫入策略 以及 資料安全性 的兩個關鍵引數:innodb_flush_log_at_trx_commit和sync_binlog
引數:innodb_flush_log_at_trx_commit
①如果設定為0,log buffer將每秒一次地寫入log file中,並且同時進行log file的flush(重新整理到磁碟中)操作。此模式下,在事務提交時,不主動觸發寫入磁碟的操作;
②如果設定為1,此模式下,在每次事務提交時,mysql都會把log buffer的資料寫入log file中,並且同時進行log file的flush(重新整理到磁碟中)操作;
③如果設定為2,此模式下,在每次事務提交時,mysql都會把log buffer的資料寫入log file中,但是不會同時進行log file的flush(重新整理到磁碟中)操作,會每秒執行一次log file的flush(重新整理到磁碟中)操作。
注意:由於程序排程策略問題,不能保證"每秒執行一次flush(重新整理到磁碟中)操作"100%的"每一秒執行一次"。
引數:sync_binlog
①如果設定n=0,像作業系統重新整理其他檔案的機制一樣,mysql不會同步到磁碟中去,而是依賴作業系統來重新整理binary log。
②如果設定n>0,mysql在每寫n次二進位制日誌binary log時,會呼叫fdatasync()函式將二進位制日誌binary log同步到磁碟中去。
注意:如果啟用了autocommit,那麼每乙個語句statement就會有一次寫操作;否則每個事務對應乙個寫操作。
如圖:
效能:
①測試場景1:
innodb_flush_log_at_trx_commit=2sync_binlog=1000②測試場景2:
innodb_flush_log_at_trx_commit=1sync_binlog=1000③測試場景3:
innodb_flush_log_at_trx_commit=1sync_binlog=1④測試場景4:
innodb_flush_log_at_trx_commit=1sync_binlog=1000⑤測試場景5:
innodb_flush_log_at_trx_commit=2sync_binlog=1000innodb_flush_log_at_trx_commit
sync_binlog
tps
1000
241000
1000
13300011
26000
1000
133000
由此可見:
ⅰ、當innodb_flush_log_at_trx_commit=1和sync_binlog=1時,寫入操作效能最差;
ⅱ、當innodb_flush_log_at_trx_commit=2和sync_binlog=2時,寫入操作達到最高效能;
安全:
①當innodb_flush_log_at_trx_commit設定為0時,mysqld程序崩潰會導致上一秒所有事務資料丟失。
②當innodb_flush_log_at_trx_commit和sync_binlog都為1時最為安全,mysqld程序崩潰或者伺服器crash的情況下,binary log只有可能最多丟失乙個事務。
③當innodb_flush_log_at_trx_commit設定為2時,只有在伺服器崩潰或斷電情況下,上一秒所有事務資料才可能丟失。
MySQL匯入SQL檔案過大或連線超時的解決辦法
連線超時,匯入的sql檔案過大解決辦法 set global max allowed packet 100000000 set global net buffer length 100000 set global interactive timeout 28800000 set global wai...
mysql匯入sql檔案過大或連線超時的解決辦法
set global max allowed packet 100 000 000 set global net buffer length 100000 set global interactive timeout 28800 000 set global wait timeout 2880000...
Mysql匯入過大sql檔案過慢問題解決
首先需要改動下mysql的配置,這個也是我自己在網上找的,我感覺網上的比較亂,所以自己就整理了一下,也是對自己遇到問題的乙個記錄吧!1.改動mysql配置的語句 然後執行之後重新啟動mysql服務。2.然後採用dos命令列的方法執行sql檔案,先進入mysql執行環境,選擇資料庫 我的資料庫已經在電...