IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Administration MySQL Discussion :

Restauration à partir binlog ne fait rien [MySQL-8.0]


Sujet :

Administration MySQL

  1. #1
    Membre habitué
    Inscrit en
    Octobre 2006
    Messages
    467
    Détails du profil
    Informations forums :
    Inscription : Octobre 2006
    Messages : 467
    Points : 144
    Points
    144
    Par défaut Restauration à partir binlog ne fait rien
    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

  2. #2
    Membre habitué
    Inscrit en
    Octobre 2006
    Messages
    467
    Détails du profil
    Informations forums :
    Inscription : Octobre 2006
    Messages : 467
    Points : 144
    Points
    144
    Par défaut
    Salut,

    Je me répond à moi même, j'ai trouvé l'origine de mon problème.

    J'ai trouvé mon incompréhension ici :
    The source database has already executed this transaction and cannot be executed repeatedly. The following parameters are required to execute.
    Use –skip-gtids=true parameter
    Source : https://blog.titanwolf.in/a?ID=01750...a-48271c2ed805

    Maintenant, j'ai bien mon record manquant et j'ai bypassé l'instruction truncate.



    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    [root@tmysql test_backup]# mysqlbinlog --start-position 923 --stop-position 1191 /tmp/test_backup/localhost-bin.000024 --skip-gtids=true |  mysql u${MYSQL_USER} -h${MYSQL_HOST} tmatt
     
    mysql> select * from test_restauration;
    +----+--------------------------------------+---------------------+
    | id | message                              | created_at          |
    +----+--------------------------------------+---------------------+
    |  1 | TEST - RESTAURATION BEFORE MYSQLDUMP | 2022-01-21 15:47:06 |
    |  2 | TEST - RESTAURATION AFTER MYSQLDUMP  | 2022-01-21 15:48:10 |
    +----+--------------------------------------+---------------------+
    2 rows in set (0.00 sec)
    Matt

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. lecture de fichier .X : comment récupérer le GUID ?
    Par antonien dans le forum DirectX
    Réponses: 1
    Dernier message: 17/02/2011, 22h34
  2. Réponses: 2
    Dernier message: 26/07/2010, 18h45
  3. Problème lecture HTML/CSS et comment verrouiller sa JDialog
    Par Invité dans le forum Débuter avec Java
    Réponses: 11
    Dernier message: 15/03/2010, 18h45
  4. Comment savoir si un fichier/répertoire est en lecture seule
    Par Guigui_ dans le forum Général Python
    Réponses: 3
    Dernier message: 29/12/2004, 16h05
  5. fichier modifier apres instruction de lecture???
    Par cyberwaves dans le forum C++
    Réponses: 4
    Dernier message: 09/09/2004, 22h02

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo