MySQL Binlog解析
阿新 • • 發佈:2021-11-30
binlog是一個二進位制格式的檔案,用於記錄使用者對資料庫更新的SQL語句資訊,例如更改資料庫表和更改內容的SQL語句都會記錄到binlog裡,但是對庫表等內容的查詢不會記錄。預設情況下,binlog日誌是二進位制格式的,不能使用檢視文字工具的命令(比如,cat,vi等)檢視,而使用mysqlbinlog解析檢視。
以上兩種模式的混合使用,一般的複製使用 STATEMENT 模式儲存 binlog,對於 STATEMENT 模式無法複製的操作使用 ROW 模式儲存 binlog,MySQL會根據執行的 SQL 語句選擇日誌儲存方式。
優點:
準確性強,檔案大小適中
缺點:
有可能發生主從不一致問題
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)
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,表示不自動刪除.