【趙渝強老師】MySQL的binlog日誌檔案

赵渝强老师發表於2024-11-19

MySQL的binlog日誌檔案(也叫做:二進位制日誌)記錄了對MySQL資料庫執行更改的所有操作,但是不包括SELECT和SHOW這類操作,因為這類操作對資料本身並沒有修改。若操作本身並沒有導致資料庫發生變化,那麼該操作不會被寫入binlog。binlog日誌檔案的主要作用:

  • 可以完成主從複製。在主伺服器上把所有修改資料的操作記錄到binlog中,透過網路傳送給從伺服器,從而達到主從同步。
  • 進行恢復操作。資料可以透過binlog日誌,使用mysqlbinlog命令,實現基於時間點和位置的恢復操作。

影片講解如下:
https://www.bilibili.com/video/BV1v9YDeyE4V/?aid=112942540391...

下表列舉了binlog檔案的三種模式。
image.png

與binlog非常相似的一個概念叫做redo log,下表列出了二者的區別。
image.png

下面我們透過一個簡單的例子來說明binlog的作用。

(1)檢視MySQL是否啟用binlog

mysql> show variables like '%log_bin%';

# 輸出的資訊如下:
+------------------+------------------------------------+
| Variable_name    | Value                              |
+------------------+------------------------------------+
| log_bin          | ON                                 |
| log_bin_basename | /usr/local/mysql/data/binlog       |
| log_bin_index    | /usr/local/mysql/data/binlog.index |
+------------------+------------------------------------+

# 其中:
# log_bin:表示是否開啟了binlog。
# log_bin_basename:binlog日誌的基本檔名,最終生成的binlog檔案會追加標識來表示每一個檔案
# log_bin_index:指定的是binlog檔案的索引檔案,這個檔案管理了所有的binlog檔案的目錄 。
提示:從MySQL 8開始預設啟用了binlog。但是在MySQL 8之前的版本中,預設並沒有開啟Binlog。需要修改my.cnf檔案增加下面的引數,並重啟MySQL以啟用binlog。
log-bin=mysql-binlog
server-id=1
注意:這裡的mysql-binlog是生成的binlog的檔名。

(2)將binlog的格式設定為STATEMENT,即:每條改變資料的語句都被記錄到binlog中。

mysql> set binlog_format = 'STATEMENT';
提示:binlog_format引數的預設值是ROW模式,執行下面的語句:
mysql> select @@binlog_format;

# 輸出的資訊如下:
+-------------------+
| @@binlog_format   |
+-------------------+
| ROW               |
+-------------------+

(3)檢視當前的binblog日誌檔案是哪個。

mysql> show master status \G;

# 輸出的資訊如下:
*************************** 1. row ***************************
             File: binlog.000010
         Position: 12255
     Binlog_Do_DB: 
 Binlog_Ignore_DB: 
Executed_Gtid_Set: 3f332e68-9d5c-11ec-9a32-000c298c28d2:1-176384
1 row in set (0.00 sec)

(4)建立測試表,並插入測試資料。

mysql> use demo1;
mysql> create table test4(tid int,tname varchar(10),money int);
mysql> insert into test4 values(1,'Tom',1000);

(5)修改資料

mysql> update test4 set money=1234 where tid=1;

(6)檢視binlog中記錄的日誌資訊

mysql> show binlog events in 'binlog.000010';

# 輸出的資訊如下:
use `demo1`; create table test4(tid int,tname varchar(10),money int)
SET @@SESSION.GTID_NEXT= 'ANONYMOUS'                                
BEGIN                                                               
use `demo1`; insert into test4 values(1,'Tom',1000)                 
COMMIT /* xid=27 */                                                 
SET @@SESSION.GTID_NEXT= 'ANONYMOUS'                                
BEGIN                                                               
use `demo1`; update test4 set money=1234 where tid=1                
COMMIT /* xid=28 */ 
提示:也可以透過下面的語句直接檢視binlog日誌:
mysqlbinlog --no-defaults binlog.000001

相關文章