一、什么是binlog
binlog
是一個二進制格式的文件,用於記錄用戶對數據庫 更新的SQL語句 信息,例如更改數據庫表和更改內容的SQL語句都會記錄到binlog里,但是對庫表等內容的查詢不會記錄。
默認情況下,binlog
日志是二進制格式的,不能使用查看文本工具的命令(比如,cat,vi等)查看,而使用mysqlbinlog
解析查看。
二、binlog 的作用
用於數據庫的主從復制及數據的增量恢復。
三、binlog 三種模式
3.1 Row Level 模式(RBR)
不記錄每條sql語句的上下文信息,只需記錄哪條數據被修改了,修改成什么樣了。
優點:
* 准確性強,能准確復制數據的變更
* 減少數據庫鎖的使用
缺點:
* 會產生大量的日志,導致較大的網絡IO和磁盤IO
* 要求主從數據庫表結構完全一致
* 無法在從數據庫上單獨執行觸發器
3.2 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 模式,在執行復制時需要更多的行鎖
3.3 MIXED模式(MBR)
以上兩種模式的混合使用,一般的復制使用 STATEMENT 模式保存 binlog,對於 STATEMENT 模式無法復制的操作使用 ROW 模式保存 binlog,MySQL會根據執行的 SQL 語句選擇日志保存方式。
優點:
准確性強,文件大小適中
缺點:
有可能發生主從不一致問題
3.4 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
功能默認是關閉的。
5.2 開啟 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)
5.3 查看 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
。
5.4 修改 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)
5.5 查看 binlog 文件
查看 statement
模式文件:
mysqlbinlog 文件名
查看 row
模式文件
mysqlbinlog -vv 文件名
5.6 刪除 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,表示不自動刪除.