Heim  >  Artikel  >  Datenbank  >  Beispielcode-Freigabe zum Datenwiederherstellungsvorgang nach versehentlichem Löschen der MySQL-Datenbank

Beispielcode-Freigabe zum Datenwiederherstellungsvorgang nach versehentlichem Löschen der MySQL-Datenbank

黄舟
黄舟Original
2017-03-27 13:15:291362Durchsuche

Der folgende Editor bringt Ihnen einen Artikel über die Anweisungen zur Datenwiederherstellung für die MySQL-Datenbank nach versehentlichem Löschen. Der Herausgeber findet es ziemlich gut, deshalb werde ich es jetzt mit Ihnen teilen und es allen als Referenz geben. Folgen wir dem Editor und werfen wir einen Blick darauf

Bei der täglichen Betriebs- und Wartungsarbeit ist die Sicherung der MySQL-Datenbank von entscheidender Bedeutung! Die Bedeutung der Datenbank für die Website macht es für uns unmöglich, bei der Verwaltung von MySQL-Daten zu scheitern!
Dann werden die Leute unweigerlich Fehler machen und eines Tages wird der Fehler gemacht, die Datenbank zu löschen. ? ?

Im Folgenden finden Sie eine Erläuterung des Wiederherstellungsplans nach versehentlichem Löschen der MySQL-Datenbank.

1. Arbeitsszenario

(1) Die MySQL-Datenbank wird bei 12 automatisch vollständig gesichert: 00 jeden Abend.
(2) Eines Morgens um 9 Uhr fiel ein Kollege bei der Arbeit in Ohnmacht und ließ eine Datenbank fallen!
(3) Notfallwiederherstellung erforderlich! Für die Datenwiederherstellung können Sicherungsdatendateien und inkrementelle Binlog-Dateien verwendet werden.

2. Ideen zur Datenwiederherstellung

(1) Verwenden Sie die in der vollständigen SQL-Datei aufgezeichneten Daten CHANGE MASTER-Anweisung, Binlog-Datei und ihre Standortpunktinformationen, finden Sie den inkrementellen Teil in der Binlog-Datei.
(2) Verwenden Sie den Befehl mysqlbinlog, um die obige Binlog-Datei in eine SQL-Datei zu exportieren und entfernen Sie die Drop-Anweisung .
(3) Vollständige Daten können durch den Export von SQL-Dateien vollständiger Dateien und inkrementeller Binlog-Dateien wiederhergestellt werden.

3. Beispiel

------------- - -------------------------
Stellen Sie zunächst sicher, dass in MySQL die Binlog-Funktion aktiviert ist Fügen Sie die [ mysqld]-Block in der Datei /etc/my.cnf:
log-bin=mysql-bin
und starten Sie dann den MySQL-Dienst neu
-------------- - ------------------------

(1) Erstellen Sie eine Tabelle „Kunden“ unter der Ops-Bibliothek

mysql> use ops;
mysql> create table customers(
-> id int not null auto_increment,
-> name char(20) not null,
-> age int not null,
-> primary key(id)
-> )engine=InnoDB;
Query OK, 0 rows affected (0.09 sec)

mysql> show tables;
+---------------+
| Tables_in_ops |
+---------------+
| customers |
+---------------+
1 row in set (0.00 sec)

mysql> desc customers;
+-------+----------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+-------+----------+------+-----+---------+----------------+
| id | int(11) | NO | PRI | NULL | auto_increment |
| name | char(20) | NO | | NULL | |
| age | int(11) | NO | | NULL | |
+-------+----------+------+-----+---------+----------------+
3 rows in set (0.02 sec)

mysql> insert into customers values(1,"wangbo","24");
Query OK, 1 row affected (0.06 sec)

mysql> insert into customers values(2,"guohui","22");
Query OK, 1 row affected (0.06 sec)

mysql> insert into customers values(3,"zhangheng","27");
Query OK, 1 row affected (0.09 sec)

mysql> select * from customers;
+----+-----------+-----+
| id | name | age |
+----+-----------+-----+
| 1 | wangbo | 24 |
| 2 | guohui | 22 |
| 3 | zhangheng | 27 |
+----+-----------+-----+
3 rows in set (0.00 sec)

(2) Führen Sie nun eine vollständige Sicherung durch

[root@vm-002 ~]# mysqldump -uroot -p -B -F -R -x --master-data=2 ops|gzip >/opt/backup/ops_$(date +%F).sql.gz
Enter password: 
[root@vm-002 ~]# ls /opt/backup/ops_2016-09-25.sql.gz
-----------------

Parameterbeschreibung:

-B: Datenbank angeben

-F: Protokoll aktualisieren
-R: Sicherung
gespeicherte Prozedurusw.-x: Tabelle sperren
-- Master -data: Fügen Sie die CHANGE MASTER-Anweisung, die Binlog-Datei und die Standortinformationen zur Sicherungsanweisung hinzu
-----------------

(3) Daten erneut einfügen

mysql> insert into customers values(4,"liupeng","21");
Query OK, 1 row affected (0.06 sec)

mysql> insert into customers values(5,"xiaoda","31");
Query OK, 1 row affected (0.07 sec)

mysql> insert into customers values(6,"fuaiai","26");
Query OK, 1 row affected (0.06 sec)

mysql> select * from customers;
+----+-----------+-----+
| id | name | age |
+----+-----------+-----+
| 1 | wangbo | 24 |
| 2 | guohui | 22 |
| 3 | zhangheng | 27 |
| 4 | liupeng | 21 |
| 5 | xiaoda | 31 |
| 6 | fuaiai | 26 |
+----+-----------+-----+
6 rows in set (0.00 sec)

(4) Die Testdatenbank wurde versehentlich gelöscht

mysql> drop database ops;
Query OK, 1 row affected (0.04 sec)
Zu diesem Zeitpunkt, zwischen der vollständigen Vorbereitung und dem Moment der Fehlbedienung, befinden sich die vom Benutzer geschriebenen Daten im Binlog und müssen wiederhergestellt werden!

(5) Sehen Sie sich die neu hinzugefügte Binlog-Datei nach der vollständigen Vorbereitung an

[root@vm-002 ~]# cd /opt/backup/
[root@vm-002 backup]# ls
ops_2016-09-25.sql.gz
[root@vm-002 backup]# gzip -d ops_2016-09-25.sql.gz 
[root@vm-002 backup]# ls
ops_2016-09-25.sql
[root@vm-002 backup]# grep CHANGE ops_2016-09-25.sql 
-- CHANGE MASTER TO MASTER_LOG_FILE='mysql-bin.000002', MASTER_LOG_POS=106;
Dies ist der Speicherort der Binlog-Datei zum Zeitpunkt der vollständigen Vorbereitung

Das heißt, Zeile 106 von MySQL -bin.000002, also vor der Datei. Die Daten in der Binlog-Datei sind bereits in dieser vollständigen SQL-Datei enthalten

(6) Verschieben Sie die Binlog-Datei und exportieren Sie sie als SQL-Datei, und Entfernen Sie die Drop-Anweisung

Überprüfen Sie das Datenspeicherverzeichnis von MySQL. Aus dem Folgenden ist ersichtlich, dass es sich unter /var/lib/mysql befindet

[root@vm-002 backup]# ps -ef|grep mysql
root 9272 1 0 01:43 pts/1 00:00:00 /bin/sh /usr/bin/mysqld_safe 
--datadir=/var/lib/mysql --socket=/var/lib/mysql/mysql.sock --pid-file=/var/run/mysqld/mysqld.pid --basedir=/usr --user=mysql
mysql 9377 9272 0 01:43 pts/1 00:00:00 /usr/libexec/mysqld --basedir=/usr 
--datadir=/var/lib/mysql --user=mysql --log-error=/var/log/mysqld.log --pid-file=/var/run/mysqld/mysqld.pid --socket=/var/lib/mysql/mysql.sock
[root@vm-002 backup]# cd /var/lib/mysql/
[root@vm-002 mysql]# ls
ibdata1 ib_logfile0 ib_logfile1 mysql mysql-bin.000001 mysql-bin.000002 mysql-bin.index mysql.sock test
[root@vm-002 mysql]# cp mysql-bin.000002 /opt/backup/

Exportieren Sie die Binlog-Datei in die SQL-Datei und vim. Bearbeiten Sie sie, um die Drop-Anweisung zu entfernen

[root@vm-002 backup]# mysqlbinlog -d ops mysql-bin.000002 >002bin.sql
[root@vm-002 backup]# ls
002bin.sql mysql-bin.000002 ops_2016-09-25.sql
[root@vm-002 backup]# vim 002bin.sql #删除里面的drop语句

Hinweis:

in der Wiederherstellung Die Binlog-Datei muss vor der vollständigen Vorbereitung der Daten verschoben werden. Andernfalls werden während des Wiederherstellungsprozesses weiterhin Anweisungen in das Binlog geschrieben, was schließlich zu einer inkrementellen Wiederherstellung führt Datenteil wird unübersichtlich

(7) Daten wiederherstellen

[root@vm-002 backup]# mysql -uroot -p < ops_2016-09-25.sql 
Enter password: 
[root@vm-002 backup]#
Überprüfen Sie die Datenbank, um zu sehen, ob die Ops-Bibliothek vorhanden ist

mysql> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| mysql |
| ops |
| test |
+--------------------+
4 rows in set (0.00 sec)

mysql> use ops;
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> select * from customers;
+----+-----------+-----+
| id | name | age |
+----+-----------+-----+
| 1 | wangbo | 0 |
| 2 | guohui | 0 |
| 3 | zhangheng | 0 |
+----+-----------+-----+
3 rows in set (0.00 sec)
Zu diesem Zeitpunkt werden die Daten zum Zeitpunkt der vollständigen Sicherung wiederhergestellt

Verwenden Sie dann die Datei 002bin.sql, um die neuen Daten zwischen dem Zeitpunkt der vollständigen Sicherung und dem Löschen wiederherzustellen Dieser Teil der Daten wurde ebenfalls wiederhergestellt! !

[root@vm-002 backup]# mysql -uroot -p ops <002bin.sql
Enter password: 
[root@vm-002 backup]#
Das Obige ist der Beispielprozess der inkrementellen Datenwiederherstellung einer MySQL-Datenbank!

mysql> select * from customers;
+----+-----------+-----+
| id | name | age |
+----+-----------+-----+
| 1 | wangbo | 24 |
| 2 | guohui | 22 |
| 3 | zhangheng | 27 |
| 4 | liupeng | 21 |
| 5 | xiaoda | 31 |
| 6 | fuaiai | 26 |
+----+-----------+-----+
6 rows in set (0.00 sec)

**************************************** **** ********

Abschließend noch ein paar Punkte zur Zusammenfassung:


1) Dieser Fall gilt für die Reparatur von Fehlbedienungen, die durch künstliche SQL-Anweisungen oder Hot-Standby-Situationen ohne Master-Slave-Replikation und Ausfallzeiten verursacht wurden

2) Die Wiederherstellungsbedingung ist, dass MySQL die Binlog-Protokollfunktion aktivieren muss und alle Daten vollständig vorbereitet und inkrementell sein müssen

3) Während der Wiederherstellung wird empfohlen, externe Aktualisierungen zu stoppen Das heißt, es ist verboten, die Datenbank zu aktualisieren

4) Stellen Sie zuerst das gesamte Volume wieder her, stellen Sie dann die inkrementellen Protokolle nach der vollständigen Sicherungszeit der Reihe nach in SQL-Dateien wieder her und löschen Sie dann die problematischen SQL-Anweisungen in die Datei (Sie können auch Zeit- und Ortspunkte verwenden) und dann in der Datenbank wiederherstellen.

Das obige ist der detaillierte Inhalt vonBeispielcode-Freigabe zum Datenwiederherstellungsvorgang nach versehentlichem Löschen der MySQL-Datenbank. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn