Bonjour,
Je suis en train de tester des scénarios de sauvegarde / restauration de nos bases mysql.
J'essaye de restaurer un fichier binlog qui contient des instructions d'insert.ion
Dans l'exemple ci-dessous :
- je switch les binlog
- je purge les binlog
- j'insère une données dans une table
- je truncate la table
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30 mysql> show binary logs; +----------------------+-----------+-----------+ | Log_name | File_size | Encrypted | +----------------------+-----------+-----------+ | localhost-bin.000017 | 196 | No | +----------------------+-----------+-----------+ 1 row in set (0.00 sec) mysql> use tmatt; Reading table information for completion of table and column names You can turn off this feature to get a quicker startup with -A Database changed mysql> INSERT INTO test_restauration(message,created_at) VALUES('TEST - RESTAURATION AFTER MYSQLDUMP TOTO',NOW()); Query OK, 1 row affected (0.03 sec) mysql> select * from test_restauration; +----+------------------------------------------+---------------------+ | id | message | created_at | +----+------------------------------------------+---------------------+ | 1 | TEST - RESTAURATION BEFORE MYSQLDUMP | 2022-01-21 10:32:04 | | 2 | TEST - RESTAURATION AFTER MYSQLDUMP TOTO | 2022-01-21 11:24:44 | +----+------------------------------------------+---------------------+ 2 rows in set (0.00 sec) mysql> truncate table test_restauration; Query OK, 0 rows affected (0.08 sec) mysql> select * from test_restauration; Empty set (0.00 sec)
Ensuite, je mets de côté le fichier binlog pour analyser les positions de l'insertion du record 2 et du truncate (pas grave dans mon exemple, je sais que je vais perdre le record 1 mais je considère que celui-ci sera restauré à partir d'une sauvegarde FULL)
Ensuite, je veux lire le fichier pour voir les positions des instructions pour ne restaurer que l'instruction DML insert et pas le truncate.
Code : Sélectionner tout - Visualiser dans une fenêtre à part [root@tmysql test_backup]# mysqlbinlog -u${MYSQL_USER} -h${MYSQL_HOST} --read-from-remote-server --raw localhost-bin.000017
Comme ceci, je vois l'instruction à restaurer et donc le range de position à configurer :
Quand je tente de restaurer à partir des positions trouvées je n'ai rien dans la table :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19 [root@tmysql test_backup]# mysqlbinlog -v /tmp/test_backup/localhost-bin.000017 [...] BINLOG ' 7InqYRMBAAAASAAAAK8BAAAAANgAAAAAAAEABXRtYXR0ABF0ZXN0X3Jlc3RhdXJhdGlvbgADAw8S A/8AAAABAQACAQhEJnje 7InqYR4BAAAAVgAAAAUCAAAAANgAAAAAAAEAAgAD/wACAAAAKFRFU1QgLSBSRVNUQVVSQVRJT04g QUZURVIgTVlTUUxEVU1QIFRPVE+Zq+q2LE/rtW4= '/*!*/; ### INSERT INTO `tmatt`.`test_restauration` ### SET ### @1=2 ### @2='TEST - RESTAURATION AFTER MYSQLDUMP TOTO' ### @3='2022-01-21 11:24:44' # at 517 [...]
J'avais au préalable ajouter un autre record dans la table pour valider que je n'allais pas jusqu'au truncate :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 [root@tmysql test_backup]# mysqlbinlog --start-position=4 --stop-position=625 /tmp/test_backup/localhost-bin.000017 | mysql -u${MYSQL_USER} -h${MYSQL_HOST} tmatt
Seulement, mon enregistrement perdu [TEST - RESTAURATION AFTER MYSQLDUMP TOTO] n'est pas restauré.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8 mysql> select * from test_restauration; +----+--------------------------------------------+---------------------+ | id | message | created_at | +----+--------------------------------------------+---------------------+ | 1 | TEST - RESTAURATION AFTER MYSQLDUMP TOTO 2 | 2022-01-21 11:38:33 | +----+--------------------------------------------+---------------------+ 1 row in set (0.00 sec)
Pouvez-vous m'aider s'il vous plait,
Merci à vous,
Matt
Partager