Heim > Datenbank > MySQL-Tutorial > Hauptteil

So stellen Sie Daten nach einer Fehlbedienung von MySQL schnell wieder her

黄舟
Freigeben: 2017-01-18 11:11:43
Original
1094 Leute haben es durchsucht

Relationales MySQL-Datenbankverwaltungssystem

MySQL ist ein kleines relationales Open-Source-Datenbankverwaltungssystem, das von der schwedischen Firma MySQL AB entwickelt wurde. MySQL wird häufig auf kleinen und mittelgroßen Websites im Internet verwendet. Aufgrund der geringen Größe, der hohen Geschwindigkeit, der niedrigen Gesamtbetriebskosten und insbesondere der Eigenschaften von Open Source wählen viele kleine und mittlere Websites MySQL als Website-Datenbank, um die Gesamtbetriebskosten der Website zu senken.


In diesem Artikel wird hauptsächlich die Methode zur schnellen Wiederherstellung von Daten nach einer Fehlbedienung von MySQL vorgestellt.

Zusammenfassung: Verwenden Sie Binlog Flash Fehlbedienungsdaten zurück.
Grundsätzlich wird jeder Programmierer, der mit Datenbanken arbeitet (natürlich können es auch Ihre Kollegen sein), auf ein Problem stoßen: Wie kann man MySQL nach einer Fehlbedienung schnell zurücksetzen? Wenn Sie beispielsweise eine Tabelle löschen und vergessen, Einschränkungen hinzuzufügen, geht die gesamte Tabelle verloren. Wenn dies immer noch die Kerngeschäftsdaten der Online-Umgebung sind, wird diese Angelegenheit eine große Sache sein. Es ist sehr wichtig, die Daten nach einer Fehlbedienung schnell wiederherstellen zu können.

Traditionelle Lösung

Erstellen Sie die Instanz mit einer vollständigen Sicherung neu und verwenden Sie dann eine inkrementelle Binlog-Sicherung, um den Zustand vor der Fehloperation wiederherzustellen. Überspringen Sie dann die Fehloperation SQL und verwenden Sie weiterhin Binlog. Diese Methode ist zeit- und arbeitsintensiv und nicht empfehlenswert.

Verwenden Sie binlog2sql für einen schnellen Flashback

Bestätigen Sie zunächst, dass auf Ihrem MySQL-Server Binlog aktiviert ist, und legen Sie die folgenden Parameter fest:

[mysqld]
server-id = 1
log_bin = /var/log/mysql/mysql-bin.log
max_binlog_size = 100M
binlog-format = row
Nach dem Login kopieren

Wenn Binlog nicht aktiviert ist, dort ist nicht voreingestellt. Wenn das Rollback-SQL generiert wird, kann es wirklich nicht schnell zurückgesetzt werden. Für MySQL, das wichtige Geschäftsdaten speichert, wird dringend empfohlen, Binlog zu aktivieren.

Dann installieren Sie das Open-Source-Tool binlog2sql. binlog2sql ist ein einfaches und benutzerfreundliches Binlog-Parsing-Tool. Eine seiner Funktionen besteht darin, Rollback-SQL zu generieren.

shell> git clone https://github.com/danfengcao/binlog2sql.git
shell> pip install -r requirements.txt
Nach dem Login kopieren

Dann können wir Rollback-SQL generieren.

Hintergrund: Xiao Ming hat gegen 20 Uhr versehentlich die Daten der gesamten TBL-Tabelle in der Testbibliothek gelöscht und musste dringend zurückgesetzt werden.

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)
Nach dem Login kopieren

Schritte zum Wiederherstellen von Daten:

1. Melden Sie sich bei MySQL an und sehen Sie sich die aktuelle Binlog-Datei an

mysql> show master status;
+------------------+-----------+
| Log_name     | File_size |
+------------------+-----------+
| mysql-bin.000051 |    967 |
| mysql-bin.000052 |    965 |
+------------------+-----------+
Nach dem Login kopieren

2. bin.000052 , suchen wir dann den Binlog-Speicherort der Fehloperation SQL. Die Person, die einen Fehler gemacht hat, kann nur den ungefähren Zeitpunkt der Fehlbedienung kennen, und wir filtern die Daten basierend auf dem ungefähren Zeitpunkt.

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
Nach dem Login kopieren

3. Wir haben den genauen Ort der Fehloperations-SQL zwischen 728 und 938 ermittelt und basierend auf dem Ort weiter gefiltert, den Flashback-Modus verwendet, um Rollback-SQL zu generieren, und überprüft, ob der Rollback-SQL korrekt war

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
Nach dem Login kopieren

Bestätigen Sie, dass die Rollback-SQL korrekt ist, und führen Sie die Rollback-Anweisung aus. Melden Sie sich bei MySQL an, um zu bestätigen, dass das Daten-Rollback erfolgreich ist.

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 |
+----+--------+---------------------+
Nach dem Login kopieren

An diesem Punkt müssen Sie sich keine Sorgen mehr machen, gefeuert zu werden.

Häufig gestellte Fragen

Einige Leute fragen sich vielleicht: Wie kann ich meinen DDL-Vorgang aus Versehen schnell zurücksetzen? Beispielsweise fällt ein großer Tisch weg.

Es ist schwer zu tun. Da DDL-Vorgänge selbst im Zeilenmodus keine Änderungen in jeder Datenzeile im Binlog aufzeichnen, kann DDL nicht über das Binlog zurückgesetzt werden. Um ein DDL-Rollback zu implementieren, müssen alte Daten vor der Ausführung von DDL gesichert werden. Jemand hat tatsächlich ein schnelles Rollback von DDL erreicht, indem er den Quellcode des MySQL-Servers geändert hat. Ich habe Alibabas Xiaobin Lin gefunden und einen Patch eingereicht. Aber meines Wissens haben nur sehr wenige inländische Internetunternehmen diese Funktion genutzt. Was den Grund angeht, denke ich, dass der Hauptgrund darin liegt, dass ich zu faul bin, mich damit zu befassen. Es besteht keine Notwendigkeit, mich auf diese Niederfrequenzfunktion einzulassen. Der sekundäre Grund ist, dass dadurch etwas zusätzlicher Speicher hinzugefügt wird.

Daher können DDL-Fehlfunktionen im Allgemeinen nur durch ein Backup wiederhergestellt werden. Wenn das Unternehmen kein Backup mehr nutzen kann, ist der Kauf eines Flugtickets unbedingt zu empfehlen. Was zu tun? Führen Sie

mysql aus. Gibt es neben binlog2sql noch andere Rollback-Tools?

Natürlich. Ali Peng Lixun hat die Flashback-Funktion zu mysqlbinlog hinzugefügt, die die früheste Flashback-Funktion in MySQL sein sollte. Peng löste das Problem des DML-Rollbacks und erläuterte die Designidee, Binlog für DML-Flashback zu verwenden. Die DDL-Rollback-Funktion wurde ebenfalls vom Alibaba-Team vorgeschlagen und implementiert. Diese beiden Funktionen sind innovativ und die seitdem erschienenen Flashback-Tools sind im Grunde Nachahmungen der beiden oben genannten. Darüber hinaus handelt es sich bei Qunars Open-Source-Tool um eine Reihe automatisierter Betriebs- und Wartungstools. Es unterstützt kein DML-Rollback, sondern auch ein Rollback der DDL-Tabellenstruktur ~ Es gibt eine andere Methode namens „Slave Delayed Backup“, bei der ein Slave eingerichtet wird, der keinen Geschäftsverkehr hinzufügt, und dieser absichtlich für einen bestimmten Zeitraum verzögert wird. Dadurch entfällt tatsächlich der Instanzwiederherstellungsschritt, der auf der herkömmlichen Methode basiert. Diese Methode verbraucht einen zusätzlichen Computer und wird nicht empfohlen.

Wenn herausragende Artikel über hervorragende Tools im Zusammenhang mit dem MySQL-Rollback fehlen, teilen Sie uns dies bitte mit.

Das Obige ist der Inhalt, wie man Daten nach einer Fehlbedienung von MySQL schnell wiederherstellen kann. Weitere verwandte Inhalte finden Sie auf der chinesischen PHP-Website (www.php.cn)!


Verwandte Etiketten:
Quelle:php.cn
Erklärung dieser Website
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
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage