mysql binlog日志優化及思路
在數據庫安裝完畢,對於binlog日志參數設置,有一些參數的調整,來滿足業務需求或使性能最大化。Mysql日志主要對io性能產生影響,本次主要關注binlog 日志。
查一下二進制日志相關的參數
mysql> show variables like '%binlog%';
+--------------------------------+----------------------+
| Variable_name | Value |
+--------------------------------+----------------------+
| binlog_cache_size | 1048576 |
| innodb_locks_unsafe_for_binlog | OFF |
| max_binlog_cache_size | 18446744073709547520 |
| max_binlog_size | 1073741824 |
| sync_binlog | 0 |
+--------------------------------+----------------------+
5 rows in set (0.14 sec)
www.2cto.com
其中innodb_locks_unsafe_for_binlog 參數是innodb存儲引擎特有的與binlog相關的參數,默認是關閉的
Binlog_cache_size:默認大小是37268即32K.我們計算一下上面binlog_cache_size參數大小,1048576/1024/1024 = 1M,根據事務需要調整大小。次參數表示在事務中容納二進制日志sql語句的緩存大小。那麼怎麼理解二進制日志緩存,就是服務器支持事務存儲引擎並且服務器啟用了二進制日志(-log-bin選項)的前提下為每個客戶端分配的內存,是每個client都可以分配設置大小的binlog cache空間。我們可以通過以下兩個狀態變量判斷binlog_cache_size的使用情況:
1 binlog_cache_use: Thenumber of transactions that used the temporary binary log cache.(使用二進制日志緩存的事務的數量)
www.2cto.com
2 Binlog_cache_disk_use: The number oftransactions that used the binary log cache but that exceeded the value of binlog_cache_size andused a temporary file to store changes from the transaction.
使用二進制日志緩存並且值達到了binlog_cache_size設置的值,用臨時文件存儲來自事務的變化這樣的事務數量
Max_binlog_cache_size: 默認值是18446744073709547520,這個值很大,夠我們使用的了。此參數和binlog_cache_size相對應,代表binlog所能使用的cache最大使用大小。如果系統中事務過多,而此參數值設置有小,則會報錯。
Max_binlog_size: 1073741824=1G binlog的最大值,一般設置為512M或1G,一般不能超過1G。此參數不能非常嚴格控制binlog的大小,特別是在遇到大事務時,而binlog日志又到達了尾部,為了保證事務完整性,不切換日志,把所有sql都寫到當前日志。這根oracle redo日志有點不一樣(感興趣的可以google)。Mysql記錄的是mysql數據庫邏輯變化信息,稱之為event,實際上就是引起數據庫變化的query語句。
Sync_binlog: 參數不僅影響數據庫的性能,而且還影響數據庫數據的完整性。Sync_binlog參數選項有如下選擇
www.2cto.com
1 Sync_binlog=0,這意味著當事務提交之後,mysql不做fsync(文件系統同步)之類的磁盤同步指令刷新binlog_cache中的信息到磁盤,而讓filesystem自行決定什麼時候來做同步,或者cache滿了之後才同步到磁盤。
2 sync_binlog=n,當每進行n次提交之後,mysql將進行一次fsync之類的磁盤同步指令來將binlog_cache中的數據強制寫入磁盤。
Sync_binlog=0,這是數據庫默認設置,性能也是最好的,也是最危險的。一旦系統crash,在binlog_cache中的所有binlog信息都會被丟失。當synn_binlog=1的時候,是最安全性能消耗也最大,完成一個事務,同步一次。系統crash了,也只是丟掉了未完成的事務信息。沒坐過這方面的測試,設置為1和0在性能方面的差距,有做過的說在高並發系統中,兩種設置性能可高達5倍甚至更多。
這需要我們來做出選擇,是要性能最好,還是最安全。
資料:《mysql性能調優與架構設計》
www.2cto.com
http://dev.mysql.com/doc/refman/5.0/en/server-status-variables.html
http://dev.mysql.com/doc/refman/5.5/en/server-system-variables.html
作者 aeolus_pu