Maison  >  Article  >  base de données  >  Comment restaurer une table supprimée dans MySQL ? Méthode MySQL pour récupérer les données d'une table supprimée accidentellement

Comment restaurer une table supprimée dans MySQL ? Méthode MySQL pour récupérer les données d'une table supprimée accidentellement

黄舟
黄舟original
2017-03-28 13:28:3119467parcourir

L'éditeur ci-dessous vous proposera un article mysql Comment récupérer des données de tables supprimées accidentellement (à lire absolument). L'éditeur pense que c'est plutôt bien, alors je vais le partager avec vous maintenant et le donner comme référence. Suivons l’éditeur et jetons un coup d’œil.

Comment restaurer une table supprimée dans MySQL ? Méthode MySQL pour récupérer les données d'une table supprimée accidentellement

Si vous avez une sauvegarde, c'est très simple. Il vous suffit de générer des données de sauvegarde récentes, puis d'utiliser mysqlbinlog pour récupérer les données après le moment de la sauvegarde, et puis restaurez-le.

Cela peut être gênant s'il n'y a pas de sauvegarde, et le coût de récupération des données est également très élevé.

Ce qui suit est une introduction à mysqlbinlog pour récupérer des données après le point temporel de sauvegarde Méthode :

Faites une expérience simple, supprimez les données de la table mysql , puis utilisez mysqlbinlog pour récupérer les données de la table que vous venez de supprimer.

Heure de création de la table d'application et insertion des données

Principe : mysqlbinlog

Prérequis : mysql a le journal bin activé

Avant le test suppression :

mysql> show tables;
+-----------------------+
| Tables_in_report_sina |
+-----------------------+
| app     |
| test     |
+-----------------------+

mysql> select now();
+---------------------+
| now()    |
+---------------------+
| 2013-02-04 11:45:44 |
+---------------------+
1 row in set (0.01 sec)


mysql> select count(1) from app;
+----------+
| count(1) |
+----------+
|  10 |
+----------+
1 row in set (0.01 sec)

Commencer à supprimer les données :

mysql> delete from app where id =1;
Query OK, 1 row affected (0.00 sec)

mysql> 
mysql> delete from app where id <6;
Query OK, 4 rows affected (0.01 sec)


mysql> select count(1) from app;
+----------+
| count(1) |
+----------+
|  5 |
+----------+
1 row in set (0.00 sec)

 

mysql> select now();
+---------------------+
| now()    |
+---------------------+
| 2013-02-04 12:08:45 |
+---------------------+

Commencer la récupération data :

1. Recherchez l'emplacement du journal du bac :

/app/mysql/log

-rw-rw---- 1 mysql mysql 17K Feb 4 11:43 alert.log
-rw-rw---- 1 mysql mysql 1.0K Nov 1 14:52 master-bin.000001
-rw-rw---- 1 mysql mysql 126 Dec 25 14:00 master-bin.000002
-rw-rw---- 1 mysql mysql 126 Dec 25 14:02 master-bin.000003
-rw-rw---- 1 mysql mysql 126 Dec 25 14:02 master-bin.000004
-rw-rw---- 1 mysql mysql 107 Dec 25 14:02 master-bin.000005
-rw-rw---- 1 mysql mysql 13K Feb 4 12:02 master-bin.000006

Vous pouvez voir que le journal du bac récemment modifié n'est que master-bin.000006

(Si vous supprimez accidentellement plusieurs logs bin, vous devrez parcourir les logs bin un par un pour récupérer les données.)

Enregistrez toutes les instructions SQL exécutées pendant cette période dans le fichier. fichier sql à restaurer.

mysqlbinlog --start-date=&#39;2013-02-04 10:00:00&#39; --stop-date=&#39;2013-02-04 12:08:45&#39; /app/mysql/log/master-bin.000006 >/app/mysql/mysql_restore_20130204.sql

Bien sûr, dans l'environnement réseau actuel, cette heure peut ne pas être aussi précise et il y aura des interférences provenant d'autres instructions SQL de transaction.

Créer une base de données temporaire

create database for_bak;

Exporter l'application de table supprimée accidentellement dans la base de données actuelle

mysqldump -uroot -ppwd my_db app > /app/mysql/app.sql

Importez les données actuelles dans la table temporaire :

mysql -root -ppwd for_bak < /app/mysql/app.sql

Jetons un coup d'œil à /app/mysql/mysql_restore_20130204 .sql Une partie du contenu : (Vous pouvez voir l'instruction de suppression maléfique)

SET TIMESTAMP=1359949544/*!*/;
BEGIN
/*!*/;
# at 12878
#130204 11:45:44 server id 1 end_log_pos 12975 Query thread_id=5 exec_time=974 error_code=0
SET TIMESTAMP=1359949544/*!*/;
delete from app where id =1
/*!*/;
# at 12975
#130204 11:45:44 server id 1 end_log_pos 13002 Xid = 106
COMMIT/*!*/;
# at 13002
#130204 11:45:44 server id 1 end_log_pos 13077 Query thread_id=5 exec_time=1013 error_code=0
SET TIMESTAMP=1359949544/*!*/;
BEGIN
/*!*/;
# at 13077
#130204 11:45:44 server id 1 end_log_pos 13175 Query thread_id=5 exec_time=1013 error_code=0
SET TIMESTAMP=1359949544/*!*/;
delete from app where id <6
/*!*/;
# at 13175
#130204 11:45:44 server id 1 end_log_pos 13202 Xid = 107
COMMIT/*!*/;
DELIMITER ;
# End of log file

Vous pouvez voir quand les données ont été supprimées. Vous pouvez également utiliser select from_unixtime(1359949544); pour interroger l'heure spécifique

Ce qui est gratifiant, c'est que l'instruction create table app et l'instruction insert se trouvent également dans ce fichier. Après avoir supprimé manuellement l'instruction de suppression, recherchez le fichier SQL

récupéré par mysqlbinlog dans la bibliothèque temporaire pour restaurer l'application à l'état

avant sa suppression. Importez ensuite les données de la base de données temporaire vers les données du réseau en direct (ce n'est pas l'objet de cet article).

S'il n'y a pas de sauvegarde, il peut être très difficile de récupérer toutes les données liées à la table app, d'autant plus qu'il existe de nombreux fichiers binlog et chacun est relativement volumineux.

Dans ce cas, vous ne pouvez utiliser mysqlbinlog que pour récupérer les enregistrements SQL des opérations DML liées à la table app un par un depuis la création de l'application jusqu'à aujourd'hui, puis intégrer et restaurer les données.

Je pense que cette situation est généralement relativement rare. Même si cela est gênant, il n’est pas impossible de s’en remettre.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
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