MySQL之binlog日志


一、什么是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,表示不自動刪除.


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM