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)
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
Ensuite, je veux lire le fichier pour voir les positions des instructions pour ne restaurer que l'instruction DML insert et pas le truncate.

Comme ceci, je vois l'instruction à restaurer et donc le range de position à configurer :
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
 
[...]
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
 
[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
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
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)
Seulement, mon enregistrement perdu [TEST - RESTAURATION AFTER MYSQLDUMP TOTO] n'est pas restauré.

Pouvez-vous m'aider s'il vous plait,

Merci à vous,
Matt