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,表示不自動刪除.