0

我徒劳地试图从我的 4 节点 MySQL 集群的二进制日志中获取一些有用的信息。作为测试,我在上午 11:01 在主服务器上手动执行了一条 UPDATE 语句(它确实成功地更改了表中的一些数据)。不幸的是,我无法让 mysqlbinlog 向我展示执行的语句。

我尝试了 --verbose 选项、--hexdump 选项和 --base64-output=DECODE-ROWS --verbose。不管我做什么,实际的语句似乎仍然被编码(或者当应该有更新时有一个 INSERT INTO)。

下面是我上午 11:01 测试的相关输出,指定了 --base64-output=DECODE-ROWS --verbose 选项。为什么找不到我的 UPDATE 语句?而且,如果数据库将其优化为 INSERT INTO,为什么我至少看不到表名和原始语句的其他部分?

# at 1744
#121213 11:01:56 server id 1  end_log_pos 1808  Query   thread_id=0     exec_time=0   error_code=0
SET TIMESTAMP=1355425316/*!*/;
BEGIN
/*!*/;
# at 1808
# at 1899
# at 1961
# at 2022
#121213 11:01:56 server id 1  end_log_pos 1899  Table_map: `source_words`.`players` mapped to number 1826
#121213 11:01:56 server id 1  end_log_pos 1961  Table_map: `mysql`.`ndb_apply_status` mapped to number 1817
#121213 11:01:56 server id 1  end_log_pos 2022  Write_rows: table id 1817
#121213 11:01:56 server id 1  end_log_pos 2071  Write_rows: table id 1826 flags: STMT_END_F
### INSERT INTO mysql.ndb_apply_status
### SET
###   @1=1
###   @2=14197993649471490
###   @3=''
###   @4=0
###   @5=0
### INSERT INTO source_words.players
### SET
###   @1='834770J\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00!\x00\x00\x00\x00\x00\x00\x00\x17yê\x00\x00\x17yê\x00\x00 \x00\x00\x00\x00\x00\x00\x00À'
###   @6=0
# at 2071
#121213 11:01:56 server id 1  end_log_pos 2136  Query   thread_id=0     exec_time=0   error_code=0
SET TIMESTAMP=1355425316/*!*/;
COMMIT
/*!*/;
DELIMITER ;
# End of log file
ROLLBACK /* added by mysqlbinlog */;
/*!50003 SET COMPLETION_TYPE=@OLD_COMPLETION_TYPE*/;

谢谢,罗伯

4

1 回答 1

1

二进制日志记录的是什么改变,不一定是什么语句导致它(或者如果更新没有更新任何东西,也不会显示任何内容)。如果您的BINLOG_FORMATis STATEMENT, al 将是语句, for ROW& MIXED,您将在 MySQL 认为合适的位置和时间获得这些条目。binlog 不用于监视/检查数据库上的查询(为此使用通用查询日志),binlog 仅用于记录数据的更改,因此您可以可靠地恢复备份或使用复制。它从未打算供人类阅读。

另请注意,可能会设置和不会记录哪些设置,并且您的“默认架构”对连接有很大影响。如果您真的错过了一个声明(请注意旧日志会被轮换),我建议您SHOW VARIABLES LIKE '%binlog%';

于 2012-12-13T19:31:34.493 回答