MySQL二進制文件(binlog)


二進制文件(binlog)記錄對MySQL數據庫執行更改的所有操作,但不包括SELECT和SHOW這類操作,因為這類操作沒有改變數據。

為什么會有binlog?

首先 binlog 是 Server 層的日志模塊,最初設計來是為了歸檔(備份)使用的。經過多個版本的發展,現在 binlog 主要有三個作用:

  • 恢復:提供 point-in-time 的恢復功能。通過全備+binlog,可實現恢復到指定時間的數據庫數據。
  • 復制:主備復制(同步)的基礎模塊,主庫寫 binlog,再發送給備庫執行,實現主備數據一致性。
  • 審計:用戶可以通過二進制日志中的信息來進行審計,判斷是否有對數據庫進行注入的攻擊。

如何記錄

下面以一條Update語句來介紹 binlog 是如何記錄的。

mysql> update T set c=c+1 where ID=2;

update語句執行流程圖

  1. 取得 ID=2 這一行(通過內存或磁盤讀取)
  2. 這行的 c 值加1
  3. 更新到內存
  4. 寫入 redo log(處於 prepare 階段)
  5. 寫 binlog
  6. 提交事務(處於 commit 狀態)

這里涉及兩階段提交和 redo log 的內容,感興趣的移步到此處

binlog 的寫入時機是在數據更改后,事務提交前。

三種寫入格式

binlog_format=STATEMENT

binlog 記錄邏輯SQL語句。

當執行以下命令:

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 記錄的內容如下圖所示:

image

優點:省空間:只記錄邏輯語句。

缺點:可能產生主備不一致。

mysql> delete from t /*comment*/ where a>=4 and t_modified<='2018-11-10' limit 1;

上面的SQL,假如在主庫使用索引 a,而備庫使用索引 t_modified 會導致刪除的記錄不一樣。

binlog_format=ROW

binlog 記錄表的行更改情況。配合 READ COMMITED,獲得更好的並發性。

查看 binlog 內容:mysql> show binlog events in 'master.000001';(其中'master.000001'是binlog的文件名)

image

解析 binlog 內容:使用 mysqlbinlog 命名解析 binlog 內容。

liang24@ubuntu:~$ mysqlbinlog -vv data/master.000001 --start-position=8900;

image

優點:記錄原始數據;保證主備一致性;

缺點:

1、費空間:因為要保存原始數據;

例如:刪除十萬行數據,STATEMENT 格式只記錄邏輯語句,而 ROW 會記錄十萬條日志,相當費空間。

2、費IO

例如:刪除十萬行數據,ROW 會記錄十萬條日志,而寫 binlog 會耗費一定的 IO。

推薦使用 binlog_format=ROW:能記錄原記錄數據。誤操作時,能夠根據原數據進行恢復,例如 Delete 就轉寫成 Insert,Update 就把 Update 前的再執行一次。

binlog_format=MIXED

因為 STATEMENT 和 ROW 各有優缺點,因此 MySQL 新增了一種格式 MIXED,采用折中方案,MySQL 會判斷采用 STATEMENT 還是 ROW 來記錄 binlog。

如何使用

1、查看是否開啟

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。

2、開啟 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

3、重啟 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)

參考資料


免責聲明!

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



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