mysqlbinlog功能是将 MySQL 的binlog日志转换成MySQL 文本SQL语句,默认情况下binlog日志是二进制文件.
用file命令查看文件类型
$ file mysql-bin.002149
mysql-bin.002149: MySQL replication log
直接用xxd命令查看(二进制)
$ xxd -l 1024 mysql-bin.002149
00000000: fe62 696e 562a 5f5d 0f01 0000 0077 0000 .binV*_].....w..
00000010: 007b 0000 0000 0004 0035 2e37 2e32 372d .{.......5.7.27-
00000020: 3075 6275 6e74 7530 2e31 362e 3034 2e31 0ubuntu0.16.04.1
00000030: 2d6c 6f67 0000 0000 0000 0000 0000 0000 -log............
00000040: 0000 0000 0000 0000 0000 0000 0000 0013 ................
转换日志成文本的sql看一下
$ mysqlbinlog --no-defaults /var/lib/mysql/mysql-bin.002149 >~/test.sql
$ head ~/test.sql
输出
/*!50530 SET @@SESSION.PSEUDO_SLAVE_MODE=1*/;
/*!50003 SET @OLD_COMPLETION_TYPE=@@COMPLETION_TYPE,COMPLETION_TYPE=0*/;
DELIMITER /*!*/;
# at 4
#190822 7:51:43 server id 1 end_log_pos 123 CRC32 0x6c47a911 Start: binlog v 4, server v 5.7.27-0ubuntu0.16.04.1-log created 190822 7:51:43
BINLOG '
D9ldXQ8BAAAAdwAAAHsAAAAAAAQANS43LjI3LTB1YnVudHUwLjE2LjA0LjEtbG9nAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAEzgNAAgAEgAEBAQEEgAAXwAEGggAAAAICAgCAAAACgoKKioAEjQA
ARGpR2w=
'/*!*/;
输出虽然大部分是文本,但因为采用的mixed模式,也有类似BINLOG类似的指令,这部分是无法转成sql语句的。也就无法查看了。
对这段神秘的BINLOG解析一下:
echo "D9ldXQ8BAAAAdwAAAHsAAAAAAAQANS43LjI3LTB1YnVudHUwLjE2LjA0LjEtbG9nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEzgNAAgAEgAEBAQEEgAAXwAEGggAAAAICAgCAAAACgoKKioAEjQAARGpR2w=" |base64 -d |xxd
将会输出:
00000000: 0fd9 5d5d 0f01 0000 0077 0000 007b 0000 ..]].....w...{..
00000010: 0000 0004 0035 2e37 2e32 372d 3075 6275 .....5.7.27-0ubu
00000020: 6e74 7530 2e31 362e 3034 2e31 2d6c 6f67 ntu0.16.04.1-log
00000030: 0000 0000 0000 0000 0000 0000 0000 0000 ................
00000040: 0000 0000 0000 0000 0000 0013 380d 0008 ............8...
00000050: 0012 0004 0404 0412 0000 5f00 041a 0800 .........._.....
00000060: 0000 0808 0802 0000 000a 0a0a 2a2a 0012 ............**..
00000070: 3400 0111 a947 6c 4....Gl
和前面那段似曾相识。
mysqlbinlog加–base64-output=DECODE-ROWS -v 参数可以把BINLOG部分转化成可读的注释掉的SQL, 但不是所有的都能成功转化。