binlog介紹
binlog是MySQL數據庫的二進制日誌,用於記錄用戶對數據庫操作的SQL語句(除了數據查詢語句)信息,可用於主從複製和數據恢復,可使用mysqlbin命令查看二進制日誌的內容。
binlog格式
binlog的格式也有三種:STATEMENT、ROW、MIXED 。
1、STATMENT模式:基於SQL語句的複製(statement-based replication, SBR),每一條會修改數據的sql語句會記錄到binlog中。
優點:不需要記錄每一條SQL語句與每行的數據變化,這樣子binlog的日誌也會比較少,減少了磁盤IO,提高性能。
缺點:在某些情況下會導致master-slave中的數據不一致(如sleep()函數, last_insert_id(),以及user-defined functions(udf)等會出現問題)
2、基於行的複製(row-based replication, RBR):不記錄每一條SQL語句的上下文信息,僅需記錄哪條數據被修改了,修改成了什麼樣子了。
優點:不會出現某些特定情況下的存儲過程、或function、或trigger的調用和觸發無法被正確複製的問題。
缺點:會產生大量的日誌,尤其是alter table的時候會讓日誌暴漲。
3、混合模式複製(mixed-based replication, MBR):以上兩種模式的混合使用,一般的複製使用STATEMENT模式保存binlog,對於STATEMENT模式無法複製的操作使用ROW模式保存binlog,MySQL會根據執行的SQL語句選擇日誌保存方式。
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 } | 指定寫緩衝多少次,刷一次盤 |
開啓binlog
1)檢查狀態
log_bin 爲 off 說明未開啓
show variables like 'log_%';
+----------------------------------------+--------------------------------------------+
| Variable_name | Value |
+----------------------------------------+--------------------------------------------+
| log_bin | OFF |
2)配置binlog
修改my.ini配置文件
# 配置binlog文件路徑
log_bin = D:\Program Files\MySql_Bin\mysql-bin
# 配置模式
binlog_format = statement
# 配置文件大小
max_binlog_size = 100m
# 配置過期時間
expire_logs_days = 30
3)重新啓動服務
log_bin 爲 on 說明開啓
mysql> show variables like 'log_%';
+----------------------------------------+--------------------------------------------+
| Variable_name | Value |
+----------------------------------------+--------------------------------------------+
| log_bin | ON |
| log_bin_basename | D:\Program Files\MySql_Bin\mysql-bin |
| log_bin_index | D:\Program Files\MySql_Bin\mysql-bin.index |
4)查看文件
D:\Program Files\MySql_Bin 的目錄 ..
2020/02/03 16:12 120 mysql-bin.000001
2020/02/03 16:12 44 mysql-bin.index
5)查看內容
方式1
mysql> show binlog events in "mysql-bin.000001" ;
方式2
利用mysqlbinlog.exe命令
C:\Program Files\MySQL\MySQL Server 5.6\bin>mysqlbinlog.exe
查看命令參數
C:\Program Files\MySQL\MySQL Server 5.6\bin>mysqlbinlog.exe --help
查看所有內容日誌
C:\Program Files\MySQL\MySQL Server 5.6\bin>mysqlbinlog.exe --database=sharding E:\MySql_Bin\mysql-bin.000001
查看指定數據庫指定時間段的日誌
C:\Program Files\MySQL\MySQL Server 5.6\bin>mysqlbinlog.exe --start-datetime="2020-02-03 16:35:01" --stop-datetime="2020-02-03 16:39:01" --database=sharding E:\MySql_Bin\mysql-bin.000001