在mysqlbinlog实用程序文档中,该--rewrite-db=name
选项有以下解释
过滤(例如使用 --database=name )在执行数据库重写之后发生。
但是,我的测试表明,使用该选项进行过滤是在应用该选项之前--database
发生的。--rewrite-db
我通过以下方式重现了这个问题:我创建了一个数据库,其中包含一个包含一列db1
的表。二进制日志格式 = .t1
c1
ROW
CREATE DATABASE db1;
use db1;
CREATE TABLE t1 (c1 varchar(255));
然后我执行了以下命令:
FLUSH LOGS;
插入表格
INSERT INTO t1 (c1) VALUES (`row in db1.t1`);
再次执行命令
FLUSH LOGS;
我使用下面的命令(--vv
参数解密命令)来检查从二进制日志中提取的内容:
mysqlbinlog mysql-bin.000033 --rewrite-db='db1->new_db_name' --database='new_db_name' -vv
只输出注释,不输出INSERT
命令。但是,如果我db1
在--database
参数中指定名称,INSERT
则会显示命令:
mysqlbinlog mysql-bin.000033 --rewrite-db='db1->new_db_name' --database='db1' -vv
输出:
...
...
BINLOG '
eI98YxMBAAAANgAAABwCAAAAADMAAAAAAAEAC25ld19kYl9uYW1lAAJ0MQABDwL8AwFyNVlH
eI98YxcBAAAAMQAAAE0CAAAAADMAAAAAAAEAAf/+DQByb3cgaW4gZGIxLnQxmq6ESw==
'/*!*/;
### INSERT INTO `new_db_name`.`t1`
### SET
### @1='row in db1.t1' /* VARSTRING(1020) meta=1020 nullable=1 is_null=0 */
...
...
因此,事实证明,mysqlbinlog
首先使用参数过滤binlog文件,--database
然后才使用参数进行替换--rewrite-db
,这与文档相矛盾。
我为 MySQL(没有 MariaDB)测试了类似的场景,它可以正常工作,过滤在替换之后运行。
我是否正确理解这是文档中的错误?还是我误会了什么?
查看代码,似乎在
--database
print_use_statement使用.QUERY_EVENT
QUERY_COMPRESSED_EVENT
--rewrite-db
使用
TABLE_MAP_EVENT
,--database
在应用于之前应用。--rewrite-db
_ _TABLE_MAP_EVENT
所以你是绝对正确的,这是一个文档错误。如果您想更改它,MariaDB 的知识库是可编辑的。