Maison > base de données > tutoriel mysql > le corps du texte

Comment récupérer rapidement des données après un mauvais fonctionnement de MySQL

黄舟
Libérer: 2017-01-18 11:11:43
original
1089 Les gens l'ont consulté

Système de gestion de bases de données relationnelles MySQL

MySQL est un petit système de gestion de bases de données relationnelles open source développé par la société suédoise MySQL AB. MySQL est largement utilisé sur les sites Web de petite et moyenne taille sur Internet. En raison de sa petite taille, de sa vitesse rapide, de son faible coût total de possession et surtout des caractéristiques de l'open source, de nombreux sites Web de petite et moyenne taille choisissent MySQL comme base de données de site Web afin de réduire le coût total de possession d'un site Web.


Cet article présente principalement la méthode de récupération rapide des données après un mauvais fonctionnement de MySQL. Les amis dans le besoin peuvent s'y référer

Résumé : Utilisez binlog Flash. retour des données de mauvaise opération.
En gros, tous les programmeurs qui travaillent avec des bases de données (il peut s'agir bien sûr de vos collègues) rencontreront un problème : comment restaurer rapidement MySQL après une mauvaise opération ? Par exemple, si vous supprimez une table et oubliez d’ajouter des restrictions, la table entière sera perdue. S'il s'agit toujours des données commerciales essentielles de l'environnement en ligne, cette question sera alors un gros problème. Il est très important de pouvoir restaurer rapidement les données après une mauvaise opération.

Solution traditionnelle

Reconstruisez l'instance avec une sauvegarde complète, puis utilisez une sauvegarde incrémentielle du journal binaire pour restaurer l'état avant l'erreur de fonctionnement. Ensuite, ignorez le mauvais fonctionnement de SQL et continuez à utiliser binlog. Cette méthode prend du temps et demande beaucoup de travail et ne vaut pas la peine d'être recommandée.

Utilisez binlog2sql pour flashback rapidement

Tout d'abord, vérifiez que le binlog est activé sur votre serveur MySQL et définissez les paramètres suivants :

[mysqld]
server-id = 1
log_bin = /var/log/mysql/mysql-bin.log
max_binlog_size = 100M
binlog-format = row
Copier après la connexion

Si le binlog n'est pas activé, il y a il n'y a pas de préréglage. Si le SQL de restauration est généré, il ne peut vraiment pas être annulé rapidement. Pour MySQL qui stocke des données commerciales importantes, il est fortement recommandé d'activer binlog.

Ensuite, installez l'outil open source binlog2sql. binlog2sql est un outil d'analyse de binlog simple et facile à utiliser. L'une de ses fonctions est de générer du SQL de restauration.

shell> git clone https://github.com/danfengcao/binlog2sql.git
shell> pip install -r requirements.txt
Copier après la connexion

Ensuite, nous pouvons générer du SQL de rollback.

Contexte : Xiao Ming a accidentellement supprimé les données de l'intégralité de la table tbl dans la bibliothèque de test vers 20 heures et a nécessité une restauration urgente.

test库tbl表原有数据
mysql> select * from tbl;
+----+--------+---------------------+
| id | name  | addtime       |
+----+--------+---------------------+
| 1 | 小赵  | 2016-12-10 00:04:33 |
| 2 | 小钱  | 2016-12-10 00:04:48 |
| 3 | 小孙  | 2016-12-13 20:25:00 |
| 4 | 小李  | 2016-12-12 00:00:00 |
+----+--------+---------------------+
4 rows in set (0.00 sec)

mysql> delete from tbl;
Query OK, 4 rows affected (0.00 sec)

20:28时,tbl表误操作被清空
mysql> select * from tbl;
Empty set (0.00 sec)
Copier après la connexion

Étapes pour restaurer les données :

1. Connectez-vous à MySQL et affichez le fichier binlog actuel

mysql> show master status;
+------------------+-----------+
| Log_name     | File_size |
+------------------+-----------+
| mysql-bin.000051 |    967 |
| mysql-bin.000052 |    965 |
+------------------+-----------+
Copier après la connexion

2. Le dernier fichier binlog est mysql-. bin.000052 , nous localisons ensuite l'emplacement du binlog du mauvais fonctionnement SQL. La personne qui a commis une erreur ne peut connaître que l’heure approximative de l’opération erronée, et nous filtrons les données en fonction de l’heure approximative.

shell> python binlog2sql/binlog2sql.py -h127.0.0.1 -P3306 -uadmin -p'admin' -dtest -ttbl --start-file='mysql-bin.000052' --start-datetime='2016-12-13 20:25:00'
 --stop-datetime='2016-12-13 20:30:00'
输出:
INSERT INTO `test`.`tbl`(`addtime`, `id`, `name`) VALUES ('2016-12-13 20:25:00', 3, '小孙'); #start 4 end 290 time 2016-12-13 20:25:46
INSERT INTO `test`.`tbl`(`addtime`, `id`, `name`) VALUES ('2016-12-13 20:26:00', 4, '小李'); #start 317 end 487 time 2016-12-13 20:26:26
UPDATE `test`.`tbl` SET `addtime`='2016-12-12 00:00:00', `id`=4, `name`='小李' WHERE `addtime`='2016-12-13 20:26:00' AND `id`=4 AND `name`='小李' LIMIT 1; 
#start 514 end 701 time 2016-12-13 20:27:07
DELETE FROM `test`.`tbl` WHERE `addtime`='2016-12-10 00:04:33' AND `id`=1 AND `name`='小赵' LIMIT 1; #start 728 end 938 time 2016-12-13 20:28:05
DELETE FROM `test`.`tbl` WHERE `addtime`='2016-12-10 00:04:48' AND `id`=2 AND `name`='小钱' LIMIT 1; #start 728 end 938 time 2016-12-13 20:28:05
DELETE FROM `test`.`tbl` WHERE `addtime`='2016-12-13 20:25:00' AND `id`=3 AND `name`='小孙' LIMIT 1; #start 728 end 938 time 2016-12-13 20:28:05
DELETE FROM `test`.`tbl` WHERE `addtime`='2016-12-12 00:00:00' AND `id`=4 AND `name`='小李' LIMIT 1; #start 728 end 938 time 2016-12-13 20:28:05
Copier après la connexion

3. Nous avons obtenu l'emplacement exact de l'erreur de fonctionnement SQL entre 728 et 938, et avons filtré davantage en fonction de l'emplacement, utilisé le mode flashback pour générer du SQL de restauration et vérifié si le SQL de restauration était correct

shell> python binlog2sql/binlog2sql.py -h127.0.0.1 -P3306 -uadmin -p'admin' -dtest -ttbl --start-file='mysql-bin.000052' --start-pos=3346 --end-pos=3556 -B
输出:
INSERT INTO `test`.`tbl`(`addtime`, `id`, `name`) VALUES ('2016-12-12 00:00:00', 4, '小李'); #start 728 end 938 time 2016-12-13 20:28:05
INSERT INTO `test`.`tbl`(`addtime`, `id`, `name`) VALUES ('2016-12-13 20:25:00', 3, '小孙'); #start 728 end 938 time 2016-12-13 20:28:05
INSERT INTO `test`.`tbl`(`addtime`, `id`, `name`) VALUES ('2016-12-10 00:04:48', 2, '小钱'); #start 728 end 938 time 2016-12-13 20:28:05
INSERT INTO `test`.`tbl`(`addtime`, `id`, `name`) VALUES ('2016-12-10 00:04:33', 1, '小赵'); #start 728 end 938 time 2016-12-13 20:28:05
Copier après la connexion

Confirmez que le SQL de restauration est correct et exécutez l'instruction de restauration. Connectez-vous à MySQL pour confirmer que la restauration des données a réussi.

shell> python binlog2sql.py -h127.0.0.1 -P3306 -uadmin -p'admin' -dtest -ttbl --start-file='mysql-bin.000052'
 --start-pos=3346 --end-pos=3556 -B | mysql -h127.0.0.1 -P3306 -uadmin -p'admin'

mysql> select * from tbl;
+----+--------+---------------------+
| id | name  | addtime       |
+----+--------+---------------------+
| 1 | 小赵  | 2016-12-10 00:04:33 |
| 2 | 小钱  | 2016-12-10 00:04:48 |
| 3 | 小孙  | 2016-12-13 20:25:00 |
| 4 | 小李  | 2016-12-12 00:00:00 |
+----+--------+---------------------+
Copier après la connexion

À ce stade, vous n'avez plus à craindre d'être viré.

Questions fréquemment posées

Certaines personnes peuvent se demander : comment puis-je annuler rapidement mon opération DDL par erreur ? Par exemple, une grande table est supprimée.

C’est difficile à faire. Parce que même en mode ligne, les opérations DDL n'enregistrent pas les modifications apportées à chaque ligne de données dans le journal binaire, le DDL ne peut donc pas être annulé via le journal binaire. Pour implémenter la restauration DDL, les anciennes données doivent être sauvegardées avant d'exécuter DDL. Quelqu'un a en effet obtenu une restauration rapide du DDL en modifiant le code source du serveur MySQL. J'ai trouvé le lin xiaobin d'Alibaba et soumis un correctif. Mais pour autant que je sache, très peu de sociétés Internet nationales ont appliqué cette fonctionnalité. Quant à la raison, je pense que la raison principale est que je suis trop paresseux pour m'en soucier. Il n'est pas nécessaire d'utiliser cette fonction basse fréquence. La raison secondaire est qu'elle ajoutera du stockage supplémentaire.

Par conséquent, un mauvais fonctionnement du DDL ne peut généralement être restauré que via une sauvegarde. Si l’entreprise ne peut plus utiliser de sauvegarde, alors il est vraiment recommandé d’acheter un billet d’avion. Ce qu'il faut faire? Exécuter

mysql En plus de binlog2sql, existe-t-il d'autres outils de restauration ?

Bien sûr. Ali Peng Lixun a ajouté la fonctionnalité de flashback à mysqlbinlog, qui devrait être la première fonction de flashback de mysql. Peng a résolu le problème de la restauration DML et a expliqué l'idée de conception consistant à utiliser binlog pour le flashback DML. La fonctionnalité de restauration DDL a également été proposée et mise en œuvre par l'équipe Alibaba. Ces deux fonctions sont innovantes et les outils de flashback apparus depuis sont essentiellement des imitations des deux ci-dessus. De plus, Inception open source de Qunar est un ensemble d'outils d'exploitation et de maintenance automatisés MySQL. Celui-ci est relativement lourd. Il prend en charge la restauration DML, non pas à partir du binlog, mais à partir de la sauvegarde. Il prend également en charge la structure de la table de restauration DDL. ~ Il existe une autre méthode appelée sauvegarde différée de l'esclave, qui consiste à configurer un esclave qui n'ajoute pas de trafic professionnel et à le retarder délibérément pendant un certain temps. Cela élimine en fait l'étape de récupération d'instance basée sur la méthode traditionnelle. Cette méthode consomme une machine supplémentaire et n'est pas recommandée.

S'il manque d'excellents articles sur d'excellents outils liés à la restauration de MySQL, veuillez nous le faire savoir.

Ce qui précède explique comment récupérer rapidement des données après un mauvais fonctionnement de MySQL. Pour plus de contenu connexe, veuillez faire attention au site Web PHP chinois (www.php.cn) !


Étiquettes associées:
source:php.cn
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal