MySQL Serie 12 Backup und Wiederherstellung

MySQL Serie 12 Backup und Wiederherstellung

Tutorial-Reihe

MySQL-Reihe: Grundlegende Konzepte der relationalen MySQL-Datenbank
MariaDB-Serverinstallation der MySQL-Reihe
MySQL Series II-Konfiguration für mehrere Instanzen
MySQL Serie 3 Grundlagen
MySQL Serie 4 SQL-Syntax
MySQL-Serie fünf Ansichten, gespeicherte Funktionen, gespeicherte Prozeduren, Trigger
MySQL Series 6-Benutzer und Autorisierung
MySQL Series 7 MySQL-Speicher-Engine
MySQL Serie 8 MySQL Server-Variablen
MySQL-Serie 9 MySQL-Abfrage-Cache und -Index
MySQL Series 10 MySQL-Transaktionsisolierung zur Implementierung der Parallelitätskontrolle
MySQL Series 11-Protokollierung
MySQL Serie 12 Backup und Wiederherstellung
MySQL Serie 13 MySQL-Replikation
MySQL Serie 14 MySQL Hochverfügbarkeitsimplementierung
MySQL-Serie 15: Allgemeine MySQL-Konfiguration und Leistungsstresstest

1. Beschreibung der Backup-Strategie

1. Arten der Sicherung

Typ 1:

  • Hot Backup: Lesen und Schreiben sind nicht betroffen (MyISAM unterstützt kein Hot Backup, InnoDB jedoch schon)
  • Warm Backup: Es können nur Lesevorgänge durchgeführt werden
  • Kaltes Backup: Offline-Backup, Lese- und Schreibvorgänge werden ausgesetzt

Typ 2:

  • Physisches Backup: Datendateien zur Sicherung kopieren, nimmt mehr Platz ein und ist schnell
  • Logische Sicherung: Exportieren Sie Daten in Textdateien. Dies benötigt weniger Speicherplatz, ist langsam und kann an Genauigkeit verlieren.

Typ 3:

  • Voll-Backup: Sichern Sie alle Daten
  • Inkrementelles Backup: Sichert nur die Daten, die sich seit dem letzten Voll-Backup oder inkrementellen Backup geändert haben. Das Backup ist schneller, die Wiederherstellung jedoch aufwändiger.
  • Differenzielle Sicherung: sichert nur die Daten, die sich seit der letzten vollständigen Sicherung geändert haben. Die Sicherung dauert zwar lange, lässt sich aber leicht wiederherstellen.

2. Zu berücksichtigende Faktoren für die Datensicherung

  • Wie lange hält der Warm-Standby die Sperre? Im gesperrten Zustand können keine Daten geschrieben werden.
  • Um die durch die Sicherung verursachte Belastung zu reduzieren, müssen Sie die Sicherung für eine Leerlaufzeit einplanen.
  • Der Sicherungsvorgang dauert lange. Bei großen Datenmengen dauert es lange. Sie müssen eine geeignete Lösung auswählen.
  • Die Dauer des Wiederherstellungsprozesses, die Backup-Daten müssen sofort getestet werden

3. Backup-Ziel

  • Datenbankdaten, jeder Tabellenbereich wird separat gespeichert
  • Binärprotokolle müssen getrennt von Daten gespeichert werden
  • InnoDB-Transaktionsprotokoll
  • Gespeicherte Prozeduren, gespeicherte Funktionen, Trigger oder Ereignisplaner usw.
  • Serverkonfigurationsdatei: /etc/my.cnf

4. Backup-Tools

  • mysqldump工具: ein logisches Sicherungstool, das für Warm-Backups aller Speicher-Engines geeignet ist; unterstützt vollständige oder teilweise Sicherungen; unterstützt Hot-Backups für die InnoDB-Speicher-Engine; speichert Schema (Datenbankdefinition) und Daten zusammen.
Verwendung:
           Shell> mysqldump [Optionen] Datenbankname [Tabellenname ...]
           Shell> mysqldump [Optionen] --databases db_name …
           shell> mysqldump [Optionen] --all-databases
Optionen:
	-A: Alle Bibliotheken sichern -B db_name1,[db_name2,...]: Die angegebene Bibliothek sichern -E: Alle zugehörigen Ereignisplaner sichern
	-R: Alle gespeicherten Prozeduren und gespeicherten Funktionen sichern --triggers: Tabellenbezogene Trigger sichern, standardmäßig aktiviert, verwenden Sie --skip-triggers, um Trigger nicht zu sichern --master-data={1|2}:
		 1: Fügen Sie vor den gesicherten Daten einen Datensatz als CHANGE MASTER TO-Anweisung hinzu, ohne Kommentar. Wenn nichts angegeben ist, ist der Standardwert 1.
		 2: CHANGE MASTER TO-Anweisung als Kommentar aufgezeichnet. Hinweis: Diese Option deaktiviert automatisch die Funktion --lock-tables und aktiviert automatisch die Funktion --lock-all-tables (es sei denn, --single-transaction ist aktiviert).
	-F: Protokoll vor dem Sichern rollen. Nach dem Sperren der Tabelle den Befehl „flush logs“ ausführen, um eine neue binäre Protokolldatei zu generieren. Bei Verwendung mit -A werden mehrere Datenbankaktualisierungen durchgeführt. Wenn Sie gleichzeitig einen Dump und eine Protokollaktualisierung durchführen, sollten Sie gleichzeitig --flush-logs und -x, --master-data oder --single-transaction verwenden. In diesem Fall nur einmal aktualisieren. Empfehlung: Mit -x, --master-data oder --single-transaction verwenden. --compact Kommentare entfernen, geeignet zum Debuggen, wird in der Produktion nicht verwendet. -d: Nur die Tabellenstruktur sichern. -t: Nur die Daten sichern, nicht die erstellte Tabelle.
	-n: Datenbankerstellung nicht sichern, kann durch -A oder -B überschrieben werden --flush-privileges: Autorisierungstabelle vor dem Sichern aktualisieren, erforderlich zum Sichern von MySQL-Datenbanken oder Ähnlichem -f: SQL-Fehler ignorieren und Ausführung fortsetzen --hex-blob: Hexadezimale Notation zum Dumpen binärer Spalten verwenden (zum Beispiel wird aus „abc“ 0x616263), betroffene Datentypen sind BINARY, VARBINARY, BLOB, BIT
	-q: Abfragen nicht zwischenspeichern, direkt ausgeben, Backup beschleunigen

MyISAM-Sicherungsoptionen: Warm-Backup wird unterstützt; Hot-Backup wird nicht unterstützt, daher müssen Sie zuerst die zu sichernde Datenbank sperren und dann den Sicherungsvorgang starten.

-x, --lock-all-tables: Fügt eine globale Lesesperre hinzu, um alle Tabellen in allen Datenbanken zu sperren. Durch Hinzufügen der Option --single-transaction oder --lock-tables wird diese Option deaktiviert. Hinweis: Bei großen Datenmengen kann es vorkommen, dass mehrere Personen über längere Zeit nicht gleichzeitig auf die Datenbank zugreifen können.

-l, --lock-tables: Sperren Sie alle Tabellen jeder Datenbank, die gesichert werden muss, bevor Sie mit der Sicherung beginnen. Standardmäßig ist diese Option aktiviert. Die Option --skip-lock-tables kann deaktiviert werden. Das Sichern mehrerer MyISAM-Bibliotheken kann zu Dateninkonsistenzen führen.

InnoDB-Sicherungsoptionen: Hot Backup wird unterstützt, Warm Backup ist verfügbar, wird aber nicht empfohlen

--single-transaction: Diese Option wird für Innodb und nicht für MyISAM empfohlen. Diese Option führt den Befehl START TRANSACTION aus, um die Transaktion zu starten, bevor mit der Sicherung begonnen wird. Diese Option erstellt einen konsistenten Snapshot, indem alle Tabellen in einer einzigen Transaktion gesichert werden. Gilt nur für Tabellen, die in Speicher-Engines gespeichert sind, die Multiversioning unterstützen (derzeit tut dies nur InnoDB). Die Konsistenz des Dumps mit anderen Speicher-Engines kann nicht garantiert werden.

Um beim Ausführen eines einzelnen Transaktionsdumps eine gültige Dump-Datei (korrekter Tabelleninhalt und Position des Binärprotokolls) sicherzustellen, müssen Sie sicherstellen, dass keine anderen Verbindungen die folgenden Anweisungen verwenden: ALTER TABLE, DROP TABLE, RENAME TABLE, TRUNCATE TABLE.

Diese Option und die Option --lock-tables (die implizit ausstehende Transaktionen festschreibt) schließen sich gegenseitig aus. Beim Sichern großer Tabellen wird empfohlen, die Option --single-transaction in Verbindung mit der Option --quick zu verwenden.

InnoDB empfiehlt die folgende Backup-Strategie:
	mysqldump –uroot –A –F –E –R --single-transaction --master-data=1 --flush-privileges --triggers --hex-blob >$BACKUP/fullbak_$BACKUP_TIME.sql

Von MyISAM empfohlene Sicherungsstrategie:
	mysqldump –uroot –A –F –E –R –x --master-data=1 --flush-privileges --triggers --hex-blob >$BACKUP/fullbak_$BACKUP_TIME.sql
  • xtrabackup- Tool: Ein von Percona bereitgestelltes Tool zur Unterstützung von Hot Backup (physisches Backup) von InnoDB, das vollständiges Backup und inkrementelles Backup unterstützt

Das von Percona bereitgestellte MySQL-Datenbank-Backup-Tool ist ein Open-Source-Tool, das Hot-Backups von InnoDB- und XtraDB-Datenbanken durchführen kann.

xtrabackup wird zum Sichern von InnoDB-Tabellen verwendet, jedoch nicht von Nicht-InnoDB-Tabellen.

Das Skript innobackupex wird zum Sichern von Nicht-InnoDB-Tabellen verwendet. Es ruft auch den Befehl xtrabackup zum Sichern von InnoDB-Tabellen auf und sendet Befehle zur Interaktion mit MySQL Server, z. B. zum Hinzufügen einer globalen Lesesperre (FTWRL) und zum Abrufen eines Standorts (SHOW SLAVE STATUS). Das heißt, innobackupex wird als Kapselungsschicht über xtrabackup implementiert;

Obwohl MyISAM-Tabellen derzeit im Allgemeinen nicht verwendet werden, sind nur die Systemtabellen unter der MySQL-Datenbank MyISAM, sodass die Sicherung grundsätzlich über den Befehl innobackupex durchgeführt wird.

Nach dem Upgrade der xtrabackup-Version auf 2.4 gibt es im Vergleich zur vorherigen Version 2.1 relativ große Änderungen: Alle innobackupex-Funktionen sind in xtrabackup integriert, mit nur einem Binärprogramm. Darüber hinaus wird innobackupex aus Kompatibilitätsgründen als Softlink von xtrabackup verwendet, d. h. xtrabackup unterstützt jetzt Nicht-Innodb-Tabellensicherungen und Innobackupex wird in der nächsten Version entfernt. Es wird empfohlen, innobackupex durch xtrabackup zu ersetzen.

Wenn Sie innobakupex zur Sicherung verwenden, wird xtrabackup aufgerufen, um alle InnoDB-Tabellen zu sichern, alle zugehörigen Dateien zur Tabellenstrukturdefinition (.frm) sowie zugehörige Dateien der MyISAM-, MERGE-, CSV- und ARCHIVE-Tabellen zu kopieren und auch Dateien zu sichern, die mit Triggern und Datenbankkonfigurationsinformationen in Zusammenhang stehen. Diese Dateien werden in einem Verzeichnis gespeichert, das nach der Uhrzeit benannt ist. Während der Sicherung erstellt innobackupex außerdem die folgenden Dateien im Sicherungsverzeichnis:

  • 1) xtrabackup_checkpoints: Sicherungstyp (z. B. vollständig oder inkrementell), Sicherungsstatus (z. B. ob es sich bereits im vorbereiteten Zustand befindet) und Informationen zum LSN-Bereich (Protokollsequenznummer). Jede InnoDB-Seite (normalerweise 16 KB groß) enthält eine Protokollsequenznummer, d. h. LSN. LSN ist die Systemversionsnummer des gesamten Datenbanksystems. Die jeder Seite zugeordnete LSN kann angeben, wie die Seite kürzlich geändert wurde.
  • 2) xtrabackup_binlog_info: Die aktuell vom MySQL-Server verwendete Binärprotokolldatei und der Speicherort der Binärprotokollereignisse bis zum Zeitpunkt der Sicherung;
  • 3) xtrabackup_info: zugehörige Informationen, wenn das Tool innobackupex ausgeführt wird;
  • 4) backup-my.cnf: Informationen zu den Konfigurationsoptionen, die vom Backup-Befehl verwendet werden;
  • 5) xtrabackup_logfile: durch die Sicherung generierte Protokolldatei.
Verwendung:
	innobackupex --user=DBUSER --password=DBUSERPASS /Pfad/zum/BACKUP-DIR/
Optionen:
    --user: Diese Option gibt das Sicherungskonto an --password: Diese Option gibt das Sicherungskennwort an --host: Diese Option gibt die Adresse der Sicherungsdatenbank an --databases: Der von dieser Option akzeptierte Parameter ist der Datenname. Wenn Sie mehrere Datenbanken angeben möchten, müssen diese durch Leerzeichen getrennt werden; zum Beispiel: „xtra_test dba_test“. Gleichzeitig können Sie beim Angeben einer Datenbank auch nur eine Tabelle darin angeben. Beispiel: „mydatabase.mytable“. Diese Option ist für InnoDB-Engine-Tabellen ungültig, aber alle InnoDB-Tabellen werden gesichert. --defaults-file: Diese Option gibt die Datei an, aus der die MySQL-Konfiguration gelesen werden soll. Sie muss an der ersten Optionsposition in der Befehlszeile stehen. --incremental: Diese Option bedeutet, dass eine inkrementelle Sicherung erstellt wird. Sie müssen --incremental-basedir angeben.
    --incremental-basedir: Diese Option gibt das Verzeichnis der vorherigen vollständigen oder inkrementellen Sicherung an und wird zusammen mit --incremental verwendet. --incremental-dir: Diese Option gibt das Verzeichnis der inkrementellen Sicherung während der Wiederherstellung an. --include=name: Geben Sie den Tabellennamen an, Format: Datenbankname.Tabellenname
    --apply-log: Im Allgemeinen können die Daten nach Abschluss der Sicherung nicht für Wiederherstellungsvorgänge verwendet werden, da die gesicherten Daten möglicherweise Transaktionen enthalten, die noch nicht festgeschrieben wurden, oder Transaktionen, die festgeschrieben, aber noch nicht mit der Datendatei synchronisiert wurden. Daher befindet sich die Datendatei derzeit noch in einem inkonsistenten Zustand. Diese Option wird verwendet, um die Datendatei konsistent zu machen, indem nicht festgeschriebene Transaktionen zurückgesetzt und festgeschriebene Transaktionen mit der Datendatei synchronisiert werden. --use-memory: Diese Option wird zusammen mit der Option --apply-log verwendet. Beim Vorbereiten einer Sicherung wird die von xtrabackup für die Wiederherstellung nach einem Systemabsturz zugewiesene Speichergröße in Byte angegeben. Auch verfügbar (1MB, 1M, 1G, 1GB), 1G wird empfohlen
	--export: Gibt an, dass eine separate Tabelle exportiert und dann in andere MySQLs importiert werden kann. --redo-only: Diese Option wird verwendet, wenn ein vollständiges Basis-Backup vorbereitet und inkrementelle Backups darin zusammengeführt werden. --copy-back: Beim Wiederherstellen von Daten wird die Backup-Datendatei in das Datenverzeichnis des MySQL-Servers kopiert.
	--move-back: Diese Option ist ähnlich zu --copy-back, der einzige Unterschied besteht darin, dass die Datei nicht kopiert, sondern an das Ziel verschoben wird. Diese Option entfernt die Sicherungsdatei und sollte mit Vorsicht verwendet werden. Anwendungsszenario: Es ist nicht genügend Speicherplatz vorhanden, um sowohl Datendateien als auch Sicherungskopien aufzubewahren

Beachten:

1) Das Datadir-Verzeichnis muss leer sein. Die Option --copy-backup hat keine Außerkraftsetzung, sofern nicht die Option innobackupex --force-non-empty-directorires angegeben ist.

2) Vor der Wiederherstellung müssen Sie die MySQL-Instanz herunterfahren. Sie können eine laufende Instanz nicht im Verzeichnis datadir wiederherstellen.

3) Da die Dateiattribute erhalten bleiben, müssen Sie in den meisten Fällen den Dateibesitzer vor dem Starten der Instanz in mysql ändern, chown -R mysql:mysql /data/mysqldb

  • mysqlbackup-Tool: Hot Backup, MySQL Enterprise Edition-Komponente
  • mysqlhotcopy-Tool: fast kaltes Backup, nur für die MyISAM-Speicher-Engine
  • LVM-Snapshot-Backup: Fast Hot Backup, die Tabelle muss vor dem Erstellen des Snapshots gesperrt werden
  • Backup mit Archivkopiertools wie tar + cp: Komplettes Cold Backup

2. Backup-Plan

1. cp + tar == physisches Cold-Backup

Packen und komprimieren Sie das Datenverzeichnis für die Sicherung. Dies erfordert die Beendigung des Dienstes und wird nicht empfohlen.

1) Sicherung:

~]# mkdir /backup
~]# systemctl stop mariadb #Dienst stoppen~]# tar Jcf /backup/mariadb_all.tar.xz /var/lib/mysql/ #Backup verpacken und komprimieren]# systemctl start mariadb

2) Wiederherstellen:

~]# systemctl stop mariadb
~]# rm /var/lib/mysql/ -rf #Löschen Sie die beschädigte Bibliothek~]# cd /backup/
Backup]# tar xf mariadb_all.tar.xz #Entpacken Sie die gepackte Datenbankdatei Backup]# cp -av var/lib/mysql/ /var/lib/ #Backup wiederherstellen]# systemctl start mariadb #Starten Sie den Dienst und führen Sie die Wiederherstellung erfolgreich durch

2. LVM-Snapshot + Binlog == fast physischer Hot-Standby + inkrementelles Backup

​1) Backup: Das Datenbankverzeichnis muss auf dem logischen LVM-Volume gespeichert werden

~]# systemctl stop mariadb
~]# rm /var/lib/mysql/ -rf #Löschen Sie die beschädigte Bibliothek~]# cd /backup/
Backup]# tar xf mariadb_all.tar.xz #Entpacken Sie die gepackte Datenbankdatei Backup]# cp -av var/lib/mysql/ /var/lib/ #Backup wiederherstellen]# systemctl start mariadb #Starten Sie den Dienst und führen Sie die Wiederherstellung erfolgreich durch
Bereiten Sie die LVM-Umgebung vor:
~]# pvcreate /dev/sda5
~]# vgcreate vg0 /dev/sda5
~]# lvcreate -n lv_data -L 10G vg0
~]# lvcreate -n lv_binlog -L 10G vg0
~]# mkfs.xfs /dev/vg0/lv_data
~]# mkfs.xfs /dev/vg0/lv_binlog
~]# mkdir -pv /data/{mysqldb,binlog} #Datenverzeichnis und Binärprotokollspeicherverzeichnis erstellen~]# chown -R mysql:mysql /data/
~]# vim /etc/fstab
	UUID=4e3d726a-d420-4c1e-812b-da315012ba86 /data/mysqldb xfs-Standardwerte 0 0
	UUID=6dd98866-769f-4369-8738-291fbcc94ca1 /data/binlog xfs-Standardwerte 0 0
Konfigurieren Sie die Datenbank und simulieren Sie die Generierung großer Datenmengen:
~]# yum installiere MariaDB-Server -y
~]# vim /etc/my.cnf
    [mysqld]
    datadir = /data/mysqldb #Geben Sie den Datenbankspeicherpfad an log_bin = /data/binlog/mariadb-bin #Aktivieren Sie die binäre Protokollierung und speichern Sie sie im angegebenen Pfad innodb_file_per_table = ON #Aktivieren Sie für jede Tabelle einen separaten Tablespace~]# systemctl start mariadb
~]# mysql #Verbindung zur Datenbank herstellen. Benutzername und Passwort werden hier weggelassen. Die folgenden sind gleich. MariaDB [(keine)]> CREATE DATABASE school; #Testbibliothek erstellen MariaDB [(keine)]> use school
MariaDB [Schule]> CREATE TABLE testtb (id int auto_increment primary key,name char(30),age int default 20); #Datentabelle erstellen MariaDB [Schule]> DELIMITER // #Anweisungsabschlusszeichen in „//“ ändern
MariaDB [Schule]> CREATE PROCEDURE pro_testtb() #Schreiben Sie eine gespeicherte Prozedur, um 100.000 Datensätze zum Testen zu generieren-> BEGIN
    -> deklariere i int;
    -> setze i = 1;
    -> solange i < 100000
    -> führen Sie INSERT INTO testtb(Name, Alter) VALUES (CONCAT('Testbenutzer', i), i) aus;
    -> SETZE i = i + 1;
    -> ENDE während;
    -> ENDE//
MariaDB [Schule]> DELIMITER; #Denken Sie daran, das Anweisungsabschlusszeichen wieder zu ändern. MariaDB [Schule]> CALL pro_testtb; #Rufen Sie die gespeicherte Prozedur auf. MariaDB [Schule]> SELECT COUNT(*) FROM testtb; #Überprüfen Sie, ob die Tabelle 100.000 Datensätze enthält. +----------+
| ANZAHL(*) |
+----------+
| 99999 |
+----------+
Sicherung starten:
MariaDB [Schule]> FLUSH TABLES WITH READ LOCK; #Denken Sie daran, die Tabelle vor dem Sichern zu sperren, um zu verhindern, dass Benutzer weiter schreiben. MariaDB [Schule]> FLUSH LOGS; #Scrollen Sie durch das Binärprotokoll. MariaDB [Schule]> SHOW MASTER LOGS; #Überprüfen Sie den Speicherort des Binärprotokolls. +--------------------+-----------+
| Protokollname | Dateigröße |
+--------------------+-----------+
| mariadb-bin.000001 | 30334 |
| mariadb-bin.000002 | 1038814 |
| mariadb-bin.000003 | 29178309 |
| mariadb-bin.000004 | 528 |
| mariadb-bin.000005 | 245 | #Notieren Sie diese Ausgabe, wir werden sie später brauchen+--------------------+-----------+
~]# lvcreate -L 5G -n lv_mysql_snap -s -pr /dev/vg0/lv_data #Sie müssen ein anderes Terminal öffnen, um einen Snapshot zu erstellen. Beenden Sie das MySQL-Terminal nichtMariaDB [school]> UNLOCK TABLES; #Entsperren Sie den Snapshot so schnell wie möglich nach seiner Erstellung. Seien Sie vorsichtig mit Benutzerbeschwerden~]# mount -o nouuid,norecovery /dev/vg0/lv_mysql_snap /mnt/ #Mounten Sie den Snapshot in /mnt
~]# cp -av /mnt/ /backup #Daten in das Backup-Verzeichnis kopieren~]# umount /mnt/
~]# lvremove /dev/vg0/lv_mysql_snap #Nach Abschluss des Kopiervorgangs löschen Sie den Snapshot sofort, um die Serverleistung zu beeinträchtigen. Die vollständige Sicherung ist jetzt abgeschlossen~
Noch ein paar Daten:
MariaDB [Schule]> CALL pro_testtb; #Simulieren wir das Einfügen von 100.000 Datensätzen. MariaDB [Schule]> SELECT COUNT(*) FROM testtb;
+----------+
| ANZAHL(*) |
+----------+
| 199998 | #Jetzt gibt es 200.000 Datensätze+----------+

2) Wiederherstellen:

Datenbankbeschädigung simulieren:
~]# rm -rf /data/mysqldb/* #Server stürzt ab, kein BB mehr, einfach die Bibliothek löschen~]# systemctl stop mariadb #Dienst stoppen
Wiederherstellung starten:
~]# cp -av /backup/* /data/mysqldb/ #cp die gesicherten Dateien in das entsprechende Bibliotheksverzeichnis. Fügen Sie skip_networking unter [mysqld] in /etc/my.cnf hinzu, um Benutzern die Verwendung der Datenbank zu untersagen und das Schreiben von Daten während des Wiederherstellungsprozesses zu verhindern. ~]# systemctl start mariadb #Starten Sie den Dienst ~]# ls -1 /data/binlog/ #Zeigen Sie die Anzahl der Binärprotokolldateien an mariadb-bin.000001
    mariadb-bin.000002
    mariadb-bin.000003
    mariadb-bin.000004
    mariadb-bin.000005
    mariadb-bin.000006
    mariadb-bin.index
~]# mysqlbinlog --start-position=245 /data/binlog/mariadb-bin.000005 > binlog.sql #Daten nach dem Zeitpunkt der vollständigen Sicherung~]# mysqlbinlog /data/binlog/mariadb-bin.000006 >> binlog.sql #Alle nachfolgenden Daten an dieselbe SQL-Datei anhängen~]# mysql < binlog.sql #Binärprotokoll verwenden, um ab dem Zeitpunkt unserer letzten vollständigen Sicherung inkrementell wiederherzustellen~]# mysql -e 'SELECT COUNT(*) FROM school.testtb' #Überprüfen Sie es, 200.000 Datensätze sind alle da, nett
+----------+
| ANZAHL(*) |
+----------+
| 199998 |
+----------+
Gehen Sie zu /etc/my.cnf und löschen Sie skip_networking unter [mysqld], starten Sie den Dienst neu und die Wiederherstellung ist abgeschlossen.

3. mysqldump + InnoDB + binlog = vollständiges logisches Hot-Standby + inkrementelles Backup

​1) Backup: Ich werde hier keine Daten generieren, sondern nur der oben genannten Umgebung folgen

~]# mysqldump -A -F -E -R --single-transaction --master-data=2 --flush-privileges > /backup/full-`date +%F-%T`.sql #Vollständige Datenbanksicherung

2) Fehler simulieren:

MariaDB [(keine)]> CREATE DATABASE db1; #Eine Datenbank erstellen MariaDB [(keine)]> CREATE DATABASE db2; #Eine weitere Datenbank erstellen MariaDB [Schule]> use school;
MariaDB [Schule]> DROP TABLE testtb; #Aufgrund eines Fehlers wurde unsere Tabelle mit 200.000 Datensätzen gelöschtMariaDB [Schule]> CREATE TABLE students (id INT(4) AUTO_INCREMENT PRIMARY KEY,name CHAR(30),age TINYINT); #Anschließend haben andere Benutzer andere Tabellen erstelltMariaDB [Schule]> INSERT INTO students(name,age) VALUES ('user1',20); #Und auch Daten hinzugefügt

3) Wiederherstellen:

An diesem Punkt haben wir festgestellt, dass eine Tabelle fehlt und dringend wiederhergestellt werden muss. Fangen wir an. MariaDB [(keine)]> FLUSH TABLES WITH READ LOCK; #Tabelle sperren MariaDB [(keine)]> FLUSH LOGS; #Binäre Protokolldatei leeren und rollen MariaDB [(keine)]> SHOW MASTER LOGS; #Den aktuellen Protokollstatus anzeigen +--------------------+-----------+
| Protokollname | Dateigröße |
+--------------------+-----------+
| mariadb-bin.000001 | 30334 |
| mariadb-bin.000002 | 1038814 |
| mariadb-bin.000003 | 29178309 |
| mariadb-bin.000004 | 528 |
| mariadb-bin.000005 | 29177760 |
| mariadb-bin.000006 | 29177786 |
| mariadb-bin.000007 | 953 |
| mariadb-bin.000008 | 245 |
+--------------------+-----------+
~]# systemctl stop mariadb #Dienst stoppen und Reparatur vorbereiten~]# head -30 /backup/full-2018-06-14-05\:33\:47.sql |grep "CHANGE MASTER"
-- ÄNDERN SIE MASTER IN MASTER_LOG_FILE='mariadb-bin.000007', MASTER_LOG_POS=245; #Suchen Sie den Protokollpunkt der vollständigen Sicherung bei 245 von mariadb-bin.000007
~]# ls -1 /Daten/binlog/
mariadb-bin.000001
mariadb-bin.000002
mariadb-bin.000003
mariadb-bin.000004
mariadb-bin.000005
mariadb-bin.000006
mariadb-bin.000007
mariadb-bin.000008
mariadb-bin.index
~]# mysqlbinlog --start-position=245 /data/binlog/mariadb-bin.000007 > /backup/binlog.sql #Exportieren Sie das Binärprotokoll nach der vollständigen Sicherung~]# mysqlbinlog /data/binlog/mariadb-bin.000008 >> /backup/binlog.sql
~]# vim /backup/binlog.sql #Ändern Sie die exportierte SQL-Datei und löschen Sie die falsche SQL-Anweisung. Löschen Sie die Zeile „DROP TABLE `testtb` /* generated by server */“
Importieren Sie die Sicherung:
~]# rm -rf /data/mysqldb/* #Löschen Sie zuerst die fehlerhafte Datenbank~]# vim /etc/my.cnf #Bearbeiten Sie die Konfigurationsdatei. Fügen Sie skip_networking zu [mysqld] hinzu, um zu verhindern, dass Benutzer Daten schreiben~]# systemctl start mariadb #Starten Sie den Dienst~]# mysql < /backup/full-2018-06-14-05\:33\:47.sql #Vollständiges Backup importieren~]# mysql < /backup/binlog.sql #Inkrementelles Backup importierenMariaDB [(none)]> show databases; #Überprüfen Sie, ob unsere Daten erfolgreich wiederhergestellt wurden+--------------------+
| Datenbank |
+--------------------+
| Informationsschema |
| db1 | #Wiederhergestellt | db2 | #Wiederhergestellt | mysql |
| Leistungsschema |
| Schule |
| Prüfung |
+--------------------+
MariaDB [(keine)]> SELECT COUNT(*) FROM school.testtb;
+----------+
| ANZAHL(*) |
+----------+
| 199999 | #Wiederhergestellt+----------+
MariaDB [(keine)]> SELECT * FROM Schule.Studenten;
+----+-------+------+
| ID | Name | Alter |
+----+-------+------+
| 1 | Benutzer1 | 20 | #Wiederhergestellt+----+-------+------+
Bisher ist die Wiederherstellung abgeschlossen. Löschen Sie skip_networking in der Konfigurationsdatei, starten Sie den Dienst neu und Sie sind fertig~

4. Xtrabackup + InnoDB == Vollständiges Hot-Backup + inkrementelles Backup

1) Vollständige Sicherung

~]# innobackupex --user=root /backup/ #Das Passwort wird hier weggelassen

2) Daten hinzufügen und löschen

MariaDB [Schule]> CALL pro_testtb; #Fügen Sie einige Daten hinzuMariaDB [Schule]> SELECT COUNT(*) FROM testtb; #Jetzt gibt es 300.000 Datensätze+----------+
| ANZAHL(*) |
+----------+
| 299998 |
+----------+
MariaDB [Schule]> INSERT INTO students VALUES (2,'user2',21);
MariaDB [Schule]> UPDATE Schüler SET Alter=19 WHERE id=1;
MariaDB [Schule]> SELECT * FROM Schüler;
+----+-------+------+
| ID | Name | Alter |
+----+-------+------+
| 1 | Benutzer1 | 19 |
| 2 | Benutzer2 | 21 |
+----+-------+------+

3) Inkrementelles Backup

~]# mkdir /backup/inc{1,2} #Erstellen Sie ein inkrementelles Backup-Verzeichnis~]# innobackupex --incremental /backup/inc1/ --incremental-basedir=/backup/2018-06-14_10-44-57/ #Geben Sie das inkrementelle Backup basierend auf dem Voll-Backup an

4) Daten hinzufügen und löschen

MariaDB [(keine)]> DATENBANK ERSTELLEN db3; 
MariaDB [(keine)]> DROP TABLE school.students; #Die Tabelle wurde versehentlich gelöscht MariaDB [(keine)]> use school
MariaDB [Schule]> CALL pro_testtb; #Anschließend werden weitere Daten generiertMariaDB [Schule]> SELECT COUNT(*) FROM testtb;
+----------+
| ANZAHL(*) |
+----------+
| 399997 |
+----------+
MariaDB [Schule]> SELECT * FROM students; #An diesem Punkt habe ich festgestellt, dass die Tabelle „Studenten“ fehlt. Was soll ich tun?
FEHLER 1146 (42S02): Tabelle „school.students“ existiert nicht

5) Fehler tritt auf

~]# rm -rf /data/mysqldb/* #Löschen Sie das Datenverzeichnis, bevor Sie MariaDB wiederherstellen [(keine)]> show databases; #Die Datenbank ist jetzt weg+--------------------+
| Datenbank |
+--------------------+
| Informationsschema |
+--------------------+

6) Notfallwiederherstellung

So stellen Sie vollständige und inkrementelle Backups wieder her:
:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::3s::::::333:33333333333333333333ag33333333333333333333333333333 es333333333333333333333333333333 es33 nicht nicht nicht nicht nicht nicht nicht nicht nicht nicht nicht nicht nicht dann dann dann dann aber33333333333333333333 nicht3 nicht3 nicht3 nicht3 nicht3 nicht3 nicht3 nicht3 dann3 dann3 aber3 dann3 nicht nicht nicht nicht nicht nicht nicht nicht nicht nicht nicht nicht nicht nicht nicht nicht nicht nicht nicht nicht nicht nicht nicht nicht nicht nicht nicht nicht nicht nicht nicht nicht dann nichtie dasen aber aber abersossoss aberstens aberstensss aberten aber abers :::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::3s::::::333:33333333333333333333ag33333333333333333333333333333 es333333333333333333333333333333 es33 nicht nicht nicht nicht nicht nicht nicht nicht nicht nicht nicht nicht nicht dann dann dann dann aber33333333333333333333 nicht3 nicht3 nicht3 nicht3 nicht3 nicht3 nicht3 nicht3 dann3 dann3 aber3 dann3 nicht nicht nicht nicht nicht nicht nicht nicht nicht nicht nicht nicht nicht nicht nicht nicht nicht nicht nicht nicht nicht nicht nicht nicht nicht nicht nicht nicht nicht nicht nicht nicht dann nichtie dasen aber aber abersossoss aberstens aberstensss aberten aber abers :::::::::::
Stellen Sie anhand des Binärprotokolls das letzte inkrementelle Backup wie folgt wieder her:
~]# cat /backup/2018-06-14_10-44-57/xtrabackup_binlog_info #Überprüfen Sie den Datensatzpunkt des Binärprotokolls während der Sicherung mariadb-bin.000011 35740416
~]# ls -1 /data/binlog/ #Sehen Sie, wo unsere Binärprotokolldatei aufgezeichnet ist mariadb-bin.000001
mariadb-bin.000002
mariadb-bin.000003
mariadb-bin.000004
mariadb-bin.000005
mariadb-bin.000006
mariadb-bin.000007
mariadb-bin.000008
mariadb-bin.000009
mariadb-bin.000010
mariadb-bin.000011
mariadb-bin.000012
mariadb-bin.000013
mariadb-bin.index
~]# mysqlbinlog --start-position=35740416 /data/binlog/mariadb-bin.000011 > /backup/binlog.sql #Exportieren Sie die Binärprotokolldaten nach dem letzten inkrementellen Backup~]# mysqlbinlog /data/binlog/mariadb-bin.000012 >> /backup/binlog.sql
~]# mysqlbinlog /data/binlog/mariadb-bin.000013 >> /backup/binlog.sql
Bearbeite die Datei /backup/binlog.sql und lösche „DROP TABLE `school`.`students` /* generated by server */“, um das versehentliche Löschen rückgängig zu machen. MariaDB [(none)]> SET sql_log_bin=0; #Schalte die Binärprotokollfunktion vorübergehend aus. MariaDB [(none)]> source /backup/binlog.sql #Importiere nach dem inkrementellen Backup die neuesten Daten, um zu prüfen, ob die Daten vollständig wiederhergestellt wurden. Lösche skip_networking in my.cnf und starte den Dienst neu. Jetzt wurden die Daten auf den neuesten Stand zurückgesetzt.

5. Verwenden Sie Xtrabackup, um eine Einzeltabellensicherung zu implementieren

1) Sichern Sie eine einzelne Tabelle

~]# innobackupex --include="testdb.testlog" /backup #Tabellendaten sichern~]# mysql -e 'SHOW CREATE TABLE testdb.testlog' > /backup/desc_testdb_testlog.sql #Tabellenbereich sichern~]# mysql -e 'DROP TABLE testdb.testlog' #Fehler simulieren und Testlog-Tabelle löschen

2) Wiederherstellen einer einzelnen Tabelle

~]# innobackupex --apply-log --export /backup/2018-06-14_17-47-02/ #Tabellendaten anordnen~]# vim /backup/desc_testdb_testlog.sql #Bearbeiten Sie die Anweisung zum Erstellen des Tablespace und löschen Sie die folgenden Felder Table Create Table
    Testprotokoll
~]# mysql testdb < /backup/desc_testdb_testlog.sql #Tablespace importieren~]# mysql testdb -e 'DESC testlog' #Prüfen, ob der Import erfolgreich war+-------+----------+------+-----+---------+----------------+
| Feld | Typ | Null | Schlüssel | Standard | Extra |
+-------+----------+------+-----+---------+----------------+
| id | int(11) | NEIN | PRI | NULL | auto_increment |
| Name | char(30) | JA | | NULL | |
| Alter | int(11) | JA | | 20 | |
+-------+----------+------+-----+---------+----------------+
~]# mysql -e 'ALTER TABLE testdb.testlog DISCARD TABLESPACE' # Tabellenbereich löschen~]# cd /backup/2018-06-14_17-47-02/testdb/
testdb]# cp testlog.cfg testlog.exp testlog.ibd /var/lib/mysql/testdb/ #Kopieren Sie die Tabellendaten in das Bibliotheksverzeichnis~]# chown -R mysql:mysql /var/lib/mysql/testdb/ #Ändern Sie den Besitzer und die Gruppe~]# mysql -e 'ALTER TABLE testdb.testlog IMPORT TABLESPACE' #Importieren Sie den Tablespace

Zusammenfassen

Dieser Artikel endet hier. Ich hoffe, er kann Ihnen helfen. Ich hoffe auch, dass Sie mehr Inhalten auf 123WORDPRESS.COM mehr Aufmerksamkeit schenken können!

Das könnte Sie auch interessieren:
  • Zusammenfassung der Tests für logische MySQL-Sicherungen und -Wiederherstellungen
  • Detaillierte Erläuterung der MySQL-Sicherungs- und Wiederherstellungspraxis von mysqlbackup
  • Implementierung der MySQL5.7 mysqldump-Sicherung und -Wiederherstellung
  • Eine kurze Analyse der MySQL-Sicherung und -Wiederherstellung
  • Detaillierte Erläuterung der MySQL-Sicherung und -Wiederherstellung

<<:  Detaillierte Erläuterung des Kapselungsbeispiels für Netzwerkanforderungen

>>:  Die Webseite kann nicht geöffnet werden, da dem Div-Element ein schließender Tag fehlt

Artikel empfehlen

Detaillierte Erklärung, warum MySQL nicht mit UNION zwei Abfragen verbinden kann

Überblick UNION Mit dem Schlüsselwort „Verbindung...

Einführung in den Befehl „Linux-Typversion-Speicherfestplattenabfrage“

1. Lassen Sie uns zunächst eine allgemeine Einfüh...

Grafisches Tutorial zur Installation von MySQL 5.5 unter Win7

Die MySQL-Installation ist relativ einfach. Norma...

Analyse der gemeinsamen Indexfunktion von MySQL und Anwendungsbeispiele

Dieser Artikel veranschaulicht anhand von Beispie...

Ausführliche Erläuterung der Stilfunktion in Vue3-Einzeldateikomponenten

Inhaltsverzeichnis Stil mit Gültigkeitsbereich St...

Beispiel für die Konfiguration von nginx zur Implementierung von SSL

Umgebungsbeschreibung Serversystem: Ubuntu 18.04 ...

Detaillierte Erklärung des Rewrite-Moduls von Nginx

Das Umschreibmodul ist das Modul ngx_http_rewrite...

So fahren Sie nginx herunter/starten es neu

Schließung Dienst Nginx stoppen systemctl stoppt ...

Node implementiert Suchfeld für Fuzzy-Abfragen

In diesem Artikelbeispiel wird der spezifische Co...

Benutzerdefinierte Docker-Netzwerkcontainer-Verbindung

Inhaltsverzeichnis Vorwort -Link Benutzerdefinier...