Na documentação do utilitário mysqlbinlog , a --rewrite-db=name
opção tem a seguinte explicação
A filtragem (por exemplo, com --database=name ) ocorre APÓS a reescrita do banco de dados.
No entanto, meus testes mostram que a filtragem com a --database
opção acontece ANTES de a --rewrite-db
opção ser aplicada.
Reproduzi o problema da seguinte forma: criei um banco de dados db1
com uma tabela t1
que contém uma coluna c1
. Formato de log binário = ROW
.
CREATE DATABASE db1;
use db1;
CREATE TABLE t1 (c1 varchar(255));
Então executei o seguinte comando:
FLUSH LOGS;
Fez uma inserção na tabela
INSERT INTO t1 (c1) VALUES (`row in db1.t1`);
Executei o comando novamente
FLUSH LOGS;
Utilizo o comando abaixo (o --vv
parâmetro descriptografa os comandos) para verificar o que é extraído dos binlogs:
mysqlbinlog mysql-bin.000033 --rewrite-db='db1->new_db_name' --database='new_db_name' -vv
Apenas comentários são produzidos, nenhum INSERT
comando. No entanto, se eu especificar o nome db1
no --database
parâmetro, INSERT
os comandos serão exibidos:
mysqlbinlog mysql-bin.000033 --rewrite-db='db1->new_db_name' --database='db1' -vv
saída:
...
...
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 */
...
...
Assim, verifica-se que mysqlbinlog
primeiro filtra o arquivo binlog com o --database
parâmetro e só então faz substituições com o --rewrite-db
parâmetro, o que contradiz a documentação.
Testei cenários semelhantes para MySQL (sem MariaDB) e funciona como deveria, a filtragem é executada APÓS as substituições.
Eu entendi corretamente que este é um erro na documentação? Ou estou entendendo mal alguma coisa?
Olhando para o código, parece que
--database
a opção é aplicada aQUERY_EVENT
/QUERY_COMPRESSED_EVENT
pouco antes de print_use_statement usar o--rewrite-db
.Com o
TABLE_MAP_EVENT
,--database
é aplicado antes de--rewrite-db
é aplicado aTABLE_MAP_EVENT
.Então você está absolutamente certo, este é um erro de documentação. O KB do MariaDB é editável se você quiser mudar isso.