Mysql二進制日誌緩存參數:
binlog_cache_size //事務緩存大小
binlog_cahce_use //事務緩存使用次數
binblog_cache_disk_use //事務緩存磁盤使用次數(內存緩存設置過小不夠用時)
binlog_stmt_cache_size //非事務語句緩存大小
binlog_stmt_cache_use //非事務語句緩存使用次數
binlog_stmt_cache_disk_use //非事務語句磁盤緩存使用次數
我們知道InnoDB存儲引擎是支持事務的。實現事務需要依賴日誌技術,爲了性能,日誌編碼採用二進制格式。
那麼,我們何時記錄日誌呢?有日誌的時候就直接寫入磁盤?但因爲磁盤的效率是很低的,如果你用過Nginx,一般Nginx輸出access log都是要緩衝輸出的。因此,記錄二進制日誌的時候,我們也需要考慮使用內存緩存。但由於緩存不是直接持久化,所以面臨着系統宕機時不能及時刷入磁盤的安全問題。因此,Cache需要權衡,既減少磁盤I/O,滿足性能的要求;又儘可能保證內存緩存中沒有殘留,及時的持久化,滿足安全要求。
參數 binlog_cache_size 就是用來控制它的,一個事務在沒有提交(uncommitted)的時候,產生的日誌,記錄到Cache中;等到事務提交(committed)需要提交的時候,則把日誌持久化到磁盤。需要注意的是:binlog_cache不是全局的,而是以SESSION爲單位獨享分配的,也就是說當一個線程開始一個事務的時候,Mysql就會爲這個SESSION分配一個binlog_cache。系統默認的 binlog_cache_size 只有32k。當我們提交一個長事務的時候,比如批量導入數據,而cache裏面放不下的時候,mysql就會把已經提交的事務記錄到一個臨時文件中,等提交時再刷入日誌,但臨時文件的性能明顯要比內存低。固其大小需要權衡,查看當前cache的大小使用:
mysql> show session variables like 'binlog_cache%';
+-------------------+----------+
| Variable_name | Value |
+-------------------+----------+
| binlog_cache_size | 67108864 |
+-------------------+----------+
1 row in set (0.00 sec)
查看全局cache大小:
mysql> show global variables like 'binlog_cache%';
+-------------------+----------+
| Variable_name | Value |
+-------------------+----------+
| binlog_cache_size | 67108864 |
+-------------------+----------+
1 row in set (0.00 sec)
查看配置文件:
grep 'binlog_cache' /etc/my.cnf
binlog_cache_size = 64M #系統默認配置大小
max_binlog_cache_size = 128M
max_binlog_size = 200
查看該值是否滿足需要:
show status like "binlog_%";
+-------------------------+-------------+
| Variable_name | Value |
+-------------------------+-------------+
| Binlog_cache_disk_use | 0 |
| Binlog_cache_use | 120402264 |
+-------------------------+-------------+
2 rows in set (0.00 sec)
binlog_cache_disk_use表示緩存超出時,使用磁盤臨時文件的次數,爲0表示沒使用過,所以當前cache size夠用。如果沒有長事務long_trascation的話,則表示該值偏大。
binlog_stmt_cache_size與binlog_cache_size類似,與之相對的是binlog_stmt_cache_disk_use。