MySQL-Schnellwiederherstellungslösung basierend auf dem Zeitpunkt

MySQL-Schnellwiederherstellungslösung basierend auf dem Zeitpunkt

Der Grund für das Schreiben dieses Artikels ist, dass ich vor ein paar Tagen eines Nachts, als ich gerade Feierabend machen wollte, plötzlich von der Geschäftsseite die Daten in einer Tabelle wiederherstellen musste. Ich fragte nach der damaligen Situation und sie war ungefähr so: Die Geschäftsseite führte versehentlich eine Aktualisierungsoperation in einer Tabelle aus. Vielleicht war die Where-Bedingung nicht richtig geschrieben, was dazu führte, dass die Daten in der Tabelle beschädigt wurden. Die Daten wurden jedoch noch nicht auf die Festplatte geschrieben, nur der Wert im Speicher wurde geändert und jetzt müssen die vorherigen Daten wiederhergestellt werden. Glücklicherweise handelt es sich bei diesen Daten um die Preise bestimmter Produkte auf der Plattform. Grundsätzlich gibt es eine begrenzte Anzahl von Produkten und die Preiswerte sind alle fest. Diese Preisliste wurde zuvor gesichert, sodass die Daten einer neuen Kopie der Preisliste direkt für ihn importiert wurden und dieses Problem gelöst wurde.

Damals habe ich überlegt: Wenn ich kein Backup, sondern nur ein Binärprotokoll habe und dieses Problem beheben muss, gibt es dann eine bessere Möglichkeit? Erstellen Sie eine neue Instanz, stellen Sie die gesamte Datenbank wieder her und wenden Sie dann das gesicherte Binärprotokoll an, wobei Sie es bis zu dem Zeitpunkt zurückverfolgen, als die Daten beschädigt wurden.

Verwenden Sie das Tool mysqlbinlog, um Transaktionen wiederzugeben. Diese Methode birgt viele Fallstricke, wie zum Beispiel:

1. Sie können jeweils nur einen mysqlbinlog-Befehl ausführen, um jeweils eine Binlog-Datei wiederzugeben. Sie können nicht mehrere Befehle parallel ausführen, da beim Wiedergeben eine temporäre Tabelle generiert wird, was zu Konflikten und Fehlern führt.

2. Es ist eine atomare Operation. Wenn der Vorgang mittendrin abbricht, lässt sich nur schwer feststellen, wo der Fehler aufgetreten ist, und es ist schwierig, den Vorgang von einem früheren Zeitpunkt aus neu zu starten. Es gibt viele Gründe für einen Fehler: Wartezeitüberschreitung der InnoDB-Sperre aufgrund einiger gleichzeitiger Transaktionen, unterschiedliche Max_Allowed_Packet-Einstellungen von Server und Client, Verbindungsverlust mit dem MySQL-Server während der Abfrage usw.

Also habe ich Perconas Blog durchgeblättert, eine Methode gefunden, das Wesentliche gelesen und sie grob aufgezeichnet. Ich habe diese Methode noch nicht selbst implementiert, sondern nur hier aufgezeichnet. Wenn ich in Zukunft Zeit habe, kann ich es selbst ausprobieren, um zu sehen, ob ich dieses Problem effizienter lösen kann.

Die allgemeine Idee ist wie folgt:

Zwei zusätzliche Maschinen, die erste wird zum Wiederherstellen der Sicherungsergebnisdaten verwendet, und die andere wird verwendet, um das Binlog des ursprünglichen Masters auf die Instanz zu kopieren und dann den ursprünglichen Master zu simulieren. Dann stellen die erste und die zweite Maschine eine Master-Slave-Beziehung her, ändern den Master auf die zweite Maschine, positionieren das Sicherungsergebnis (Binlog-Name und -Position in xtrabackup_binlog_info), synchronisieren dann mit dem Fehlerbetriebspunkt, exportieren die wiederhergestellte Tabelle und stellen sie dann auf dem ursprünglichen Produktionsmaster wieder her.

Die einzelnen Schritte sind wie folgt:

1. Bereiten Sie eine Maschine vor, um die neuesten Sicherungsergebnisdaten der Instanz zu sichern und wiederherzustellen.

2. Bereiten Sie eine andere Maschine, eine neue Instanz vor, kopieren Sie die Binärprotokolldatei des ursprünglichen Masters in das Datenverzeichnis der Instanz, starten Sie eine leere Instanz (Server-ID ist dieselbe wie die des ursprünglichen Masters, --log_bin=Master-bin – der Name der Binärprotokolldatei bleibt derselbe wie beim ursprünglichen Master;), stoppen Sie sie dann, löschen Sie alle automatisch erstellten Binärprotokolle, dekomprimieren und kopieren Sie alle erforderlichen Binärprotokolle (von der ursprünglichen Produktionsinstanz) in ihr Datenverzeichnis und starten Sie sie dann neu.

Der Speicherort der neuesten Sicherungsdaten:

Wenn der Start normal ist, stellen Sie eine Verbindung zu MySQL her und zeigen Sie die Binärprotokollinformationen an:

3. Stellen Sie eine Synchronisationsbeziehung her und stoppen Sie vor der Position der falschen Operation

 ÄNDERN SIE MASTER IN 

MASTER_HOST='127.0.0.1',

MASTER_PORT=3307,

MASTER_USER='root',

MASTER_PASSWORD='geheim',

MASTER_LOG_FILE='master-bin.000007', MASTER_LOG_POS=1518932;

SLAVE STARTEN BIS 

MASTER_LOG_FILE = 'Protokollname', 

MASTER_LOG_POS = log_pos

oder

STARTEN SIE SLAVE SQL_THREAD BIS

 SQL_AFTER_GTIDS =

 3E11FA47-71CA-11E1-9E33-C80AA9429562:11-56

SLAVE-STATUS ANZEIGEN;

Dies entspricht der Verwendung einer weiteren Instanz, wodurch die Nutzungsrate der Binärprotokolle und die Erfolgsrate der Binärprotokollnutzung erhöht werden. Ob diese Methode praktikabel ist, muss noch überprüft werden. Nach der vom Autor im Artikel beschriebenen Idee ist sie besser als die Methode, Binlog auf einer einzelnen Instanz anzuwenden, da, sobald beim Anwenden von Binlog ein Fehler auftritt, schnell der Punkt ermittelt werden kann, an dem der Fehler aufgetreten ist, was uns hilft, das Problem schnell zu lösen.

Oben finden Sie Einzelheiten zur zeitbasierten Schnellwiederherstellungslösung von MySQL. Weitere Informationen zur schnellen MySQL-Wiederherstellung finden Sie in den anderen verwandten Artikeln auf 123WORDPRESS.COM!

Das könnte Sie auch interessieren:
  • Tiefgreifendes Verständnis der logischen Architektur von MySQL
  • Gespeicherte MySQL-Prozeduren, d. h. eine Zusammenfassung allgemeiner logischer Wissenspunkte
  • MySQL Advanced Learning Notes (Teil 3): Einführung in die logische Architektur von MySQL, detaillierte Erläuterung der MySQL-Speicher-Engine
  • Detaillierte Erläuterung des MySQL-Ausführungsprinzips, der logischen Schichtung und der Änderung der Datenbankverarbeitungs-Engine
  • Detaillierte Erläuterung der logischen Architektur von MySQL
  • Detaillierte Erklärung, wie Sie die Fallstricke beim Ersetzen von logischem SQL in MySQL vermeiden können
  • Mit PHP auf die MySql-Datenbank zugreifen - logische Operationen und Beispiele zum Hinzufügen, Löschen, Ändern und Prüfen
  • Logische Beurteilung und bedingte Kontrolle von gespeicherten MySQL-Prozeduren
  • MySQL verwendet frm-Dateien und ibd-Dateien, um Tabellendaten wiederherzustellen
  • MySQL verwendet Binlog-Protokolle zur Implementierung der Datenwiederherstellung
  • Implementierung der MySQL5.7 mysqldump-Sicherung und -Wiederherstellung
  • Zusammenfassung der Tests für logische MySQL-Sicherungen und -Wiederherstellungen

<<:  Detaillierte Erklärung des Nginx Reverse-Proxy-Beispiels

>>:  Analyse von 2 Implementierungsmethoden zum Konfigurieren der JNID-Datenquelle in Tomcatc3p0

Artikel empfehlen

Detaillierte Erklärung der neuen Funktionen von ES9: Asynchrone Iteration

Inhaltsverzeichnis Asynchrones Durchlaufen Asynch...

Der Unterschied zwischen redundanten und doppelten Indizes in MySQL

MySQL ermöglicht das Erstellen mehrerer Indizes f...

Detaillierte Erläuterung der Nginx-Zugriffsbeschränkungskonfiguration

Was ist die Nginx-Zugriffsbeschränkungskonfigurat...

CocosCreator Erste Schritte Tutorial: Netzwerkkommunikation

Übersicht zur Netzwerkkommunikation Bei der Entwi...

Einige Schlussfolgerungen zur Entwicklung mobiler Websites

Die mobile Version der Website sollte zumindest ü...

So packen Sie das Projekt per Idee in Docker

Viele Freunde wollten schon immer wissen, wie man...

Analyse des Unterschieds zwischen Emits und Attrs in Vue3

Inhaltsverzeichnis abschließend Praxisanalyse Erw...

MySQL-Datenbank löscht doppelte Daten und behält nur eine Methodeninstanz bei

1. Problemeinführung Nehmen Sie ein Szenario an, ...

Detaillierte Erklärung zum Ersetzen in ein Beispiel in MySQL

Detaillierte Erklärung zum Ersetzen in ein Beispi...

MySQL-Passwort ist korrekt, aber keine lokale Anmeldung möglich -1045

MySQL-Passwort ist korrekt, aber keine lokale Anm...

HTML+CSS zum Erstellen eines Dropdown-Menüs

1. Beispiel einer Dropdown-Liste Der Code lautet ...