Existe-t-il un moyen de vérifier et de voir si une requête est terminée? J'ai exécuté 3 requêtes de mise à jour très longues (+/- 25 heures chacune) alors que je sortais en vacances la semaine dernière. Malheureusement, quelque part au cours de la semaine, l'alimentation a été coupée et la machine exécutant MYSQL s'est arrêtée. Existe-t-il un moyen de vérifier et de voir laquelle des 3 (ou des trois) requêtes a été terminée?
Je sais que je pourrais vérifier si les données ont été mises à jour, mais les NULL sont à prévoir avec une exécution correcte et complète et il y a 48 millions de lignes de données à parcourir. Des pensées?
Réponses:
Si vous exécutez avec des journaux binaires activés, cela peut être vérifié avec une fiabilité relativement élevée.
Tout d'abord, pour voir si les journaux binaires sont effectivement activés, exécutez:
S'ils sont activés, vous devriez obtenir une sortie comme celle-ci:
Sinon, vous obtiendrez un message d'erreur.
Maintenant, si les journaux binaires sont activés, toute validation réussie est également écrite dans les journaux binaires. Je dis «commit», mais la vérité est que toute opération réussie, même sur des tables non transactionnelles telles que MyISAM, y est écrite. Mais, pour être honnête, pour avoir une certitude sur le résultat de vos requêtes, j'espère que pour vous, vous utilisez un moteur transactionnel comme InnoDB, sinon vous ne pouvez être sûr de rien.
OK, donc en supposant maintenant que les journaux binaires sont activés et que vos tables sont transactionnelles (espérons-le InnoDB), une exécution réussie de vos requêtes devrait être écrite dans les journaux binaires.
Vous devez maintenant rechercher le journal binaire correspondant et y rechercher la requête. Si vous trouvez la requête - bien! Sinon - ce n'est probablement pas là. J'expliquerai sous peu.
Quel journal binaire contient votre requête? Regardez les fichiers journaux binaires eux-mêmes, généralement dans votre répertoire de données. Recherchez leurs horodatages. À la mise sous tension, un nouveau journal binaire a été créé. Trouve le. Vos requêtes sont très probablement dans le journal binaire avant celui-ci. C'est une supposition. Il pourrait également en être un avant cela, etc. Mais c'est une bonne supposition.
Maintenant, en utilisant l'
mysqlbinlog
utilitaire, exécutez, à partir de la ligne de commande, quelque chose comme ceci:Remplacez le nom de fichier par celui que vous pensez contenir la requête.
Cela générera toutes les requêtes de ce fichier journal binaire dans la sortie standard. Sous Unix, utilisez
grep
pour trouver votre requête:Sous Windows, bonne chance. Ouvrez avec notepad ++ ou quelque chose et recherchez manuellement.
La requête est-elle là? Génial - vous savez qu'il a été commis.
La requête n'est-elle pas là? Besoin de vérifier les
sync_binlog
paramètres. Est-ce 1 ? Ensuite, requête non dans le journal binaire ==> requête non validée. Mais s'ilsync_binlog
n'est pas égal à 1 , il est possible que la requête ait été validée mais pas dans le journal binaire, car le plantage peut s'être produit juste après lecommit
et juste avant le vidage du journal binaire sur le disque. Vous devez ensuite revenir à d'autres moyens.Ceux-ci étant: (et, espérons-le, encore une fois, vous utilisez InnoDB): recherchez une seule ligne qui peut identifier le résultat de la requête. Avec InnoDB, vous obtenez «tout ou rien». Si vous pouvez être certain qu'une seule ligne est affectée par la requête, vous pouvez être sûr que la requête est terminée.
edit: bien sûr, si la journalisation lente est activée, vous pouvez vous attendre à ce qu'une telle requête y soit également enregistrée une fois terminée ...
Bonne chance!
la source