以下示例说明了 mysqlbinlog 如何显示指定数据修改的行事件。这些对应于类型代码为 WRITE_ROWS_EVENT
、UPDATE_ROWS_EVENT
和 DELETE_ROWS_EVENT
的事件。 --base64-output=DECODE-ROWS
和 --verbose
选项可用于影响行事件输出。
假设服务器正在使用基于行的二进制日志记录,并且您执行以下语句序列
Press CTRL+C to copyCREATE TABLE t ( id INT NOT NULL, name VARCHAR(20) NOT NULL, date DATE NULL ) ENGINE = InnoDB; START TRANSACTION; INSERT INTO t VALUES(1, 'apple', NULL); UPDATE t SET name = 'pear', date = '2009-01-01' WHERE id = 1; DELETE FROM t WHERE id = 1; COMMIT;
默认情况下,mysqlbinlog 使用 BINLOG
语句显示编码为 Base-64 字符串的行事件。省略无关行,前面语句序列生成的行事件的输出如下所示
Press CTRL+C to copy$> mysqlbinlog log_file ... # at 218 #080828 15:03:08 server id 1 end_log_pos 258 Write_rows: table id 17 flags: STMT_END_F BINLOG ' fAS3SBMBAAAALAAAANoAAAAAABEAAAAAAAAABHRlc3QAAXQAAwMPCgIUAAQ= fAS3SBcBAAAAKAAAAAIBAAAQABEAAAAAAAEAA//8AQAAAAVhcHBsZQ== '/*!*/; ... # at 302 #080828 15:03:08 server id 1 end_log_pos 356 Update_rows: table id 17 flags: STMT_END_F BINLOG ' fAS3SBMBAAAALAAAAC4BAAAAABEAAAAAAAAABHRlc3QAAXQAAwMPCgIUAAQ= fAS3SBgBAAAANgAAAGQBAAAQABEAAAAAAAEAA////AEAAAAFYXBwbGX4AQAAAARwZWFyIbIP '/*!*/; ... # at 400 #080828 15:03:08 server id 1 end_log_pos 442 Delete_rows: table id 17 flags: STMT_END_F BINLOG ' fAS3SBMBAAAALAAAAJABAAAAABEAAAAAAAAABHRlc3QAAXQAAwMPCgIUAAQ= fAS3SBkBAAAAKgAAALoBAAAQABEAAAAAAAEAA//4AQAAAARwZWFyIbIP '/*!*/;
要以 “伪 SQL” 语句形式的注释查看行事件,请使用 --verbose
或 -v
选项运行 mysqlbinlog。此输出级别还显示了表分区信息(如果适用)。输出包含以 ###
开头的行
Press CTRL+C to copy$> mysqlbinlog -v log_file ... # at 218 #080828 15:03:08 server id 1 end_log_pos 258 Write_rows: table id 17 flags: STMT_END_F BINLOG ' fAS3SBMBAAAALAAAANoAAAAAABEAAAAAAAAABHRlc3QAAXQAAwMPCgIUAAQ= fAS3SBcBAAAAKAAAAAIBAAAQABEAAAAAAAEAA//8AQAAAAVhcHBsZQ== '/*!*/; ### INSERT INTO test.t ### SET ### @1=1 ### @2='apple' ### @3=NULL ... # at 302 #080828 15:03:08 server id 1 end_log_pos 356 Update_rows: table id 17 flags: STMT_END_F BINLOG ' fAS3SBMBAAAALAAAAC4BAAAAABEAAAAAAAAABHRlc3QAAXQAAwMPCgIUAAQ= fAS3SBgBAAAANgAAAGQBAAAQABEAAAAAAAEAA////AEAAAAFYXBwbGX4AQAAAARwZWFyIbIP '/*!*/; ### UPDATE test.t ### WHERE ### @1=1 ### @2='apple' ### @3=NULL ### SET ### @1=1 ### @2='pear' ### @3='2009:01:01' ... # at 400 #080828 15:03:08 server id 1 end_log_pos 442 Delete_rows: table id 17 flags: STMT_END_F BINLOG ' fAS3SBMBAAAALAAAAJABAAAAABEAAAAAAAAABHRlc3QAAXQAAwMPCgIUAAQ= fAS3SBkBAAAAKgAAALoBAAAQABEAAAAAAAEAA//4AQAAAARwZWFyIbIP '/*!*/; ### DELETE FROM test.t ### WHERE ### @1=1 ### @2='pear' ### @3='2009:01:01'
指定 --verbose
或 -v
两次,还可以显示每列的数据类型和一些元数据,以及信息日志事件,例如行查询日志事件(如果 binlog_rows_query_log_events
系统变量设置为 TRUE
)。输出包含在每次列更改后添加的附加注释
Press CTRL+C to copy$> mysqlbinlog -vv log_file ... # at 218 #080828 15:03:08 server id 1 end_log_pos 258 Write_rows: table id 17 flags: STMT_END_F BINLOG ' fAS3SBMBAAAALAAAANoAAAAAABEAAAAAAAAABHRlc3QAAXQAAwMPCgIUAAQ= fAS3SBcBAAAAKAAAAAIBAAAQABEAAAAAAAEAA//8AQAAAAVhcHBsZQ== '/*!*/; ### INSERT INTO test.t ### SET ### @1=1 /* INT meta=0 nullable=0 is_null=0 */ ### @2='apple' /* VARSTRING(20) meta=20 nullable=0 is_null=0 */ ### @3=NULL /* VARSTRING(20) meta=0 nullable=1 is_null=1 */ ... # at 302 #080828 15:03:08 server id 1 end_log_pos 356 Update_rows: table id 17 flags: STMT_END_F BINLOG ' fAS3SBMBAAAALAAAAC4BAAAAABEAAAAAAAAABHRlc3QAAXQAAwMPCgIUAAQ= fAS3SBgBAAAANgAAAGQBAAAQABEAAAAAAAEAA////AEAAAAFYXBwbGX4AQAAAARwZWFyIbIP '/*!*/; ### UPDATE test.t ### WHERE ### @1=1 /* INT meta=0 nullable=0 is_null=0 */ ### @2='apple' /* VARSTRING(20) meta=20 nullable=0 is_null=0 */ ### @3=NULL /* VARSTRING(20) meta=0 nullable=1 is_null=1 */ ### SET ### @1=1 /* INT meta=0 nullable=0 is_null=0 */ ### @2='pear' /* VARSTRING(20) meta=20 nullable=0 is_null=0 */ ### @3='2009:01:01' /* DATE meta=0 nullable=1 is_null=0 */ ... # at 400 #080828 15:03:08 server id 1 end_log_pos 442 Delete_rows: table id 17 flags: STMT_END_F BINLOG ' fAS3SBMBAAAALAAAAJABAAAAABEAAAAAAAAABHRlc3QAAXQAAwMPCgIUAAQ= fAS3SBkBAAAAKgAAALoBAAAQABEAAAAAAAEAA//4AQAAAARwZWFyIbIP '/*!*/; ### DELETE FROM test.t ### WHERE ### @1=1 /* INT meta=0 nullable=0 is_null=0 */ ### @2='pear' /* VARSTRING(20) meta=20 nullable=0 is_null=0 */ ### @3='2009:01:01' /* DATE meta=0 nullable=1 is_null=0 */
您可以告诉 mysqlbinlog 使用 --base64-output=DECODE-ROWS
选项抑制行事件的 BINLOG
语句。这类似于 --base64-output=NEVER
,但如果找到行事件,不会以错误退出。将 --base64-output=DECODE-ROWS
和 --verbose
结合使用,提供了一种方便的方法来仅以 SQL 语句形式查看行事件
Press CTRL+C to copy$> mysqlbinlog -v --base64-output=DECODE-ROWS log_file ... # at 218 #080828 15:03:08 server id 1 end_log_pos 258 Write_rows: table id 17 flags: STMT_END_F ### INSERT INTO test.t ### SET ### @1=1 ### @2='apple' ### @3=NULL ... # at 302 #080828 15:03:08 server id 1 end_log_pos 356 Update_rows: table id 17 flags: STMT_END_F ### UPDATE test.t ### WHERE ### @1=1 ### @2='apple' ### @3=NULL ### SET ### @1=1 ### @2='pear' ### @3='2009:01:01' ... # at 400 #080828 15:03:08 server id 1 end_log_pos 442 Delete_rows: table id 17 flags: STMT_END_F ### DELETE FROM test.t ### WHERE ### @1=1 ### @2='pear' ### @3='2009:01:01'
如果您打算重新执行 mysqlbinlog 输出,则不应抑制 BINLOG
语句。
由 --verbose
为行事件生成的 SQL 语句比相应的 BINLOG
语句更易读。但是,它们并不完全对应于生成事件的原始 SQL 语句。以下限制适用
原始列名已丢失,并被
@
替换,其中N
N
是一个列号。字符集信息在二进制日志中不可用,这会影响字符串列显示
对应二进制字符串类型和非二进制字符串类型 (
BINARY
和CHAR
、VARBINARY
和VARCHAR
、BLOB
和TEXT
) 之间没有区别。输出对定长字符串使用STRING
数据类型,对变长字符串使用VARSTRING
数据类型。对于多字节字符集,每个字符的最大字节数在二进制日志中不存在,因此字符串类型的长度以字节而不是字符显示。例如,
STRING(4)
用于以下任一列类型的值的类型Press CTRL+C to copyCHAR(4) CHARACTER SET latin1 CHAR(2) CHARACTER SET ucs2
由于类型为
UPDATE_ROWS_EVENT
的事件的存储格式,UPDATE
语句以WHERE
子句在SET
子句之前的方式显示。
正确解释行事件需要二进制日志开头的格式描述事件中的信息。因为 mysqlbinlog 事先不知道日志的其余部分是否包含行事件,所以默认情况下,它使用输出初始部分的 BINLOG
语句显示格式描述事件。
如果已知二进制日志不包含任何需要 BINLOG
语句的事件(即,没有行事件),则可以使用 --base64-output=NEVER
选项来防止写入此标题。