MySQL的binlog日誌檔案(也叫做:二進位制日誌)記錄了對MySQL資料庫執行更改的所有操作,但是不包括SELECT和SHOW這類操作,因為這類操作對資料本身並沒有修改。若操作本身並沒有導致資料庫發生變化,那麼該操作不會被寫入binlog。binlog日誌檔案的主要作用:
- 可以完成主從複製。在主伺服器上把所有修改資料的操作記錄到binlog中,透過網路傳送給從伺服器,從而達到主從同步。
- 進行恢復操作。資料可以透過binlog日誌,使用mysqlbinlog命令,實現基於時間點和位置的恢復操作。
影片講解如下:
https://www.bilibili.com/video/BV1v9YDeyE4V/?aid=112942540391...
下表列舉了binlog檔案的三種模式。
與binlog非常相似的一個概念叫做redo log,下表列出了二者的區別。
下面我們透過一個簡單的例子來說明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