一. innodb_flush_log_at_trx_commit 這個參數名稱有個log,一看就是與日誌有關。是指:用來控制緩衝區(log buffer)中的數據寫入到日誌文件(log file),以及日誌文件數據刷新到磁碟(flush)的操作時機。對這個參數的設置值,可以對資料庫在性能與數據安全 ...
一. innodb_flush_log_at_trx_commit
這個參數名稱有個log,一看就是與日誌有關。是指:用來控制緩衝區(log buffer)中的數據寫入到日誌文件(log file),以及日誌文件數據刷新到磁碟(flush)的操作時機。對這個參數的設置值,可以對資料庫在性能與數據安全之間,進行折中。
參數值解釋:
當參數是0:日誌緩衝數據會,每秒一次地寫入到日誌文件,並且把日誌文件刷新到磁碟操作。該模式下在事務提交的時候,不會主動觸發寫入磁碟的操作。
當參數是1:每次事務提交時,日誌緩衝被寫到日誌文件,並且對日誌文件做磁碟刷新操作,該模式為系統預設。但由於每次事務都需要進行磁碟I/O,所以也最慢。
當參數是2:每次事務提交時,日誌緩衝被寫到日誌文件,但不對日誌文件做磁碟刷新操作。對日誌文件每秒執行一次,刷到磁碟操作。
當設置innodb_flush_log_at_trx_commit=1時, 是預設值,也是最安全的設置,但是在這種模式下性能有一定的損失。 如果設置成0或者2 性能會有所改善,但有數據丟失的風險。
設置成0則資料庫崩潰的時候,那些沒有被寫入日誌文件的事務丟失,最多丟失1秒鐘的事務,是最不安全的,但也是效率最高的。
設置成2則只是沒有刷新到磁碟,但已經寫入日誌文件,所以只要操作系統沒有崩潰, 那麼並沒有數據丟失, 比設置成0更安全。
在mysql官方中, 為了確保事務的持久性和複製設置的一致性,都是建議將這個參數值設置為1。對於一些數據一致性和完整性要求不高的應用,配置為 2 就足夠了;如果為了最高性能,可以設置為 0。有些應用,如支付服務,對一致性和完整性要求很高,所以即使最慢,也最好設置為 1。
參數值 |
數據安全性 |
I/O性能 |
0 |
安全最差。當資料庫崩潰,有丟失1秒鐘的事務風險 |
最優 |
1 |
安全最好。無丟失數據 |
最差 |
2 |
安全折中。當操作系統崩潰, 有丟失1秒鐘的事務風險 |
折中 |
1.1 查看日誌提交方式
SHOW VARIABLES LIKE 'innodb_flush_log_at_trx_commit';
1.2 修改參數值
還是一樣找到my.cnf, 修改參數值
[root@xuegod64 ~]# cd /etc
[root@xuegod64 etc]# vim my.cnf
[root@xuegod64 ~]# systemctl stop mysqld.service
[root@xuegod64 ~]# systemctl start mysqld.service
-- 再次查看 SHOW VARIABLES LIKE 'innodb_flush_log_at_trx_commit';
二. sync_binlog
這個參數是對於MySQL系統來說是至關重要的,他不僅影響到Binlog對MySQL所帶來的性能損耗,而且還影響到MySQL中數據的完整性。在MySQL中系統預設的設置是sync_binlog=1。對於“sync_binlog”參數的各種設置的說明如下:
sync_binlog=0:當事務提交之後,不主動刷新二進位日誌文件的數據到磁碟上,而是由操作系統決定。
sync_binlog=n:每向二進位日誌文件寫入N條SQL或N個事務後,則把二進位日誌文件的數據刷新到磁碟上。
而當設置為“1”的時候,是最安全但是性能損耗最大的設置。因為當設置為1的時候,即使系統Crash,也最多丟失binlog_cache中未完成的一個事務,對實際數據沒有任何實質性影響。|
-- 查看binlog寫入方式 SHOW VARIABLES LIKE 'sync_binlog';
總結: 在數據安全與性能以日誌文件作為出發點時,我認為功能上與sql server 的數據恢復模式比較相像,但實現的思路是不一樣的。
innodb_flush_log_at_trx_commit和sync_binlog是MySQL innodb引擎的兩個重要的參數,其中innodb_flush_log_at_trx_commit是將事務日誌從innodb log buffer刷新到磁碟,sync_binlog是將二進位日誌文件刷新到磁碟上。
innodb_flush_log_at_trx_commit和sync_binlog 兩個參數是控制MySQL 磁碟寫入策略以及數據安全性的關鍵參數,當兩個參數都設置為1的時候寫入性能最差,
網上也有說將innodb_flush_log_at_trx_commit=2,sync_binlog=500 或1000。有說對於高併發事務的系統來說,“sync_binlog”設置為0和設置為1的系統寫入性能差距可能高達5倍甚至更多。總體上還是要根據業務來判斷,在性能和安全上做個選擇。