今天忽然想到一個問題,那就是 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上測試結果同樣。
完畢!