2017-09-07 10 views
1

Je simple master-> configuration esclave avec MariaDB:pt table-contrôle ne détecte pas diffs

Master: Ubuntu 16.04 LTS avec MariaDB 10.2.8 et Percona-boîte à outils 3.0.4

Slave: Ubuntu 16.04 LTS avec MariaDB 10.2.7

La réplication fonctionne bien et maintenant je veux vérifier si les données sont identiques entre maître et esclave.

I installé toolkit Percona sur le maître et créé un utilisateur de somme de contrôle:

MariaDB> GRANT REPLICATION SLAVE,PROCESS,SUPER, SELECT ON *.* TO `pt_checksum`@'%' IDENTIFIED BY 'password'; 
MariaDB> GRANT ALL PRIVILEGES ON percona.* TO `pt_checksum`@'%'; 
MariaDB> FLUSH PRIVILEGES; 

I report_host également ajouté dans la conf esclave, de sorte qu'il se présente au maître:

MariaDB [(none)]> show slave hosts; 
+-----------+-----------+------+-----------+ 
| Server_id | Host  | Port | Master_id | 
+-----------+-----------+------+-----------+ 
|   2 | 10.0.0.49 | 3306 |   1 | 
+-----------+-----------+------+-----------+ 
1 row in set (0.00 sec) 

Pour tester pt-table-checksum j'ai supprimé une ligne de la table Tickets dans ma base de données de test sur l'esclave. J'ai vérifié que cette ligne est effectivement manquante mais toujours présente sur le master.

Mais pt table somme de contrôle ne signale pas cette différence:

# pt-table-checksum --databases=shop_test --tables=Tickets --host=localhost --user=pt_checksum --password=... --no-check-binlog-format --no-check-replication-filters 
     TS ERRORS DIFFS  ROWS CHUNKS SKIPPED TIME TABLE 
09-07T16:15:02  0  0  14  1  0 0.013 shop_test.Tickets 

Je me suis donc PTDEBUG = 1 dans mon environnement, mais il semble que le maître se relie très bien à l'esclave. J'ai essayé de choisir les bits correspondants de la sortie:

# MasterSlave:5175 9725 Connected to h=localhost,p=...,u=pt_checksum 
# MasterSlave:5184 9725 SELECT @@SERVER_ID 
# MasterSlave:5186 9725 Working on server ID 1 
# MasterSlave:5219 9725 Looking for slaves on h=localhost,p=...,u=pt_checksum using methods processlist hosts 
# MasterSlave:5226 9725 Finding slaves with _find_slaves_by_processlist 
# MasterSlave:5288 9725 DBI::db=HASH(0x31c5190) SHOW GRANTS FOR CURRENT_USER() 
# MasterSlave:5318 9725 DBI::db=HASH(0x31c5190) SHOW FULL PROCESSLIST 
# DSNParser:1417 9725 Parsing h=10.0.0.49 
[...] 
# MasterSlave:5231 9725 Found 1 slaves 
# MasterSlave:5208 9725 Recursing from h=localhost,p=...,u=pt_checksum to h=10.0.0.49,p=...,u=pt_checksum 
# MasterSlave:5155 9725 Recursion methods: processlist hosts 
[...] 
# MasterSlave:5175 9725 Connected to h=10.0.0.49,p=...,u=pt_checksum 
# MasterSlave:5184 9725 SELECT @@SERVER_ID 
# MasterSlave:5186 9725 Working on server ID 2 
# MasterSlave:5097 9725 Found slave: h=10.0.0.49,p=...,u=pt_checksum 
[...] 
# pt_table_checksum:9793 9725 Exit status 0 oktorun 1 
# Cxn:3764 9725 Destroying cxn 
# Cxn:3774 9725 DBI::db=HASH(0x31cd218) Disconnecting dbh on slaveserver h=10.0.0.49 
# Cxn:3764 9725 Destroying cxn 
# Cxn:3774 9725 DBI::db=HASH(0x31c5190) Disconnecting dbh on masterserver h=localhost 

Je suis d'idées, comme pourquoi la ligne manquante n'est pas détectée?

Répondre

0

J'ai remarqué un nouveau rapport de bug pendant le week-end, et j'ai confirmé aujourd'hui que c'est bien le problème que je rencontre. La solution est d'ajouter --set-vars binlog_format=statement.

Lorsque je règle cette option, la différence se révèle après la deuxième exécution.

Au cours de la première manche de la table de contrôle sur l'esclave passe de:

MariaDB [percona]> select tbl, this_crc, this_cnt, master_crc,master_cnt from checksums where tbl = 'Tickets' and db = 'shop_test'; 
+---------+----------+----------+------------+------------+ 
| tbl  | this_crc | this_cnt | master_crc | master_cnt | 
+---------+----------+----------+------------+------------+ 
| Tickets | f30abebe |  14 | f30abebe |   14 | 
+---------+----------+----------+------------+------------+ 

... à ...

MariaDB [percona]> select tbl, this_crc, this_cnt, master_crc,master_cnt from checksums where tbl = 'Tickets' and db = 'shop_test'; 
+---------+----------+----------+------------+------------+ 
| tbl  | this_crc | this_cnt | master_crc | master_cnt | 
+---------+----------+----------+------------+------------+ 
| Tickets | 284ec207 |  13 | f30abebe |   14 | 
+---------+----------+----------+------------+------------+ 

Et après la deuxième manche, le diff est également présent dans sortie de table de pt-checksum:

# pt-table-checksum --tables=shop_test.Tickets --host=localhost --user=pt_checksum --password=... --no-check-binlog-format --no-check-replication-filters --set-vars binlog_format=statement 
      TS ERRORS DIFFS  ROWS CHUNKS SKIPPED TIME TABLE 
09-11T11:17:37  0  1  14  1  0 0.022 shop_test.Tickets 

I vérifiée par SHOW VARIABLES LIKE 'binlog_format' que binlog_format est toujours 'mixte', donc apparemment, il ne change que pour la durée de la session. Selon le DOC, cela devrait se faire automatiquement, pour autant que je comprends:

Cela fonctionne uniquement avec la réplication basée sur la déclaration (pt-table contrôle va changer le format binlog à ÉNONCÉ pendant toute la durée de la session si votre serveur utilise la réplication basée sur les lignes).

Rapport de bogue: https://bugs.launchpad.net/percona-toolkit/+bug/1715801