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.
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='2013-02-04 10:00:00' --stop-date='2013-02-04 12:08:45' /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 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!