1. 程式人生 > 其它 >MySQL Binlog解析

MySQL Binlog解析

binlog是一個二進位制格式的檔案,用於記錄使用者對資料庫更新的SQL語句資訊,例如更改資料庫表和更改內容的SQL語句都會記錄到binlog裡,但是對庫表等內容的查詢不會記錄。預設情況下,binlog日誌是二進位制格式的,不能使用檢視文字工具的命令(比如,cat,vi等)檢視,而使用mysqlbinlog解析檢視。

binlog 的作用

用於資料庫的主從複製及資料的增量恢復。

binlog 三種模式

Row Level 模式(RBR)

不記錄每條sql語句的上下文資訊,只需記錄哪條資料被修改了,修改成什麼樣了。 優點: * 準確性強,能準確複製資料的變更 * 減少資料庫鎖的使用 缺點: * 會產生大量的日誌,導致較大的網路IO和磁碟IO * 要求主從資料庫表結構完全一致 * 無法在從資料庫上單獨執行觸發器

Statement Level 模式(SBR)

每一條修改資料的 sql 都會記錄到 master 的 bin_log 中,slave 在複製的時候 sql 程序會解析成 master 端執行過的相同的 sql 在 slave 庫上再次執行。 優點: * 不需要記錄每一條sql語句和每一行的資料變化,減少了binlog日誌量,節約IO,提高效能 * 並不強制要求主從資料庫的表結構定義完全相同 缺點: * 在某些情況下會導致 master-slave 中的資料不一致(如sleep()函式, last_insert_id(),以及user-defined functions(udf)等會出現問題) * 相比於 RBR 模式,在執行復制時需要更多的行鎖

MIXED模式(MBR)

以上兩種模式的混合使用,一般的複製使用 STATEMENT 模式儲存 binlog,對於 STATEMENT 模式無法複製的操作使用 ROW 模式儲存 binlog,MySQL會根據執行的 SQL 語句選擇日誌儲存方式。 優點: 準確性強,檔案大小適中 缺點: 有可能發生主從不一致問題

binlog模式的選擇

1. 不用儲存過程、觸發器、函式,選擇預設的 Statement level 2. 用到MySQL的特殊功能(儲存過程、觸發器、函式)選擇Mixed模式 3. 用到MySQL的特殊功能(儲存過程、觸發器、函式),又希望資料最大化一直則選擇Row模式

binlog 常用引數

引數名 含義
log_bin = {on | off | base_name} 指定是否啟用記錄二進位制日誌或者指定一個日誌路徑
sql_log_bin ={ on | off } 指定是否啟用記錄二進位制日誌
expire_logs_days 指定自動刪除二進位制日誌的時間,即日誌過期時間
log_bin_index 指定mysql-bin.index檔案的路徑
binlog_format = { mixed | row | statement } 指定二進位制日誌基於什麼模式記錄
max_binlog_size 指定二進位制日誌檔案最大值
binlog_cache_size 指定事務日誌快取區大小
max_binlog_cache_size 指定二進位制日誌快取最大大小
sync_binlog = { 0 | n } 指定寫緩衝多少次,刷一次盤

配置實踐

5.1 檢查 binlog 功能是否開啟

mysql> show variables like 'log_bin';
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| log_bin       | OFF   |
+---------------+-------+
1 row in set (0.00 sec)
可以看到binlog功能預設是關閉的。

開啟 binlog 功能

建立binlog存放路徑並賦權
[root@VM_0_15_centos log]# mkdir -p /var/log/mysql
[root@VM_0_15_centos log]# chown -R mysql.mysql /var/log/mysql
編輯my.cnf配置檔案
[root@VM_0_15_centos log]# vim /etc/my.cnf
在[mysqld]標籤下編輯如下內容:
# binlog 存放路徑
log_bin=/var/log/mysql/mysql-bin
# 服務Id,保持唯一
server_id=1
重啟 MySQL 服務
[root@VM_0_15_centos log]# systemctl restart mysqld
重新檢查是否開啟日誌功能
mysql> show variables like 'log_bin';
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| log_bin       | ON    |
+---------------+-------+
1 row in set (0.00 sec)

檢視 binlog 模式

mysql> show variables like '%binlog_format%';
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| binlog_format | ROW   |
+---------------+-------+
1 row in set (0.00 sec)
可以看到MySQL 5.7版本預設binlog模式是ROW。

修改 binlog 模式

編輯my.cnf配置檔案
[root@VM_0_15_centos log]# vim /etc/my.cnf
在[mysqld]標籤下編輯如下內容:
binlog_format=mixed
重啟服務
[root@VM_0_15_centos log]# systemctl restart mysqld
檢視binlog模式
mysql> show variables like '%binlog_format%';
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| binlog_format | MIXED |
+---------------+-------+
1 row in set (0.00 sec)

檢視 binlog 檔案

檢視statement模式檔案:
mysqlbinlog 檔名
檢視row模式檔案
mysqlbinlog -vv 檔名

刪除 binlog 檔案

方法一:
reset master
注:此命令將會刪除所有日誌,並讓日誌檔案重新從000001開始。 方法二:
PURGE { BINARY | MASTER } LOGS { TO 'log_name' | BEFORE datetime_expr }
例項:
purge master logs to "binlog_name.00000X"
將會清空00000X之前的所有日誌檔案. 方法三:修改my.cnf配置
expire_logs_days = 3 #保留最近3天的binlog;預設值是0,表示不自動刪除.