下面的例子说明了如何操作mysqlbinlog显示指定数据修改的行事件。这些与事件相对应WRITE_ROWS_EVENT
,UPDATE_ROWS_EVENT
,DELETE_ROWS_EVENT
类型的代码。的——base64-output = DECODE-ROWS
而且——详细
选项可用于影响行事件输出。
假设服务器使用基于行的二进制日志记录,并且执行以下语句序列:
CREATE表t (id INT NOT NULL, name VARCHAR(20) NOT NULL, date date NULL)开始事务;INSERT INTO t VALUES(1, 'apple', NULL);UPDATE SET name = 'pear', date = '2009-01-01' WHERE id = 1;删除id = 1的数据提交;
默认情况下,mysqlbinlog显示编码为base-64字符串的行事件BINLOG
语句。省略多余的行,由前面的语句序列产生的行事件的输出如下所示:
$ > mysqlbinloglog_file...#080828 15:03:08服务器id 1 end_log_pos 258 Write_rows:表id 17 flags: STMT_END_F BINLOG ' fas3sbmbaaaalaaaanoaaaaaaaabeaaaaaaaaabhrlc3qaaxqaawmpcgiuaaq = fas3sbcbaaaakaaaaaibaaaqabeaaaaaaaaaaaaavhchbszq == '/*!*/;...# at 302 #080828 15:03:08服务器id 1 end_log_pos 356 Update_rows:表id 17 flags: STMT_END_F BINLOG ' fas3sbmbaaaalaaaac4baaaaabeaaaaaaaaaaabhrlc3qaaxqaawmpcgiuaaq = fas3sbgbaaaangaaagqbaaaqabeaaaaaaaaaeaa//// AEAAAAFYXBwbGX4AQAAAARwZWFyIbIP '/*!*/;...# at 400 #080828 15:03:08 server id 1 end_log_pos 442 Delete_rows: table id 17 flags: STMT_END_F BINLOG ' fas3sbmbaaaalaaaajabaaaaaaaaaaaaaaaaaaaaaaabhrlc3qaaxqaawmpcgiuaaq = fas3sbkbaaaakgaaalobaaaqabeaaaaaaaaaaaaaaqaaaarwzwfyibip '/*!*/;
的形式将行事件视为注释”pseudo-SQL”语句,运行mysqlbinlog与——详细
或- v
选择。这个输出级别还显示了表分区信息。输出包含以# # #
:
$> mysqlbinlog -vlog_file...#080828 15:03:08服务器id 1 end_log_pos 258 Write_rows:表id 17 flags: STMT_END_F BINLOG ' fas3sbmbaaaalaaaanoaaaaaaaabeaaaaaaaaabhrlc3qaaxqaawmpcgiuaaq = fas3sbcbaaaakaaaaaibaaaqabeaaaaaaaaaaaaavhchbszq == '/*!*/;插入到测试中。t组# # # # # # @1 = 1 # # # @2 =‘苹果’# # # @3 =零……# at 302 #080828 15:03:08服务器id 1 end_log_pos 356 Update_rows:表id 17 flags: STMT_END_F BINLOG ' fas3sbmbaaaalaaaac4baaaaabeaaaaaaaaaaabhrlc3qaaxqaawmpcgiuaaq = fas3sbgbaaaangaaagqbaaaqabeaaaaaaaaaeaa//// AEAAAAFYXBwbGX4AQAAAARwZWFyIbIP '/*!*/;###更新测试t # # #, # # # @1 = 1 # # # @2 =‘苹果’# # # @3 = NULL # # # # # #设置@1 = 1 # # # @2 =“梨”# # # @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 ' fas3sbmbaaaalaaaajabaaaaaaaaaaaaaaaaaaaaaaabhrlc3qaaxqaawmpcgiuaaq = fas3sbkbaaaakgaaalobaaaqabeaaaaaaaaaaaaaaqaaaarwzwfyibip '/*!*/;###删除测试。t # # #, # # # @1 = 1 # # # @2 =“梨”# # # @3 =“2009:01:01”
指定——详细
或- v
还可以显示每列的数据类型和一些元数据,以及信息日志事件,如行查询日志事件binlog_rows_query_log_events
系统变量设置为真正的
.输出包含在每一列更改之后的附加注释:
$> mysqlbinlog -vvlog_file...#080828 15:03:08服务器id 1 end_log_pos 258 Write_rows:表id 17 flags: STMT_END_F BINLOG ' fas3sbmbaaaalaaaanoaaaaaaaabeaaaaaaaaabhrlc3qaaxqaawmpcgiuaaq = fas3sbcbaaaakaaaaaibaaaqabeaaaaaaaaaaaaavhchbszq == '/*!*/;插入到测试中。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服务器id 1 end_log_pos 356 Update_rows:表id 17 flags: STMT_END_F BINLOG ' fas3sbmbaaaalaaaac4baaaaabeaaaaaaaaaaabhrlc3qaaxqaawmpcgiuaaq = fas3sbgbaaaangaaagqbaaaqabeaaaaaaaaaeaa//// AEAAAAFYXBwbGX4AQAAAARwZWFyIbIP '/*!*/;###更新测试t ### # WHERE ### # @1=1 /* INT meta=0 nullable=0 is_null=0 */ ### @2='apple' /* VARSTRING(20) meta=20 nullable=0 is_null=0 */ ### @3='2009:01:01' /* DATE meta=0 nullable=1 is_null=0 */ ### @3='苹果' /* VARSTRING(20) meta=0 nullable=1 is_null=1 */ ### SET ### @1=1 */ ### SET ### @1=1 / ### #梨' /* 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 ' fas3sbmbaaaalaaaajabaaaaaaaaaaaaaaaaaaaaaaabhrlc3qaaxqaawmpcgiuaaq = fas3sbkbaaaakgaaalobaaaqabeaaaaaaaaaaaaaaqaaaarwzwfyibip '/*!*/;###删除测试。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为了压制BINLOG
的行事件的语句——base64-output = DECODE-ROWS
选择。这类似于——base64-output =没有
但如果发现行事件,则不退出并显示错误。的组合——base64-output = DECODE-ROWS
而且——详细
提供了一种只将行事件视为SQL语句的方便方法:
$> mysqlbinlog -v——base64-output=DECODE-ROWSlog_file...# stmt_end_f# ## INSERT INTO test. #服务器id 1 end_log_pos 258 Write_rows:表id 17 flags:t组# # # # # # @1 = 1 # # # @2 =‘苹果’# # # @3 =零……# at 302 #080828 15:03:08 server id 1 end_log_pos 356 Update_rows:表id 17 flags: stmt_end_f# ## UPDATE test。t # # #, # # # @1 = 1 # # # @2 =‘苹果’# # # @3 = NULL # # # # # #设置@1 = 1 # # # @2 =“梨”# # # @3 =“2009:01:01”……# at 400 #080828 15:03:08 server id 1 end_log_pos 442 Delete_rows:表id 17 flags: stmt_end_f# ## DELETE FROM test。t # # #, # # # @1 = 1 # # # @2 =“梨”# # # @3 =“2009:01:01”
你不应该压抑BINLOG
语句,如果您打算重新执行mysqlbinlog输出。
生成的SQL语句——详细
因为行事件比相应的事件更具可读性BINLOG
语句。但是,它们并不完全对应于生成事件的原始SQL语句。以下限制适用:
原来的列名已丢失,取而代之的是
@
,在那里N
N
是列号。二进制日志中没有字符集信息,这会影响字符串列的显示:
正确解释行事件需要二进制日志开头的格式描述事件提供的信息。因为mysqlbinlog不事先知道日志的其余部分是否包含行事件,默认情况下,它使用BINLOG
语句的初始部分。
如果已知二进制日志不包含任何需要BINLOG
语句(即没有行事件),则——base64-output =没有
选项可用于阻止写入此标头。