二進制文件(binlog)記錄對MySQL數據庫執行更改的全部操做,但不包括SELECT和SHOW這類操做,由於這類操做沒有改變數據。mysql
首先 binlog 是 Server 層的日誌模塊,最初設計來是爲了歸檔(備份)使用的。通過多個版本的發展,如今 binlog 主要有三個做用:sql
下面以一條Update語句來介紹 binlog 是如何記錄的。shell
mysql> update T set c=c+1 where ID=2;
這裏涉及兩階段提交和 redo log 的內容,感興趣的移步到此處。數據庫
binlog 的寫入時機是在數據更改後,事務提交前。ubuntu
binlog 記錄邏輯SQL語句。vim
當執行如下命令:併發
mysql> delete from t /*comment*/ where a>=4 and t_modified<='2018-11-10' limit 1; mysql> show binlog events in 'master.000001';
其中'master.000001'是binlog的文件名。編輯器
binlog 記錄的內容以下圖所示:設計
優勢:省空間:只記錄邏輯語句。rest
缺點:可能產生主備不一致。
mysql> delete from t /*comment*/ where a>=4 and t_modified<='2018-11-10' limit 1;
上面的SQL,假如在主庫使用索引 a,而備庫使用索引 t_modified 會致使刪除的記錄不同。
binlog 記錄表的行更改狀況。配合 READ COMMITED,得到更好的併發性。
查看 binlog 內容:mysql> show binlog events in 'master.000001';
(其中'master.000001'是binlog的文件名)
解析 binlog 內容:使用 mysqlbinlog 命名解析 binlog 內容。
liang24@ubuntu:~$ mysqlbinlog -vv data/master.000001 --start-position=8900;
優勢:記錄原始數據;保證主備一致性;
缺點:
一、費空間:由於要保存原始數據;
例如:刪除十萬行數據,STATEMENT 格式只記錄邏輯語句,而 ROW 會記錄十萬條日誌,至關費空間。
二、費IO
例如:刪除十萬行數據,ROW 會記錄十萬條日誌,而寫 binlog 會耗費必定的 IO。
推薦使用 binlog_format=ROW:能記錄原記錄數據。誤操做時,可以根據原數據進行恢復,例如 Delete 就轉寫成 Insert,Update 就把 Update 前的再執行一次。
由於 STATEMENT 和 ROW 各有優缺點,所以 MySQL 新增了一種格式 MIXED,採用折中方案,MySQL 會判斷採用 STATEMENT 仍是 ROW 來記錄 binlog。
一、查看是否開啓
mysql 默認是不開啓 binlog 的。
mysql> show variables like 'log_bin%'; +---------------------------------+-------+ | Variable_name | Value | +---------------------------------+-------+ | log_bin | OFF | | log_bin_basename | | | log_bin_index | | | log_bin_trust_function_creators | OFF | | log_bin_use_v1_row_events | OFF | +---------------------------------+-------+ 5 rows in set (0.00 sec)
從結果看到 log_bin=OFF
,知道沒有開啓 binlog。
二、開啓 binlog 日誌
退出 MySQL,使用 vi 編輯器修改 MySQL 的 my.cnf 配置文件(vim /etc/my.cnf)
# server-id:表示節點名稱 server-id=1 # log-bin:表示存儲binlog日誌的目錄和binlog的文件名 log-bin=/var/lib/mysql/mysql-bin
三、重啓 MySQL 及查看 binlog 開啓狀態
service mysql restart
登陸 MySQL,輸入 show variables like '%log_bin%';
查看到 binlog=ON ;
mysql> show variables like 'log_bin%'; +---------------------------------+--------------------------------+ | Variable_name | Value | +---------------------------------+--------------------------------+ | log_bin | ON | | log_bin_basename | /var/lib/mysql/mysql-bin | | log_bin_index | /var/lib/mysql/mysql-bin.index | | log_bin_trust_function_creators | OFF | | log_bin_use_v1_row_events | OFF | +---------------------------------+--------------------------------+ 5 rows in set (0.00 sec)