MySQL的二進制日誌(binlog)使用分析(3)——使用show binlog events命令查看日誌信息

MySQL的二進制日誌(binlog)使用分析(3)——使用show binlog events命令查看日誌信息

binlog文件中存儲的內容稱之爲二進制事件,簡稱事件。我們的每一個數據庫更新操作(Insert、Update、Delete等),都會對應的一個事件。使用show binlog events命令可以以列表的形式顯示日誌中的事件信息。

一、show binlog events命令的格式

show binlog events [IN 'log_name'] [FROM pos] [LIMIT [offset,] row_count];

說明:
(1)IN ‘log_name’:指定要查詢的binlog文件名(如果省略此參數,則默認指定第一個binlog文件);
(2)FROM pos:指定從哪個pos起始點開始查起(如果省略此參數,則從整個文件的第一個pos點開始算);
(3)LIMIT【offset】:偏移量(默認爲0);
(4)row_count:查詢總條數(如果省略,則顯示所有行)。

1、查看binlog文件信息

mysql> show master logs;
+------------------+-----------+
| Log_name         | File_size |
+------------------+-----------+
| mysql-bin.000001 |       923 |
| mysql-bin.000002 |       154 |
+------------------+-----------+
2 rows in set (0.00 sec)

2、查詢第一個binlog日誌

mysql> show binlog events;
+------------------+-----+----------------+-----------+-------------+---------------------------------------+
| Log_name         | Pos | Event_type     | Server_id | End_log_pos | Info                                  |
+------------------+-----+----------------+-----------+-------------+---------------------------------------+
| mysql-bin.000001 |   4 | Format_desc    |         1 |         123 | Server ver: 5.7.27-log, Binlog ver: 4 |
| mysql-bin.000001 | 123 | Previous_gtids |         1 |         154 |                                       |
| mysql-bin.000001 | 154 | Anonymous_Gtid |         1 |         219 | SET @@SESSION.GTID_NEXT= 'ANONYMOUS'  |
| mysql-bin.000001 | 219 | Query          |         1 |         291 | BEGIN                                 |
| mysql-bin.000001 | 291 | Table_map      |         1 |         339 | table_id: 113 (hist.t2)               |
| mysql-bin.000001 | 339 | Write_rows     |         1 |         413 | table_id: 113 flags: STMT_END_F       |
| mysql-bin.000001 | 413 | Xid            |         1 |         444 | COMMIT /* xid=16 */                   |
| mysql-bin.000001 | 444 | Anonymous_Gtid |         1 |         509 | SET @@SESSION.GTID_NEXT= 'ANONYMOUS'  |
| mysql-bin.000001 | 509 | Query          |         1 |         581 | BEGIN                                 |
| mysql-bin.000001 | 581 | Table_map      |         1 |         629 | table_id: 113 (hist.t2)               |
| mysql-bin.000001 | 629 | Update_rows    |         1 |         845 | table_id: 113 flags: STMT_END_F       |
| mysql-bin.000001 | 845 | Xid            |         1 |         876 | COMMIT /* xid=17 */                   |
| mysql-bin.000001 | 876 | Rotate         |         1 |         923 | mysql-bin.000002;pos=4                |
+------------------+-----+----------------+-----------+-------------+---------------------------------------+
13 rows in set (0.00 sec)

3、查詢第二個binlog日誌

mysql> show binlog events in 'mysql-bin.000002';
+------------------+-----+----------------+-----------+-------------+---------------------------------------+
| Log_name         | Pos | Event_type     | Server_id | End_log_pos | Info                                  |
+------------------+-----+----------------+-----------+-------------+---------------------------------------+
| mysql-bin.000002 |   4 | Format_desc    |         1 |         123 | Server ver: 5.7.27-log, Binlog ver: 4 |
| mysql-bin.000002 | 123 | Previous_gtids |         1 |         154 |                                       |
| mysql-bin.000002 | 154 | Anonymous_Gtid |         1 |         219 | SET @@SESSION.GTID_NEXT= 'ANONYMOUS'  |
| mysql-bin.000002 | 219 | Query          |         1 |         291 | BEGIN                                 |
| mysql-bin.000002 | 291 | Table_map      |         1 |         336 | table_id: 112 (hist.t1)               |
| mysql-bin.000002 | 336 | Write_rows     |         1 |         386 | table_id: 112 flags: STMT_END_F       |
| mysql-bin.000002 | 386 | Xid            |         1 |         417 | COMMIT /* xid=39 */                   |
| mysql-bin.000002 | 417 | Anonymous_Gtid |         1 |         482 | SET @@SESSION.GTID_NEXT= 'ANONYMOUS'  |
| mysql-bin.000002 | 482 | Query          |         1 |         554 | BEGIN                                 |
| mysql-bin.000002 | 554 | Table_map      |         1 |         599 | table_id: 112 (hist.t1)               |
| mysql-bin.000002 | 599 | Write_rows     |         1 |         649 | table_id: 112 flags: STMT_END_F       |
| mysql-bin.000002 | 649 | Xid            |         1 |         680 | COMMIT /* xid=40 */                   |
+------------------+-----+----------------+-----------+-------------+---------------------------------------+
12 rows in set (0.00 sec)

4、查詢mysql-bin.000002文件,從pos點417開始查詢

mysql> show binlog events in 'mysql-bin.000002' from 417;
+------------------+-----+----------------+-----------+-------------+--------------------------------------+
| Log_name         | Pos | Event_type     | Server_id | End_log_pos | Info                                 |
+------------------+-----+----------------+-----------+-------------+--------------------------------------+
| mysql-bin.000002 | 417 | Anonymous_Gtid |         1 |         482 | SET @@SESSION.GTID_NEXT= 'ANONYMOUS' |
| mysql-bin.000002 | 482 | Query          |         1 |         554 | BEGIN                                |
| mysql-bin.000002 | 554 | Table_map      |         1 |         599 | table_id: 112 (hist.t1)              |
| mysql-bin.000002 | 599 | Write_rows     |         1 |         649 | table_id: 112 flags: STMT_END_F      |
| mysql-bin.000002 | 649 | Xid            |         1 |         680 | COMMIT /* xid=40 */                  |
+------------------+-----+----------------+-----------+-------------+--------------------------------------+
5 rows in set (0.00 sec)

5、查詢mysql-bin.000002文件,從pos點219開始查詢,查詢5條記錄

mysql> show binlog events in 'mysql-bin.000002' from 219 limit 5;
+------------------+-----+----------------+-----------+-------------+--------------------------------------+
| Log_name         | Pos | Event_type     | Server_id | End_log_pos | Info                                 |
+------------------+-----+----------------+-----------+-------------+--------------------------------------+
| mysql-bin.000002 | 219 | Query          |         1 |         291 | BEGIN                                |
| mysql-bin.000002 | 291 | Table_map      |         1 |         336 | table_id: 112 (hist.t1)              |
| mysql-bin.000002 | 336 | Write_rows     |         1 |         386 | table_id: 112 flags: STMT_END_F      |
| mysql-bin.000002 | 386 | Xid            |         1 |         417 | COMMIT /* xid=39 */                  |
| mysql-bin.000002 | 417 | Anonymous_Gtid |         1 |         482 | SET @@SESSION.GTID_NEXT= 'ANONYMOUS' |
+------------------+-----+----------------+-----------+-------------+--------------------------------------+
5 rows in set (0.00 sec)

6、查詢mysql-bin.000002文件,從pos點219開始查詢,查詢5條記錄,偏移2行

mysql> show binlog events in 'mysql-bin.000002' from 219 limit 2,5;
+------------------+-----+----------------+-----------+-------------+--------------------------------------+
| Log_name         | Pos | Event_type     | Server_id | End_log_pos | Info                                 |
+------------------+-----+----------------+-----------+-------------+--------------------------------------+
| mysql-bin.000002 | 336 | Write_rows     |         1 |         386 | table_id: 112 flags: STMT_END_F      |
| mysql-bin.000002 | 386 | Xid            |         1 |         417 | COMMIT /* xid=39 */                  |
| mysql-bin.000002 | 417 | Anonymous_Gtid |         1 |         482 | SET @@SESSION.GTID_NEXT= 'ANONYMOUS' |
| mysql-bin.000002 | 482 | Query          |         1 |         554 | BEGIN                                |
| mysql-bin.000002 | 554 | Table_map      |         1 |         599 | table_id: 112 (hist.t1)              |
+------------------+-----+----------------+-----------+-------------+--------------------------------------+
5 rows in set (0.00 sec)

二、binlog管理事件

使用show binlog events命令查詢到的每一行數據就是一個binlog管理事件。當使用mysqlbinlog查看日誌信息時,每兩個【at 數字】之間的信息就對應一個管理事件。

mysql> show binlog events in '/var/lib/mysql/mysql-bin.000002';
+------------------+-----+----------------+-----------+-------------+---------------------------------------+
| Log_name         | Pos | Event_type     | Server_id | End_log_pos | Info                                  |
+------------------+-----+----------------+-----------+-------------+---------------------------------------+
| mysql-bin.000002 |   4 | Format_desc    |         2 |         123 | Server ver: 5.7.27-log, Binlog ver: 4 |
| mysql-bin.000002 | 123 | Previous_gtids |         2 |         154 |                                       |
| mysql-bin.000002 | 154 | Anonymous_Gtid |         2 |         219 | SET @@SESSION.GTID_NEXT= 'ANONYMOUS'  |
| mysql-bin.000002 | 219 | Query          |         2 |         298 | BEGIN                                 |
| mysql-bin.000002 | 298 | Query          |         2 |         397 | use `hist`; update t2 set id=id+10000 |
| mysql-bin.000002 | 397 | Xid            |         2 |         428 | COMMIT /* xid=11 */                   |
+------------------+-----+----------------+-----------+-------------+---------------------------------------+
6 rows in set (0.00 sec)

1、每一個管理事件對應的信息說明

(1)Log_name:當前事件所在的binlog文件名稱;
(2)Pos:當前事件的開始位置,每個事件都佔用固定的字節大小,結束位置(End_log_position)減去Pos,就是這個事件佔用的字節數。第一個事件位置並不是從0開始,而是從4。Mysql通過文件中的前4個字節,來判斷這是不是一個binlog文件。這種方式很常見,很多格式的文件,如pdf、doc、jpg等,都會通常前幾個特定字符判斷是否是合法文件。
(3)Event_type:表示事件的類型;
(4)Server_id:表示產生這個事件的mysql server_id,通過設置my.cnf中的server-id選項進行配置;
(5)End_log_position:下一個事件的開始位置;
(6)Info:當前事件的描述信息。

2、Statement模式下的事件說明

以下是一個Statement日誌格式的管理事件信息:

mysql> show binlog events in '/var/lib/mysql/mysql-bin.000001';
+------------------+------+----------------+-----------+-------------+-----------------------------------------------------------------------------+
| Log_name         | Pos  | Event_type     | Server_id | End_log_pos | Info                                                                        |
+------------------+------+----------------+-----------+-------------+-----------------------------------------------------------------------------+
| mysql-bin.000001 |    4 | Format_desc    |         2 |         123 | Server ver: 5.7.27-log, Binlog ver: 4                                       |
| mysql-bin.000001 |  123 | Previous_gtids |         2 |         154 |                                                                             |
| mysql-bin.000001 |  154 | Anonymous_Gtid |         2 |         219 | SET @@SESSION.GTID_NEXT= 'ANONYMOUS'                                        |
| mysql-bin.000001 |  219 | Query          |         2 |         298 | BEGIN                                                                       |
| mysql-bin.000001 |  298 | Intvar         |         2 |         330 | INSERT_ID=2                                                                 |
| mysql-bin.000001 |  330 | Query          |         2 |         456 | use `hist`; insert into t2(name) values('zhang'),('wang'),('li')            |
| mysql-bin.000001 |  456 | Xid            |         2 |         487 | COMMIT /* xid=31 */                                                         |
| mysql-bin.000001 |  487 | Anonymous_Gtid |         2 |         552 | SET @@SESSION.GTID_NEXT= 'ANONYMOUS'                                        |
| mysql-bin.000001 |  552 | Query          |         2 |         631 | BEGIN                                                                       |
| mysql-bin.000001 |  631 | Intvar         |         2 |         663 | INSERT_ID=5                                                                 |
| mysql-bin.000001 |  663 | Query          |         2 |         789 | use `hist`; insert into t2(name) values('jack'),('tom'),('rose')            |
| mysql-bin.000001 |  789 | Xid            |         2 |         820 | COMMIT /* xid=32 */                                                         |
| mysql-bin.000001 |  820 | Anonymous_Gtid |         2 |         885 | SET @@SESSION.GTID_NEXT= 'ANONYMOUS'                                        |
| mysql-bin.000001 |  885 | Query          |         2 |         964 | BEGIN                                                                       |
| mysql-bin.000001 |  964 | Query          |         2 |        1063 | use `hist`; update t2 set id=id+10000                                       |
| mysql-bin.000001 | 1063 | Xid            |         2 |        1094 | COMMIT /* xid=33 */                                                         |
| mysql-bin.000001 | 1094 | Anonymous_Gtid |         2 |        1159 | SET @@SESSION.GTID_NEXT= 'ANONYMOUS'                                        |
| mysql-bin.000001 | 1159 | Query          |         2 |        1250 | create database wgx                                                         |
| mysql-bin.000001 | 1250 | Anonymous_Gtid |         2 |        1315 | SET @@SESSION.GTID_NEXT= 'ANONYMOUS'                                        |
| mysql-bin.000001 | 1315 | Query          |         2 |        1451 | use `wgx`; create table t1(id int primary key auto_increment,name char(20)) |
| mysql-bin.000001 | 1451 | Anonymous_Gtid |         2 |        1516 | SET @@SESSION.GTID_NEXT= 'ANONYMOUS'                                        |
| mysql-bin.000001 | 1516 | Query          |         2 |        1593 | BEGIN                                                                       |
| mysql-bin.000001 | 1593 | Intvar         |         2 |        1625 | INSERT_ID=1                                                                 |
| mysql-bin.000001 | 1625 | Query          |         2 |        1741 | use `wgx`; insert into t1(name) values('zhang'),('tom')                     |
| mysql-bin.000001 | 1741 | Xid            |         2 |        1772 | COMMIT /* xid=44 */                                                         |
| mysql-bin.000001 | 1772 | Stop           |         2 |        1795 |                                                                             |
+------------------+------+----------------+-----------+-------------+-----------------------------------------------------------------------------+
26 rows in set (0.01 sec)

說明:

(1)每個binlog文件總是以Format Description Event作爲開始,以Rotate Event(Stop Event)作爲結束。在開始和結束之間,穿插着其他各種事件。

(2)每個事務都是以Query Event作爲開始,其INFO列內容爲BEGIN,以Xid Event表示結束,其INFO列內容爲COMMIT。即使對於單條更新SQL我們沒有開啓事務,Mysql也會默認的幫我們開啓事務。

(3)Intvar Event事件:如果主鍵是自增(AUTO_INCREMENT)列,MySQL首先會自增一個值,這就是Intvar Event的作用。需要注意的是,該事件,只會在Statement模式下出現。

(4)Query Event:記錄的就是插入的SQL。這也體現了Statement模式的作用,就是記錄執行的SQL。

(5)Stop Event:表示日誌文件的結束。

2、Row模式下的事件說明

以下是一個Row日誌格式的管理事件信息:

mysql> show binlog events;
+------------------+-----+----------------+-----------+-------------+---------------------------------------+
| Log_name         | Pos | Event_type     | Server_id | End_log_pos | Info                                  |
+------------------+-----+----------------+-----------+-------------+---------------------------------------+
| mysql-bin.000001 |   4 | Format_desc    |         1 |         123 | Server ver: 5.7.27-log, Binlog ver: 4 |
| mysql-bin.000001 | 123 | Previous_gtids |         1 |         154 |                                       |
| mysql-bin.000001 | 154 | Anonymous_Gtid |         1 |         219 | SET @@SESSION.GTID_NEXT= 'ANONYMOUS'  |
| mysql-bin.000001 | 219 | Query          |         1 |         291 | BEGIN                                 |
| mysql-bin.000001 | 291 | Table_map      |         1 |         339 | table_id: 113 (hist.t2)               |
| mysql-bin.000001 | 339 | Write_rows     |         1 |         413 | table_id: 113 flags: STMT_END_F       |
| mysql-bin.000001 | 413 | Xid            |         1 |         444 | COMMIT /* xid=16 */                   |
| mysql-bin.000001 | 444 | Anonymous_Gtid |         1 |         509 | SET @@SESSION.GTID_NEXT= 'ANONYMOUS'  |
| mysql-bin.000001 | 509 | Query          |         1 |         581 | BEGIN                                 |
| mysql-bin.000001 | 581 | Table_map      |         1 |         629 | table_id: 113 (hist.t2)               |
| mysql-bin.000001 | 629 | Update_rows    |         1 |         845 | table_id: 113 flags: STMT_END_F       |
| mysql-bin.000001 | 845 | Xid            |         1 |         876 | COMMIT /* xid=17 */                   |
| mysql-bin.000001 | 876 | Rotate         |         1 |         923 | mysql-bin.000002;pos=4                |
+------------------+-----+----------------+-----------+-------------+---------------------------------------+
13 rows in set (0.00 sec)

說明:

(1)每個binlog文件總是以Format Description Event作爲開始,以Rotate Event(Stop Event)作爲結束。在開始和結束之間,穿插着其他各種事件。

(2)TABLE_MAP EVENT:其作用是記錄INSERT、DELETE、UPDATE操作的表結構。

(3)Write_rows:插入記錄。

(4)Update_rows:更新記錄。

(5)Rotate Event:表示日誌文件的結束。

三、binlog日誌的優化

1、binlog_row_image參數

在ROW模式下,即使我們只更新了一條記錄的其中某個字段,也會記錄每個字段變更前後的值,binlog日誌就會變大,帶來磁盤IO上的開銷,以及網絡開銷。這個行爲可以通過binlog_row_image參數控制,該參數的取值如下:
FULL(默認值):記錄列的所有修改,即使字段沒有發生變更也會記錄。
MINIMAL:只記錄修改的列。
NOBLOB:如果是text類型或clob字段,不記錄這些日誌。

(1)binlog_row_image參數爲FULL的binlog日誌信息

[root@Mysql11 ~]# mysqlbinlog -v /var/lib/mysql/mysql-bin.000004
/*!50530 SET @@SESSION.PSEUDO_SLAVE_MODE=1*/;
/*!50003 SET @OLD_COMPLETION_TYPE=@@COMPLETION_TYPE,COMPLETION_TYPE=0*/;
.............
'/*!*/;
### UPDATE `hist`.`stu`
### WHERE
###   @1=3
###   @2='jack'
###   @3=20
###   @4='Zhengzhou'
###   @5='13675871454'
###   @6=1
### SET
###   @1=3
###   @2='jack'
###   @3=21
###   @4='Zhengzhou'
###   @5='13675871454'
###   @6=1
# at 464
#200704 11:04:54 server id 1  end_log_pos 495 CRC32 0xc311dbb6 	Xid = 18
COMMIT/*!*/;
SET @@SESSION.GTID_NEXT= 'AUTOMATIC' /* added by mysqlbinlog */ /*!*/;
DELIMITER ;
# End of log file
/*!50003 SET COMPLETION_TYPE=@OLD_COMPLETION_TYPE*/;
/*!50530 SET @@SESSION.PSEUDO_SLAVE_MODE=0*/;

(2)binlog_row_image參數爲MINIMAL的binlog日誌信息

[root@Mysql11 ~]# mysqlbinlog -v /var/lib/mysql/mysql-bin.000007
/*!50530 SET @@SESSION.PSEUDO_SLAVE_MODE=1*/;
/*!50003 SET @OLD_COMPLETION_TYPE=@@COMPLETION_TYPE,COMPLETION_TYPE=0*/;
..............
'/*!*/;
### UPDATE `hist`.`stu`
### WHERE
###   @1=1
### SET
###   @3=21
# at 394
#200704 11:14:45 server id 1  end_log_pos 425 CRC32 0x54f07b19 	Xid = 17
COMMIT/*!*/;
SET @@SESSION.GTID_NEXT= 'AUTOMATIC' /* added by mysqlbinlog */ /*!*/;
DELIMITER ;
# End of log file
/*!50003 SET COMPLETION_TYPE=@OLD_COMPLETION_TYPE*/;
/*!50530 SET @@SESSION.PSEUDO_SLAVE_MODE=0*/;

3、在Row模式下記錄sql語句

在Statement模式下,直接記錄SQL比較直觀。在Row模式下,使用binlog_rows_query_log_events參數也可以記錄SQL。參數的默認爲值爲FALSE,如果爲true的情況下,會通過Rows Query Event來記錄SQL。

在my.cnf中添加以下配置,來開啓row模式下的SQL記錄:

binlog-rows-query-log_events=1

結果如下:

mysql> show binlog events in '/var/lib/mysql/mysql-bin.000009';
+------------------+------+----------------+-----------+-------------+-------------------------------------------+
| Log_name         | Pos  | Event_type     | Server_id | End_log_pos | Info                                      |
+------------------+------+----------------+-----------+-------------+-------------------------------------------+
| mysql-bin.000009 |    4 | Format_desc    |         1 |         123 | Server ver: 5.7.27-log, Binlog ver: 4     |
| mysql-bin.000009 |  123 | Previous_gtids |         1 |         154 |                                           |
| mysql-bin.000009 |  154 | Anonymous_Gtid |         1 |         219 | SET @@SESSION.GTID_NEXT= 'ANONYMOUS'      |
| mysql-bin.000009 |  219 | Query          |         1 |         291 | BEGIN                                     |
| mysql-bin.000009 |  291 | Rows_query     |         1 |         354 | # insert into t2(name) values('zhangfei') |
| mysql-bin.000009 |  354 | Table_map      |         1 |         402 | table_id: 113 (hist.t2)                   |
| mysql-bin.000009 |  402 | Write_rows     |         1 |         451 | table_id: 113 flags: STMT_END_F           |
| mysql-bin.000009 |  451 | Xid            |         1 |         482 | COMMIT /* xid=17 */                       |
| mysql-bin.000009 |  482 | Anonymous_Gtid |         1 |         547 | SET @@SESSION.GTID_NEXT= 'ANONYMOUS'      |
| mysql-bin.000009 |  547 | Query          |         1 |         619 | BEGIN                                     |
| mysql-bin.000009 |  619 | Rows_query     |         1 |         666 | # update t2 set id=id+100                 |
| mysql-bin.000009 |  666 | Table_map      |         1 |         714 | table_id: 113 (hist.t2)                   |
| mysql-bin.000009 |  714 | Update_rows    |         1 |         850 | table_id: 113 flags: STMT_END_F           |
| mysql-bin.000009 |  850 | Xid            |         1 |         881 | COMMIT /* xid=18 */                       |
| mysql-bin.000009 |  881 | Anonymous_Gtid |         1 |         946 | SET @@SESSION.GTID_NEXT= 'ANONYMOUS'      |
| mysql-bin.000009 |  946 | Query          |         1 |        1018 | BEGIN                                     |
| mysql-bin.000009 | 1018 | Rows_query     |         1 |        1069 | # delete from t2 where id=201             |
| mysql-bin.000009 | 1069 | Table_map      |         1 |        1117 | table_id: 113 (hist.t2)                   |
| mysql-bin.000009 | 1117 | Delete_rows    |         1 |        1157 | table_id: 113 flags: STMT_END_F           |
| mysql-bin.000009 | 1157 | Xid            |         1 |        1188 | COMMIT /* xid=34 */                       |
+------------------+------+----------------+-----------+-------------+-------------------------------------------+
20 rows in set (0.00 sec)
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章