DELETE_DROP_TRUNCATE命令在ROW格式的binlog下记录内容探究
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了DELETE_DROP_TRUNCATE命令在ROW格式的binlog下记录内容探究相关的知识,希望对你有一定的参考价值。
今天突然想到一个问题,那就是 DELETE、DROP、TRUNCATE命令在ROW格式的binlog下记录内容一样么?隐约记着是不一样的,但不太确定;所以实验一把看个究竟。mysql:5.6.20
MySQL:5.7.22
1、查看binlog设置
mysql> show variables like ‘binlog_format‘;
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| binlog_format | ROW |
+---------------+-------+
1 row in set (0.00 sec)
确定当前会话binlog使用的是ROW格式。
2、准备实验数据
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条记录;
3、执行 TRUNCATE命令
mysql> truncate table tt;
Query OK, 0 rows affected (0.01 sec)
4、解析binlog查看记录内容
# 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命令。
5、DROP命令验证
此次略过数据准备过程,直接给出结果
...
# 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命令。
6、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上测试结果一样。
完毕!
以上是关于DELETE_DROP_TRUNCATE命令在ROW格式的binlog下记录内容探究的主要内容,如果未能解决你的问题,请参考以下文章
Android 逆向修改 Android 系统文件 ( ro 只读文件系统 | 系统文件格式 | rootfs | tmpfs | devpts | sysfs |proc | /system )(代
Android修改ro.debuggable 真机adb调试所有进程
Android 逆向Android 权限 ( ro.product.cpu.abi 属性 | ro.zygote 属性 | dhcp.eth0 属性 | net.* 属性 )
Android 逆向Android 权限 ( ro.product.cpu.abi 属性 | ro.zygote 属性 | dhcp.eth0 属性 | net.* 属性 )
Android 逆向Android 权限 ( adb 降权相关的属性 | ro.secure 属性 | ro.debuggable 属性 | service.adb.root 属性 )(代