DELETE_DROP_TRUNCATE命令在ROW格式的binlog下記錄內容探究

今天忽然想到一個問題,那就是 DELETE、DROP、TRUNCATE命令在ROW格式的binlog下記錄內容同樣麼?隱約記着是不同的,但不太肯定;因此實驗一把看個究竟。mysql

MySQL:5.6.20
MySQL:5.7.22sql

一、查看binlog設置app

mysql> show  variables like 'binlog_format';
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| binlog_format | ROW   |
+---------------+-------+
1 row in set (0.00 sec)

肯定當前會話binlog使用的是ROW格式。ide

二、準備實驗數據測試

mysql> create table tt (  id int not null, name varchar(20) ,primary key(id) ) engine=innodb;
Query OK, 0 rows affected (0.01 sec)

mysql> insert into tt values(1,'a'),(2,'b'),(3,'c');
Query OK, 3 rows affected (0.00 sec)
Records: 3  Duplicates: 0  Warnings: 0

mysql> select * from tt;
+----+------+
| id | name |
+----+------+
|  1 | a    |
|  2 | b    |
|  3 | c    |
+----+------+
3 rows in set (0.00 sec)

準備了測試表tt以及3條記錄;code

三、執行 TRUNCATE命令orm

mysql> truncate table tt;
Query OK, 0 rows affected (0.01 sec)

四、解析binlog查看記錄內容server

# mysqlbinlog --no-defaults --set-charset=utf8 --skip-gtids -vv --base64-output=decode-rows mysql-bin.000009
...
# at 486
#200519 16:57:42 server id 6501  end_log_pos 570 CRC32 0x5ca07de7       Query   thread_id=1     exec_time=0     error_code=0
SET TIMESTAMP=1589878662/*!*/;
truncate table tt
/*!*/;
DELIMITER ;

...

能夠看到,對TRUNCATE命令,row格式的binlog也只記錄原始SQL命令。ip

五、DROP命令驗證
這次略過數據準備過程,直接給出結果it

...
# at 777
#200519 16:58:00 server id 6501  end_log_pos 892 CRC32 0x5ce03bb6       Query   thread_id=1     exec_time=0     error_code=0
SET TIMESTAMP=1589878680/*!*/;
DROP TABLE `tt` /* generated by server */
/*!*/;
DELIMITER ;
...

能夠看到,對DROP命令,row格式的binlog也只記錄原始SQL命令。

六、DELETE命令驗證
這次略過數據準備過程,直接給出結果

# at 1258
#200519 17:28:40 server id 6501  end_log_pos 1330 CRC32 0xb89c707e      Query   thread_id=3     exec_time=0     error_code=0
SET TIMESTAMP=1589880520/*!*/;
BEGIN
/*!*/;
# at 1330
#200519 17:28:40 server id 6501  end_log_pos 1378 CRC32 0x76ba3836      Table_map: `test`.`tt` mapped to number 74
# at 1378
#200519 17:28:40 server id 6501  end_log_pos 1428 CRC32 0xc9b8282a      Delete_rows: table id 74 flags: STMT_END_F
### DELETE FROM `test`.`tt`
### WHERE
###   @1=1 /* INT meta=0 nullable=0 is_null=0 */
### DELETE FROM `test`.`tt`
### WHERE
###   @1=2 /* INT meta=0 nullable=0 is_null=0 */
### DELETE FROM `test`.`tt`
### WHERE
###   @1=3 /* INT meta=0 nullable=0 is_null=0 */
# at 1428
#200519 17:28:40 server id 6501  end_log_pos 1459 CRC32 0x3f78e3be      Xid = 49
COMMIT/*!*/;
DELIMITER ;

能夠看到,對DELETE命令,row格式的binlog記錄了每條數據的詳細信息。

說明:
MySQL5.6和MySQL5.7上測試結果同樣。

完畢!

相關文章
相關標籤/搜索