Kapitel 4. Sicherung und Wiederherstellung

Diese Arbeit wurde mithilfe von KI übersetzt. Wir freuen uns über dein Feedback und deine Kommentare: translation-feedback@oreilly.com

Backup und Wiederherstellung sind zwei unterschiedliche, aber verwandte Konzepte der Datensicherung. Bei der Datensicherung wird eine Kopie der Daten erstellt und an einem sicheren Ort aufbewahrt. Die Wiederherstellung hingegen ist der Prozess der Wiederherstellung von Daten aus einem Backup im Falle eines Datenverlustes. Das Ziel von Backup und Recovery ist es, sicherzustellen, dass die Daten bei Bedarf verfügbar und nutzbar sind.

In diesem Kapitel werden die grundlegenden Konzepte der Sicherung und Wiederherstellung besprochen und anschließend die verschiedenen Arten von Sicherungen erläutert. Außerdem geben wir dir Hinweise zum Erstellen von Backups, zur Wiederherstellung von Backups und zur Verwaltung von Binärprotokollen. Schließlich erfährst du, wie du deine Sicherung und Wiederherstellung verwaltest, um sicherzustellen, dass deine Daten sicher sind und im Katastrophenfall leicht wiederhergestellt werden können.

Bevor wir uns mit den Einzelheiten befassen, ist es wichtig, die grundlegenden Konzepte zu verstehen, die diesen wichtigen Aktivitäten zugrunde liegen. Als DBA musst du sicherstellen, dass deine Daten geschützt sind und im Falle einer Katastrophe wiederhergestellt werden können. Datenverluste können aus verschiedenen Gründen auftreten, z. B. durch Hardwarefehler, menschliches Versagen, Naturkatastrophen oder bösartige Angriffe. Ohne geeignete Sicherungs- und Wiederherstellungsmechanismen kann es viel Zeit, Geld und Mühe kosten, verlorene Daten wiederherzustellen oder sie sogar von Grund auf neu zu erstellen.

Faktoren, die bei der Wahl einer Backup-Strategie zu berücksichtigen sind

Die Wahl einer Backup-Strategie, die den Anforderungen deines Unternehmens entspricht, kann eine Herausforderung sein. Hier sind einige Faktoren, die du berücksichtigen solltest:

Wiederherstellungspunkt-Ziel (RPO)

Der RPO ist das maximale Ausmaß an Datenverlust, das im Falle eines Desasters toleriert werden kann. Ein kürzerer RPO erfordert häufigere Backups oder Point-in-Time-Recovery mit Streaming-Funktionen. Ein RPO von wenigen Sekunden oder 0 kann in der Regel nur mit häufigen Backups oder einer Point-in-Time-Wiederherstellung erreicht werden.

Ziel für die Wiederherstellungszeit (RTO)

Die RTO ist die maximale Zeitspanne, die für die Wiederherstellung nach einer Katastrophe benötigt wird. Eine kürzere RTO erfordert einen schnelleren Wiederherstellungsmechanismus, wie z. B. ein Warm- oder Hot-Standby-System.

Sicherungsart

MySQL unterstützt verschiedene Sicherungsarten, darunter physische Sicherung, logische Sicherung, inkrementelle Sicherung und differenzielle Sicherung. Jede Sicherungsart hat ihre Vor- und Nachteile, und die Wahl der Sicherungsart hängt von den Geschäftsanforderungen ab.

Speicherort der Sicherung

Backups sollten an einem sicheren Ort gespeichert werden, der vom Produktionssystem getrennt ist, um das Risiko eines Datenverlusts zu vermeiden, wenn sowohl das Produktionssystem als auch der Speicherort des Backups von einer Katastrophe betroffen sind.

Zusammenfassend lässt sich sagen, dass wir das gesamte Datenverzeichnis als physisches Backup sichern müssen, einschließlich der binären Logs. Diese Sicherung ist für kritische Situationen, in denen die Instanz oder Umgebung wiederhergestellt werden muss, unerlässlich.

Der Unterschied zwischen physischen und logischen Backups

Logische Backups und physische Backups dienen unterschiedlichen Zwecken und werden unterschiedlich umgesetzt.

Eine logische Sicherung ( ) ist eine Sicherung der logischen Struktur und des Inhalts einer Datenbank, z. B. von Tabellen, Ansichten, gespeicherten Prozeduren, Triggern und Daten. Sie wird erstellt, indem die Daten mit Hilfe von Dienstprogrammen wie mydumper oder dem Instanz-Dump-Dienstprogramm, dem Schema-Dump-Dienstprogramm und dem Tabellen-Dump-Dienstprogramm der MySQL Shell in eine Datei geschrieben werden. Logische Backups sind portabel und können verwendet werden, um eine Datenbank von einem Server auf einen anderen zu migrieren oder um bestimmte Tabellen oder Daten in einer Datenbank wiederherzustellen. Sie können jedoch langsamer erstellt und wiederhergestellt werden als physische Backups.

Ein physisches Backup hingegen ist eine binäre Kopie der MySQL-Datenbankdateien, einschließlich der Daten, Indizes und Tabellenstrukturen. Sie wird erstellt, indem die physischen Dateien direkt vom Server auf eine Speichereinheit oder einen Server kopiert werden. Daher sind sie schneller zu erstellen und wiederherzustellen als logische Backups.

Beide Arten von Backups sind wichtig, um die Verfügbarkeit und Integrität einer MySQL-Datenbank zu gewährleisten. Logische Backups sind nützlich, um Daten zwischen Servern zu migrieren, bestimmte Tabellen oder Daten wiederherzustellen und für langfristige Archivierungszwecke. Physische Backups sind für Disaster Recovery, Backups auf Systemebene und für HA-Lösungen wie die Datenbankreplikation nützlich.

Physische Backups

Die beiden beliebtesten physischen Backups sind MySQL Enterprise Backup und Percona XtraBackup.

MySQL Enterprise Backup

Um eine MySQL-Datenbank zu sichern und wiederherzustellen, kannst du das Tool MySQL Enterprise Backup verwenden. Die Sicherung einer MySQL-Instanz ist entscheidend für die Wiederherstellung der Daten im Falle einer Katastrophe oder eines Verlusts. Es ist wichtig, eine Backup-Strategie zu haben, die die Wiederherstellung der Daten mit minimaler Ausfallzeit ermöglicht.

Um dieses Backup zu konfigurieren, erstelle zum Beispiel ein neues Verzeichnis mit dem Namen backupdir:

[root@mysql80 ~]# mkdir /backupdir
[root@mysql80 ~]#

Dieser Backup-Befehl weist das MySQL-Backup-Dienstprogramm (mysqlbackup) an, einen Backup-Vorgang mit den folgenden Optionen durchzuführen:

root@mysql80 ~]# mysqlbackup --user=root --password --backup-image=/backupdir/
my.mbi --backup-dir=/backupdir/backup-tmp backup-to-image
MySQL Enterprise Backup  Ver 8.0.36-commercial for Linux on x86_64
(MySQL Enterprise - Commercial)
Copyright (c) 2003, 2024, Oracle and/or its affiliates.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective owners.

Starting with following command line ...
mysqlbackup
--user=root
--password
--backup-image=/backupdir/my.mbi
--backup-dir=/backupdir/backup-tmp
backup-to-image

IMPORTANT: Please check that mysqlbackup run completes successfully.
At the end of a successful 'backup-to-image' run mysqlbackup
prints "mysqlbackup completed OK!"

Enter password:
240216 11:42:48 MAIN     INFO: Establishing connection to server.
WARNING: MYSQL_OPT_RECONNECT is deprecated and will be removed in a
future version.
240216 11:42:48 MAIN     INFO: No SSL options specified.
240216 11:42:48 MAIN     INFO: MySQL server version is '8.0.36'
240216 11:42:48 MAIN     INFO: MySQL server compile os version is 'Linux'
240216 11:42:48 MAIN     INFO: Got some server configuration information from
running server.

Anhand des Protokolls kannst du die Konfigurationsoptionen für das Server-Repository und das Backup überprüfen:

240216 11:42:48 MAIN  INFO: The MySQL server has no active keyring.
--------------------------------------------------------------------
                       Server Repository Options:
--------------------------------------------------------------------
  datadir                        = /var/lib/mysql/
  innodb_data_home_dir           = /var/lib/mysql/datafile/
  innodb_data_file_path          = ibdata1:12M;ibdata2:10M:autoextend
  innodb_log_group_home_dir      = /var/lib/mysql/
  innodb_undo_directory          = /var/lib/mysql/
  innodb_undo_tablespaces        = 2
  innodb_buffer_pool_filename    = ib_buffer_pool
  innodb_page_size               = 16384
  innodb_checksum_algorithm      = crc32

--------------------------------------------------------------------
                       Backup Config Options:
--------------------------------------------------------------------
  datadir                        = /backupdir/backup-tmp/datadir
  innodb_data_home_dir           = /backupdir/backup-tmp/datadir
  innodb_data_file_path          = ibdata1:12M;ibdata2:10M:autoextend
  innodb_log_group_home_dir      = /backupdir/backup-tmp/datadir
  innodb_undo_directory          = /backupdir/backup-tmp/datadir
  innodb_undo_tablespaces        = 2
  innodb_buffer_pool_filename    = ib_buffer_pool
  innodb_page_size               = 16384
  innodb_checksum_algorithm      = crc32

Backup Image Path = /backupdir/my.mbi
240216 11:42:48 MAIN     INFO: Unique generated backup id for
this is 17080837682941805

Nach Abschluss des Backups erhältst du den Status der Fertigstellung wie im Protokoll angegeben:

240216 11:42:49 RDR1     INFO: Copying /var/lib/mysql/binlog.000012.
240216 11:42:49 RDR1     INFO: Completed the copy of binlog files...
240216 11:42:49 RDR1     INFO: The server instance is unlocked after
0.236 seconds.
240216 11:42:49 RDR1     INFO: Reading all global variables from the server.
240216 11:42:49 RDR1     INFO: Completed reading of all 640 global variables
from the server.
240216 11:42:49 RDR1     INFO: Writing server defaults files 'server-my.cnf'
and 'server-all.cnf' for server '8.0.36' in '/backupdir/backup-tmp'.
240216 11:42:49 RDR1     INFO:  Copying meta file /backupdir/backup-tmp/
meta/backup_variables.txt.
240216 11:42:49 RDR1     INFO:  Copying meta file /backupdir/backup-tmp/
datadir/ibbackup_logfile.
240216 11:42:49 RDR1     INFO:  Copying meta file /backupdir/backup-tmp/
server-all.cnf.
240216 11:42:49 RDR1     INFO:  Copying meta file /backupdir/backup-tmp/
server-my.cnf.
240216 11:42:49 RDR1     INFO:  Copying meta file /backupdir/backup-tmp/
meta/backup_content.xml.
240216 11:42:49 RDR1     INFO:  Copying meta file /backupdir/backup-tmp/
meta/image_files.xml.
240216 11:42:49 MAIN     INFO: Full Image Backup operation completed
successfully.
240216 11:42:49 MAIN     INFO:  Backup image created successfully.
240216 11:42:49 MAIN     INFO: Image Path = /backupdir/my.mbi
240216 11:42:49 MAIN     INFO: MySQL binlog position: filename binlog.000012,
position 4131.

-------------------------------------------------------------
    Parameters Summary
-------------------------------------------------------------
    Start LSN                  : 37130752
   Last Checkpoint LSN        : 37130784
   End LSN                    : 37204275
-------------------------------------------------------------
mysqlbackup completed OK!
[root@mysql80 ~]#

Hier sind die Details zu den verschiedenen Optionen, die in dem Befehl verwendet werden:

--user

Gibt den MySQL-Benutzer mit ausreichenden Rechten an, um auf die Datenbank zuzugreifen und sie zu sichern.

--password

Liefert das Passwort für den in der Option --user angegebenen MySQL-Benutzer.

--backup-image

Gibt den Namen und den Speicherort der Sicherungsdatei an, die erstellt wird. Diese Datei enthält die gesamte MySQL-Instanz.

--backup-dir

Gibt das temporäre Sicherungsverzeichnis an, in dem die Sicherungsdateien während des Sicherungsvorgangs gespeichert werden.

backup-to-image

Gibt die Art der Sicherung an.

Sobald der Befehl ausgeführt wird, beginnt der Sicherungsvorgang und die Sicherungsdateien werden im angegebenen Sicherungsverzeichnis gespeichert. Nach Abschluss des Sicherungsvorgangs wird die Meldung mysqlbackup completed OK! angezeigt.

Nach Abschluss eines Backups ist es wichtig, die Integrität des Backups zu überprüfen und sicherzustellen, dass alle Daten korrekt gesichert wurden. So kannst du Datenverluste durch beschädigte Backups vermeiden.

Der folgende Befehl kann verwendet werden, um ein Backup-Image zu validieren:

[root@mysql80 ~]#  mysqlbackup --backup-image=/backupdir/my.mbi validate
MySQL Enterprise Backup  Ver 8.0.36-commercial for Linux on x86_64
(MySQL Enterprise - Commercial)
Copyright (c) 2003, 2024, Oracle and/or its affiliates.
Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective owners.
Starting with following command line ...
mysqlbackup
--backup-image=/backupdir/my.mbi
validate

IMPORTANT: Please check that mysqlbackup run completes successfully.
           At the end of a successful 'validate' run mysqlbackup
           prints "mysqlbackup completed OK!".

240216 11:49:26 MAIN     INFO: Backup Image MEB version string: 8.0.36
240216 11:49:26 MAIN     INFO: MySQL server version is '8.0.36'
240216 11:49:26 MAIN     INFO: The backup image has no keyring.
240216 11:49:26 MAIN     INFO: Creating 14 buffers each of size 16777216.
240216 11:49:26 MAIN     INFO: Validate operation starts with
following threads
                               1 read-threads    6 process-threads
240216 11:49:26 MAIN     INFO: Validating image ... /backupdir/my.mbi
240216 11:49:26 PCR6     INFO: Validate: [Dir]: meta
240216 11:49:26 PCR5     INFO: Validate: [Dir]: datadir/appdb
240216 11:49:26 PCR5     INFO: Validate: [Dir]: datadir/datafile
240216 11:49:26 PCR6     INFO: Validate: [Dir]: datadir/mydatabase
240216 11:49:26 PCR4     INFO: Validate: [Dir]: datadir/mysql
240216 11:49:26 PCR3     INFO: Validate: [Dir]: datadir/mytestdb

Nach Abschluss der Validierung erhältst du den Abschlussstatus der Sicherung, der im Protokoll angezeigt wird:

240216 11:49:26 MAIN     INFO: datadir/sakila/
fts_0000000000000442_being_deleted.ibd validated.
240216 11:49:26 MAIN     INFO: Validate operation completed successfully.
240216 11:49:26 MAIN     INFO: Backup Image validation successful.
240216 11:49:26 MAIN     INFO: Source Image Path = /backupdir/my.mbi

mysqlbackup completed OK!
[root@mysql80 ~]#

Schauen wir uns das genauer an:

mysqlbackup

Validiert das Sicherungsimage

--backup-image

Gibt den Pfad zum Backup-Image an

--validate

Gibt die Validierungsoperation an

Wenn die Validierung erfolgreich war, wird die folgende Meldung angezeigt:

mysqlbackup completed OK!

Es ist außerdem wichtig, die Sicherungsprotokolle zu überprüfen, um sicherzustellen, dass während des Sicherungsvorgangs keine Fehler aufgetreten sind. Zum Beispiel:

[root@mysql80 meta]# cat MEB_2024-02-16.11-42-48_backup-to-image.log |
grep "error"
[root@mysql80 meta]#

Mit diesen Befehlen werden die Backup-bezogenen Einträge in den Backup-Logdateien angezeigt.

Je nach Situation, wie z.B. einem Absturz, menschlichem Versagen und Datenverlust oder einer Disaster Recovery, kann die Wiederherstellung einer Datenbank eine entscheidende Aktivität sein. Bevor du ein Backup wiederherstellst, musst du die MySQL-Instanz herunterfahren, um Probleme mit der Dateninkonsistenz zu vermeiden. Mit dem folgenden Befehl kannst du den MySQL-Server anhalten:

[root@mysql80 meta]# systemctl stop mysqld
[root@mysql80 meta]#

Nachdem du den MySQL-Server heruntergefahren hast, lösche alle Dateien, die sich im Datenverzeichnis befinden. Löschen Sie alle Dateien, die sich unter dem Verzeichnis befinden, das durch die Wiederherstellungsoptionen --innodb_data_home_dir, --innodb_log_group_home_dir und--innodb_undo_directory angegebenen Verzeichnisse befinden, auch wenn es sich um andere Verzeichnisse als dasDatenverzeichnis handelt.

Bevor du den Befehl rm -rf * ausführst, vergewissere dich, dass du dich im richtigen aktuellen Verzeichnis befindest und bestätige, dass es das Datenverzeichnis ist:

[root@mysql80 mysql]# pwd
/var/lib/mysql
[root@mysql80 mysql]# rm -rf *
[root@mysql80 mysql]#

Sobald du alle notwendigen Dateien gelöscht hast, kannst du mit der Optioncopy-back-and-apply-log und dem Befehl mysqlbackup das Backup wiederherstellen. Mit dieser Option werden alle inkrementellen Änderungen aus dem Backup auf den Zielserver übertragen. Hier ist ein Beispielbefehl für deine Referenz:

[root@mysql80 backup-tmp]# mysqlbackup --datadir=/var/lib/mysql
--backup-image=/backupdir/my.mbi --backup-dir=/backupdir/backup-tmp1
copy-back-and-apply-log
MySQL Enterprise Backup  Ver 8.0.36-commercial for Linux on x86_64
(MySQL Enterprise - Commercial)
Copyright (c) 2003, 2024, Oracle and/or its affiliates.
Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective owners.
Starting with following command line ...
mysqlbackup
--datadir=/var/lib/mysql
--backup-image=/backupdir/my.mbi
--backup-dir=/backupdir/backup-tmp1
copy-back-and-apply-log
...
240216 12:10:24 PCR1     INFO: Last MySQL binlog file position 0
4131, file name binlog.000012
240216 12:10:24 PCR1     INFO: The first data file is
'/var/lib/mysql/datafile/ibdata1'
 and the new created log files are at '/var/lib/mysql'
240216 12:10:24 MAIN     INFO: Apply-log operation completed successfully.
240216 12:10:24 MAIN     INFO: Full Backup has been restored successfully.
mysqlbackup completed OK!
[root@mysql80 backup-tmp]#

Der Eigentümer der wiederhergestellten Dateien ist derzeit der Benutzer root:

[root@mysql80 mysql]# cd /var/lib/mysql
[root@mysql80 mysql]#
[root@mysql80 mysql]# ls -ltr
total 80104
-rw-r-----. 1 root root       56 Feb 16 12:10  backup-auto.cnf
-rw-r-----. 1 root root       14 Feb 16 12:10  backup-mysqld-auto.cnf
drwxr-x---. 2 root root       28 Feb 16 12:10  sys
drwxr-x---. 2 root root       91 Feb 16 12:10  world
drwxr-x---. 2 root root     4096 Feb 16 12:10  sakila
drwxr-x---. 2 root root       44 Feb 16 12:10  mydatabase
-rw-r-----. 1 root root   114688 Feb 16 12:10  my_tablespace.ibd
drwxr-x---. 2 root root      164 Feb 16 12:10  appdb
drwxr-x---. 2 root root       72 Feb 16 12:10  datafile
-rw-r-----. 1 root root      180 Feb 16 12:10  binlog.000011
-rw-r-----. 1 root root     1102 Feb 16 12:10  binlog.000010
drwxr-x---. 2 root root      140 Feb 16 12:10  mytestdb
drwxr-x---. 2 root root      170 Feb 16 12:10  mysql
drwxr-x---. 2 root root     8192 Feb 16 12:10  performance_schema
-rw-r-----. 1 root root     4131 Feb 16 12:10  binlog.000012
-rw-r-----. 1 root root      192 Feb 16 12:10  binlog.index
-rw-r-----. 1 root root      660 Feb 16 12:10  server-my.cnf
-rw-r-----. 1 root root    19983 Feb 16 12:10  server-all.cnf
-rw-r-----. 1 root root 16777216 Feb 16 12:10  undo_002
-rw-r-----. 1 root root 16777216 Feb 16 12:10  undo_001
-rw-r-----. 1 root root 16777216 Feb 16 12:10  my_undo_tablespace.ibu
-rw-r-----. 1 root root 27262976 Feb 16 12:10  mysql.ibd
drwxr-x---. 2 root root       23 Feb 16 12:10 '
innodb_redo'
-rw-r--r--. 1 root root      723 Feb 16 12:10  backup_variables.txt
[root@mysql80 mysql]

Nachdem du das Backup wiederhergestellt hast, ändere die Eigentumsrechte an den wiederhergestellten Dateien auf den Benutzer mysql. Du kannst den folgenden Befehl verwenden, um die Eigentümerschaft zu ändern:

[root@mysql80 mysql]# chown -R mysql.mysql /var/lib/mysql
[root@mysql80 mysql]#

[root@mysql80 mysql]# ls -ltr
total 80104
-rw-r-----. 1 mysql mysql       56 Feb 16 12:10  backup-auto.cnf
-rw-r-----. 1 mysql mysql       14 Feb 16 12:10  backup-mysqld-auto.cnf
drwxr-x---. 2 mysql mysql       28 Feb 16 12:10  sys
drwxr-x---. 2 mysql mysql       91 Feb 16 12:10  world
drwxr-x---. 2 mysql mysql     4096 Feb 16 12:10  sakila
drwxr-x---. 2 mysql mysql       44 Feb 16 12:10  mydatabase
-rw-r-----. 1 mysql mysql   114688 Feb 16 12:10  my_tablespace.ibd
drwxr-x---. 2 mysql mysql      164 Feb 16 12:10  appdb
drwxr-x---. 2 mysql mysql       72 Feb 16 12:10  datafile
-rw-r-----. 1 mysql mysql      180 Feb 16 12:10  binlog.000011
-rw-r-----. 1 mysql mysql     1102 Feb 16 12:10  binlog.000010
drwxr-x---. 2 mysql mysql      140 Feb 16 12:10  mytestdb
drwxr-x---. 2 mysql mysql      170 Feb 16 12:10  mysql
drwxr-x---. 2 mysql mysql     8192 Feb 16 12:10  performance_schema
-rw-r-----. 1 mysql mysql     4131 Feb 16 12:10  binlog.000012
-rw-r-----. 1 mysql mysql      192 Feb 16 12:10  binlog.index
-rw-r-----. 1 mysql mysql      660 Feb 16 12:10  server-my.cnf
-rw-r-----. 1 mysql mysql    19983 Feb 16 12:10  server-all.cnf
-rw-r-----. 1 mysql mysql 16777216 Feb 16 12:10  undo_002
-rw-r-----. 1 mysql mysql 16777216 Feb 16 12:10  undo_001
-rw-r-----. 1 mysql mysql 16777216 Feb 16 12:10  my_undo_tablespace.ibu
-rw-r-----. 1 mysql mysql 27262976 Feb 16 12:10  mysql.ibd
drwxr-x---. 2 mysql mysql       23 Feb 16 12:10 '
innodb_redo'
-rw-r--r--. 1 mysql mysql      723 Feb 16 12:10  backup_variables.txt
[root@mysql80 mysql]

Sobald du die Besitzverhältnisse geändert hast, starte den MySQL-Server mit dem folgenden Befehl:

[root@mysql80 mysql]# systemctl start mysqld
[root@mysql80 mysql]#

Wenn du ein Backup auf einer Replikationsinstanz wiederherstellst, brauchst du den Namen der binären Logdatei und die Position, ab der die Replikation beginnen soll. Diese Angaben findest du in der Datei backup_variables.txt, die sich in einem Meta-Verzeichnis im Backup-Verzeichnis befindet. Öffne die Datei und rufe die letzte binäre Log-Position sowie die entsprechende Logfile-Nummer ab, die beide in der Datei gespeichert sind. Diese Informationen werden benötigt, um den Replikat-Server so zu konfigurieren, dass die Replikation an der richtigen Position im Binärprotokoll beginnt:

[root@mysql80 meta]# pwd
/backupdir/backup-tmp/meta
[root@mysql80 meta]# cat backup_variables.txt | grep binlog_position
binlog_position=binlog.000012:4131
[root@mysql80 meta]#

Percona XtraBackup

Percona XtraBackup ist ein Open-Source-Tool für die Sicherung und Wiederherstellung von MySQL-Datenbanken. Bevor du Sicherungen mit Percona XtraBackup durchführst, müssen bestimmte Voraussetzungen erfüllt sein:

  • Percona XtraBackup muss auf dem Server installiert sein.

  • Die MySQL-Instanz, die gesichert werden soll, muss laufen und zugänglich sein.

  • Es muss genügend Speicherplatz zur Verfügung stehen, um das Backup in einer lokalen Freigabe oder auf einem Remote-Server zu speichern.

Sichern von einem Replikationsserver

Es wird empfohlen, ein vollständiges Backup von einem Replikat-Server mit Percona XtraBackup durchzuführen, um die Auswirkungen auf den Primärserver zu reduzieren. Das Starten eines Backups auf dem Primärserver kann die Leistung beeinträchtigen, was sich auf die Anwendungen auswirken kann, die auf ihn angewiesen sind. Indem du das Backup von einem Replikat-Server erstellst, kannst du die Auswirkungen auf den Primärserver minimieren, so dass dieser die Anwendungen weiterhin ohne Unterbrechung bedienen kann.

Eine Vollsicherung, bei der die gesamte Datenbank gesichert wird, ist die umfassendste Art der Sicherung. Die Sicherung umfasst alle Daten, Indizes, Tabellen, Ansichten, Trigger und Stored Procedures. Hier ist ein Beispiel:

[root@mysql80 ~]# xtrabackup --backup --target-dir=/root/backupdir -u root -p

2024-02-20T07:27:13.279554-00:00 0 [Note] [MY-011825] [Xtrabackup] recognized
server arguments: --datadir=/var/lib/mysql
2024-02-20T07:27:13.279897-00:00 0 [Note] [MY-011825] [Xtrabackup] recognized
client arguments: --user=root --password=* --backup=1 --target-dir=/root/
backupdir --user=root --password
Enter password:
xtrabackup version 8.0.35-30 based on MySQL server 8.0.35 Linux (x86_64)
(revision id: 6beb4b49)
240220 07:27:14  version_check Connecting to MySQL server with DSN
'dbi:mysql:;mysql_read_default_group=xtrabackup' as 'root'  (using password:
YES).
240220 07:27:14  version_check Connected to MySQL server
240220 07:27:14  version_check Executing a version check against the server...

# A software update is available:
240220 07:27:15  version_check Done.
2024-02-20T07:27:15.257381-00:00 0 [Note] [MY-011825] [Xtrabackup]
Connecting to MySQL server host: localhost, user: root, password: set,
port: not set, socket: not set
2024-02-20T07:27:15.269103-00:00 0 [Note] [MY-011825] [Xtrabackup]
Using server version 8.0.36
..
2024-02-20T07:27:19.627144-00:00 0 [Note] [MY-011825] [Xtrabackup]
Writing /root/backupdir/backup-my.cnf
2024-02-20T07:27:19.627324-00:00 0 [Note] [MY-011825] [Xtrabackup]
Done: Writing file /root/backupdir/backup-my.cnf
2024-02-20T07:27:19.736769-00:00 0 [Note] [MY-011825] [Xtrabackup]
Writing /root/backupdir/xtrabackup_info
2024-02-20T07:27:19.736961-00:00 0 [Note] [MY-011825] [Xtrabackup]
Done: Writing file /root/backupdir/xtrabackup_info
2024-02-20T07:27:19.768177-00:00 0 [Note] [MY-011825] [Xtrabackup]
Transaction log of lsn (20366453) to (20366463) was copied.
2024-02-20T07:27:19.998055-00:00 0 [Note] [MY-011825] [Xtrabackup] completed OK!
[root@mysql80 ~]#

In den Percona-Dokumenten findest du eine vollständige Liste der Variablenoptionen, die mit dem Tool verfügbar sind.

Hier sind die Details zu den beiden Optionen, die in dem Befehl verwendet werden. Um ein Backup zu starten, führe XtraBackup mit der Option --backup aus. Die Option --target-dir=DIRECTORY gibt das Zielverzeichnis für die Sicherung an. Wenn das angegebene Verzeichnis nicht existiert, wird es von XtraBackup erstellt. Wenn das Verzeichnis existiert und leer ist, wird die Sicherung erfolgreich durchgeführt. Wenn das Verzeichnis jedoch bereits Dateien enthält, überschreibt XtraBackup diese nicht, was zu einem Fehlschlag mit dem Betriebssystemfehler 17 (Datei existiert) führt.

Hinweis

Die Option --slave-info ist besonders nützlich, wenn du ein Backup eines Replikations-Slave-Servers erstellst. Sie zeigt nicht nur den Namen und die Binärprotokollposition des Masterservers an, sondern speichert diese Informationen auch in der Datei xtrabackup_slave_info als CHANGE MASTERBefehl. So kannst du bequem einen neuen Slave-Server für denselben Master einrichten, indem du einen Slave-Server auf dem Backup startest und den BefehlCHANGE MASTER unter Verwendung der in der Dateixtrabackup_slave_info gespeicherten binären Protokollposition ausführst.

Wiederherstellung einer Datenbank

In diesem Abschnitt wird erklärt, wie du ein mit Percona XtraBackup erstelltes Backup wiederherstellen kannst. Bevor du das Backup wiederherstellen kannst, musst du die Sicherungsdateien jedoch mit dem Befehl xtrabackup --prepare vorbereiten. In diesem Schritt werden die anstehenden Änderungen auf die Sicherungsdaten angewendet, damit sie in einem konsistenten Zustand sind:

[root@mysql80 ~]# xtrabackup --prepare --target-dir=/root/backupdir

2024-02-20T07:29:48.539204-00:00 0 [Note] [MY-011825] [Xtrabackup] recognized
server arguments: --innodb_checksum_algorithm=crc32 --innodb_log_checksums=1
--innodb_data_file_path=ibdata1:12M:autoextend --innodb_log_file_size=50331648
--innodb_page_size=16384 --innodb_undo_directory=./ --innodb_undo_tablespaces=2
--server-id=0 --innodb_log_checksums=ON --innodb_redo_log_encrypt=0
--innodb_undo_log_encrypt=0
2024-02-20T07:29:48.539575-00:00 0 [Note] [MY-011825] [Xtrabackup] recognized
client arguments: --prepare=1 --target-dir=/root/backupdir
xtrabackup version 8.0.35-30 based on MySQL server 8.0.35 Linux (x86_64)
(revision id: 6beb4b49)
2024-02-20T07:29:48.539839-00:00 0 [Note] [MY-011825] [Xtrabackup]
cd to /root/backupdir/
2024-02-20T07:29:48.543518-00:00 0 [Note] [MY-011825] [Xtrabackup]
This target seems to be not prepared yet.
2024-02-20T07:29:48.562638-00:00 0 [Note] [MY-011825] [Xtrabackup]
xtrabackup_logfile detected: size=8388608, start_lsn=(20366453)
..
2024-02-20T07:29:49.169641-00:00 0 [Note] [MY-011825] [Xtrabackup]
Completed loading of 2 tablespaces into cache in 0.00413599 seconds
2024-02-20T07:29:49.221375-00:00 0 [Note] [MY-011825] [Xtrabackup]
Time taken to build dictionary: 0.0515769 seconds
2024-02-20T07:29:49.239865-00:00 0 [Note] [MY-011825] [Xtrabackup]
starting shutdown with innodb_fast_shutdown = 1
2024-02-20T07:29:49.240024-00:00 0 [Note] [MY-012330] [InnoDB]
FTS optimize thread exiting.
2024-02-20T07:29:50.232093-00:00 0 [Note] [MY-013072] [InnoDB]
Starting shutdown...
2024-02-20T07:29:50.240493-00:00 0 [Note] [MY-013084] [InnoDB]
Log background threads are being closed...
2024-02-20T07:29:50.260550-00:00 0 [Note] [MY-012980] [InnoDB]
Shutdown completed; log sequence number 20366870
2024-02-20T07:29:50.266082-00:00 0 [Note] [MY-011825] [Xtrabackup] completed OK!
[root@mysql80 ~]#

Beende den MySQL-Server auf dem Rechner, auf dem du das Backup wiederherstellen willst:

[root@mysql80 ~]# sudo systemctl stop mysqld
[root@mysql80 ~]#

Kopiere die Sicherungsdateien von ihrem ursprünglichen Speicherort zu dem Zielort, an dem du die Wiederherstellung durchführen willst. Dafür kannst du ein Tool wie rsync oder scp verwenden.

Kopiere die MySQL-Konfigurationsdateien vom Speicherort der Sicherung in das MySQL-Konfigurationsverzeichnis auf dem Rechner, auf dem du die Sicherung wiederherstellen willst. Der Speicherort des Konfigurationsverzeichnisses kann je nach Betriebssystem variieren. Wenn die Sicherung nicht in das Datenverzeichnis kopiert wurde, kannst du den Befehl xtrabackup--copy-back Befehl verwenden, um die Dateien aus dem Backup-Verzeichnis in das MySQL-Datenverzeichnis zu kopieren:

[root@mysql80 ~]# sudo xtrabackup --copy-back --target-dir=/root/backupdir

2024-02-20T07:34:03.208252-00:00 0 [Note] [MY-011825] [Xtrabackup] recognized
server arguments: --datadir=/var/lib/mysql
2024-02-20T07:34:03.208429-00:00 0 [Note] [MY-011825] [Xtrabackup] recognized
client arguments: --user=root --password=* --copy-back=1 --target-dir=/root/
backupdir
xtrabackup version 8.0.35-30 based on MySQL server 8.0.35 Linux (x86_64)
(revision id: 6beb4b49)
2024-02-20T07:34:03.208499-00:00 0 [Note] [MY-011825] [Xtrabackup]
cd to /root/backupdir/
2024-02-20T07:34:03.212994-00:00 0 [Note] [MY-011825] [Xtrabackup]
Copying undo_001 to /var/lib/mysql/undo_001
2024-02-20T07:34:03.372784-00:00 0 [Note] [MY-011825] [Xtrabackup]
Done: Copying undo_001 to /var/lib/mysql/undo_001
2024-02-20T07:34:03.379912-00:00 0 [Note] [MY-011825] [Xtrabackup]
Copying undo_002 to /var/lib/mysql/undo_002
2024-02-20T07:34:03.481821-00:00 0 [Note] [MY-011825] [Xtrabackup]
Done: Copying undo_002 to /var/lib/mysql/undo_002
2024-02-20T07:34:03.488697-00:00 0 [Note] [MY-011825] [Xtrabackup]
Copying ibdata1 to /var/lib/mysql/ibdata1
2024-02-20T07:34:03.557571-00:00 0 [Note] [MY-011825] [Xtrabackup]
Done: Copying ibdata1 to /var/lib/mysql/ibdata1
...
2024-02-20T07:34:04.081817-00:00 1 [Note] [MY-011825] [Xtrabackup]
Copying ./ib_buffer_pool to /var/lib/mysql/ib_buffer_pool
2024-02-20T07:34:04.082713-00:00 1 [Note] [MY-011825] [Xtrabackup]
Done: Copying ./ib_buffer_pool to /var/lib/mysql/ib_buffer_pool
2024-02-20T07:34:04.084413-00:00 1 [Note] [MY-011825] [Xtrabackup]
Copying ./xtrabackup_info to /var/lib/mysql/xtrabackup_info
2024-02-20T07:34:04.084548-00:00 1 [Note] [MY-011825] [Xtrabackup]
Done: Copying ./xtrabackup_info to /var/lib/mysql/xtrabackup_info
2024-02-20T07:34:04.086055-00:00 1 [Note] [MY-011825] [Xtrabackup]
Creating directory ./#innodb_redo
2024-02-20T07:34:04.086133-00:00 1 [Note] [MY-011825] [Xtrabackup]
Done: creating directory ./#innodb_redo
2024-02-20T07:34:04.086241-00:00 1 [Note] [MY-011825] [Xtrabackup]
Copying ./ibtmp1 to /var/lib/mysql/ibtmp1
2024-02-20T07:34:04.131401-00:00 1 [Note] [MY-011825] [Xtrabackup]
Done: Copying ./ibtmp1 to /var/lib/mysql/ibtmp1
2024-02-20T07:34:04.177825-00:00 0 [Note] [MY-011825] [Xtrabackup] completed OK!
[root@mysql80 ~]#

Nachdem du die Dateien kopiert hast, musst du den Eigentümer und die Rechte für das Datenverzeichnis auf den Benutzer mysql setzen:

[root@mysql80 ~]# sudo chown -R mysql:mysql /var/lib/mysql
[root@mysql80 ~]#

Starte den MySQL-Server mit dem folgenden Befehl:

[root@mysql80 ~]# sudo systemctl start mysqld
[root@mysql80 ~]#

Nachdem du MySQL gestartet hast, musst du das Protokoll überprüfen und bestätigen, dass die MySQL-Instanz bereit für die Verbindung ist. Wenn du tail das mysqld Fehlerprotokoll überprüfst, solltest du ein ähnliches Ergebnis erhalten:

[root@mysql80 ~]# tail -2 /var/log/mysqld.log

2024-02-20T07:37:48.624988Z 0 [System] [MY-011323] [Server] X Plugin ready for
connections. Bind-address: '::' port: 33060, socket: /var/run/mysqld/mysqlx.sock
2024-02-20T07:37:48.625234Z 0 [System] [MY-010931] [Server] /usr/sbin/mysqld:
ready for connections. Version: '8.0.36'  socket: '/var/lib/mysql/mysql.sock'
port: 3306  MySQL Community Server - GPL.
[root@mysql80 ~]#

Inkrementelle Backups verwenden

Percona XtraBackup unterstützt inkrementelle Backups, so dass nur die Daten kopiert werden, die sich seit dem letzten Backup geändert haben. Du kannst mehrere inkrementelle Backups durchführen. So kannst du einen Backup-Zeitplan erstellen, z. B. einmal pro Woche ein vollständiges Backup und täglich inkrementelle Backups oder täglich ein vollständiges Backup und stündlich inkrementelle Backups.

Der inkrementelle Sicherungsprozess nutzt die LSN, die mit jeder InnoDB-Seite verknüpft ist. Die LSN dient als Systemversionsnummer für die gesamte Datenbank und zeigt an, wann eine Seite zuletzt geändert wurde. Bei einer inkrementellen Sicherung werden nur Seiten kopiert, deren LSN neuer ist als die LSN der vorherigen inkrementellen oder vollständigen Sicherung. Ein Algorithmus identifiziert die Seiten, die dieses Kriterium erfüllen, indem er die Datenseiten liest und ihre jeweiligen LSN-Werte überprüft.

Um eine inkrementelle Sicherung mit Percona XtraBackup zu erstellen, beginnst du mit einer regulären Vollsicherung. Nach der Vollsicherung schreibt das Dienstprogramm xtrabackupeine Datei namens xtrabackup_checkpoints in das Zielverzeichnis der Sicherung. Diese Datei enthält eine Zeilemit der Bezeichnung to_lsn, die die LSN der Datenbank am Ende des Sicherungsvorgangs darstellt. Du kannst eine vollständige Sicherung durchführen, indem du den folgenden Befehl ausführst:

[root@mysql8 ~]#  mkdir -p /data/backups/base

[root@mysql8 ~]# xtrabackup --backup --target-dir=/data/backups/base

2024-02-23T11:50:13.697883-00:00 0 [Note] [MY-011825] [Xtrabackup] recognized
server arguments: --datadir=/var/lib/mysql
2024-02-23T11:50:13.698792-00:00 0 [Note] [MY-011825] [Xtrabackup] recognized
client arguments: --user=root --password=* --backup=1 --target-dir=/data/
backups/base
xtrabackup version 8.0.35-30 based on MySQL server 8.0.35 Linux (x86_64)
(revision id: 6beb4b49)
Can't locate English.pm in @INC (you may need to install the English module)
(@INC contains: /usr/local/lib64/perl5/5.32 /usr/local/share/perl5/5.32 /usr/
lib64/perl5/vendor_perl /usr/share/perl5/vendor_perl /usr/lib64/perl5 /usr/
share/perl5) at - line 3.
BEGIN failed--compilation aborted at - line 3.
2024-02-23T11:50:13.728094-00:00 0 [Note] [MY-011825] [Xtrabackup] Connecting
to MySQL server host: localhost, user: root, password: set, port: not set,
socket: not set
2024-02-23T11:50:14.135079-00:00 0 [Note] [MY-011825] [Xtrabackup] Using server
version 8.0.36
2024-02-23T11:50:14.149822-00:00 0 [Note] [MY-011825] [Xtrabackup] Executing
LOCK INSTANCE FOR BACKUP ...
2024-02-23T11:50:14.151389-00:00 0 [Note] [MY-011825] [Xtrabackup] uses
posix_fadvise().
2024-02-23T11:50:14.151443-00:00 0 [Note] [MY-011825] [Xtrabackup] cd to /var/
lib/mysql
2024-02-23T11:50:14.151460-00:00 0 [Note] [MY-011825] [Xtrabackup] open files
limit requested 0, set to 1024
2024-02-23T11:50:14.174389-00:00 0 [Note] [MY-011825] [Xtrabackup] using the
following InnoDB configuration:
2024-02-23T11:50:14.174418-00:00 0 [Note] [MY-011825] [Xtrabackup]
innodb_data_home_dir = .
2024-02-23T11:50:14.174429-00:00 0 [Note] [MY-011825] [Xtrabackup]
innodb_data_file_path = ibdata1:12M:autoextend
2024-02-23T11:50:14.174470-00:00 0 [Note] [MY-011825] [Xtrabackup]
innodb_log_group_home_dir = ./
2024-02-23T11:50:14.174482-00:00 0 [Note] [MY-011825] [Xtrabackup]
innodb_log_files_in_group = 2
....
2024-02-23T11:50:32.554338-00:00 0 [Note] [MY-011825] [Xtrabackup] Done:
Writing file /data/backups/base/backup-my.cnf
2024-02-23T11:50:33.071966-00:00 0 [Note] [MY-011825] [Xtrabackup] Writing /
data/backups/base/xtrabackup_info
2024-02-23T11:50:33.072211-00:00 0 [Note] [MY-011825] [Xtrabackup] Done:
Writing file /data/backups/base/xtrabackup_info
2024-02-23T11:50:33.188617-00:00 0 [Note] [MY-011825] [Xtrabackup] Transaction
log of lsn (20289655) to (20289665) was copied.
2024-02-23T11:50:33.405903-00:00 0 [Note] [MY-011825] [Xtrabackup] completed OK!
[root@mysql8 ~]#

Nach Abschluss der Vollsicherung kannst du die Dateixtrabackup_checkpoints einsehen, um den LSN-Wert zu überprüfen. Je nach LSN-Nummer enthält die Datei ähnliche Informationen wie die folgenden:

[root@mysql8 ~]# cat /data/backups/base/xtrabackup_checkpoints
backup_type = full-backuped
from_lsn = 0
to_lsn = 20289655
last_lsn = 20289655
flushed_lsn = 20289655
redo_memory = 0
redo_frames = 0
[root@mysql8 ~]#

Diese Ausgabe bestätigt, dass die Vollsicherung erfolgreich war und zeigt den Wertto_lsn an, der als Referenzpunkt für die nächste inkrementelle Sicherung verwendet wird.

Nachdem du ein vollständiges Backup erstellt hast, kannst du mit dem Befehl xtrabackup ein inkrementelles Backup erstellen. Der folgende Befehl kann verwendet werden, um ein inkrementelles Backup zu erstellen:

[root@mysql8 ~]# xtrabackup --backup --target-dir=/data/backups/inc1 \
--incremental-basedir=/data/backups/base -u root -p
2024-02-23T12:07:38.147005-00:00 0 [Note] [MY-011825] [Xtrabackup] recognized
server arguments: --datadir=/var/lib/mysql
2024-02-23T12:07:38.147368-00:00 0 [Note] [MY-011825] [Xtrabackup] recognized
client arguments: --user=root --password=* --backup=1 --target-dir=/data/
backups/inc1 --incremental-basedir=/data/backups/base --user=root --password
Enter password:
xtrabackup version 8.0.35-30 based on MySQL server 8.0.35 Linux (x86_64)
(revision id: 6beb4b49)
Can't locate English.pm in @INC (you may need to install the English module)
(@INC contains: /usr/local/lib64/perl5/5.32 /usr/local/share/perl5/5.32 /usr/
lib64/perl5/vendor_perl /usr/share/perl5/vendor_perl /usr/lib64/perl5 /usr/
share/perl5) at - line 3.
BEGIN failed--compilation aborted at - line 3.
2024-02-23T12:07:39.895793-00:00 0 [Note] [MY-011825] [Xtrabackup] Connecting
to MySQL server host: localhost, user: root, password: set, port: not set,
socket: not set
2024-02-23T12:07:39.918181-00:00 0 [Note] [MY-011825] [Xtrabackup] Using server
version 8.0.36
2024-02-23T12:07:39.935737-00:00 0 [Note] [MY-011825] [Xtrabackup]
innodb_log_group_home_dir = ./
2024-02-23T12:07:52.016205-00:00 0 [Note] [MY-011825] [Xtrabackup] MySQL binlog
position: filename 'binlog.000006', position '157'
2024-02-23T12:07:52.016406-00:00 0 [Note] [MY-011825] [Xtrabackup] Writing /
data/backups/inc1/backup-my.cnf
2024-02-23T12:07:52.016580-00:00 0 [Note] [MY-011825] [Xtrabackup] Done:
Writing file /data/backups/inc1/backup-my.cnf
2024-02-23T12:07:52.185241-00:00 0 [Note] [MY-011825] [Xtrabackup] Writing /
data/backups/inc1/xtrabackup_info
2024-02-23T12:07:52.185445-00:00 0 [Note] [MY-011825] [Xtrabackup] Done:
Writing file /data/backups/inc1/xtrabackup_info
2024-02-23T12:07:53.188689-00:00 0 [Note] [MY-011825] [Xtrabackup] Transaction
log of lsn (20784993) to (20784993) was copied.
2024-02-23T12:07:53.414360-00:00 0 [Note] [MY-011825] [Xtrabackup] completed OK!
[root@mysql8 ~]#

Dieser Befehl erstellt eine inkrementelle Sicherung im Verzeichnis /data/backups/inc1/, die auf der vorherigen Vollsicherung im Verzeichnis/data/backups/base/ basiert. Die von diesem Befehl erzeugten Deltadateien stellen die Änderungen dar, die an der Datenbank seit dem LSN-Wert der vorherigen Sicherung vorgenommen wurden. Im Verzeichnis der inkrementellen Sicherung findest du zum Beispiel Dateien wie ibdata1.delta undtest/table1.ibd.delta.

Nach Abschluss der inkrementellen Sicherung kannst du die Dateixtrabackup_checkpoints im Verzeichnis /data/backups/inc1/ überprüfen. Diese Datei sollte sowohl den neuen LSN-Wert als auch den incremental-basedirWert enthalten, der als Referenzpunkt für den Backup-Prozess verwendet wurde. Der Inhalt der Datei xtrabackup_checkpoints kann wie folgt aussehen:

[root@mysql8 ~]# cat /data/backups/inc1/xtrabackup_checkpoints
backup_type = incremental
from_lsn = 20289655
to_lsn = 20784993
last_lsn = 20784993
flushed_lsn = 20784993
redo_memory = 0
redo_frames = 0
[root@mysql8 ~]#

Der Wert from_lsn in der Datei xtrabackup_checkpoints stellt die Start-LSN der inkrementellen Sicherung dar und sollte mit dem Wertto_lsn der Checkpoint-Datei der vorherigen oder der Basissicherung übereinstimmen.

Nachdem du die erste inkrementelle Sicherung erstellt hast, kannst du sie als Grundlage für die Erstellung einer weiteren inkrementellen Sicherung verwenden. Mit dem folgenden Befehl kannst du eine inkrementelle Sicherung auf Basis der vorherigen inkrementellen Sicherung erstellen:

[root@mysql8 ~]# xtrabackup --backup --target-dir=/data/backups/inc2 \
--incremental-basedir=/data/backups/inc1
2024-02-23T13:10:43.005350-00:00 0 [Note] [MY-011825] [Xtrabackup] recognized
server arguments: --datadir=/var/lib/mysql
2024-02-23T13:10:43.008358-00:00 0 [Note] [MY-011825] [Xtrabackup] recognized
client arguments: --user=root --password=* --backup=1 --target-dir=/data/
backups/inc2 --incremental-basedir=/data/backups/inc1
xtrabackup version 8.0.35-30 based on MySQL server 8.0.35 Linux (x86_64)
(revision id: 6beb4b49)
Can't locate English.pm in @INC (you may need to install the English module)
(@INC contains: /usr/local/lib64/perl5/5.32 /usr/local/share/perl5/5.32 /usr/
lib64/perl5/vendor_perl /usr/share/perl5/vendor_perl /usr/lib64/perl5 /usr/
share/perl5) at - line 3.
BEGIN failed--compilation aborted at - line 3.
2024-02-23T13:10:43.044764-00:00 0 [Note] [MY-011825] [Xtrabackup] Connecting
to MySQL server host: localhost, user: root, password: set, port: not set,
socket: not set
2024-02-23T13:10:43.053579-00:00 0 [Note] [MY-011825] [Xtrabackup] Using server
version 8.0.36
2024-02-23T13:10:43.056222-00:00 0 [Note] [MY-011825] [Xtrabackup] Executing
LOCK INSTANCE FOR BACKUP ...
2024-02-23T13:10:43.057492-00:00 0 [Note] [MY-011825] [Xtrabackup] incremental
backup from 20784993 is enabled.
2024-02-23T13:10:43.057721-00:00 0 [Note] [MY-011825] [Xtrabackup] uses
posix_fadvise().
2024-02-23T13:10:43.057745-00:00 0 [Note] [MY-011825] [Xtrabackup] cd to /var/
lib/mysql
2024-02-23T13:10:43.057757-00:00 0 [Note] [MY-011825] [Xtrabackup] open files
limit requested 0, set to 1024
2024-02-23T13:10:43.060579-00:00 0 [Note] [MY-011825] [Xtrabackup] using the
following InnoDB configuration:
2024-02-23T13:10:43.060604-00:00 0 [Note] [MY-011825] [Xtrabackup]
innodb_data_home_dir = .
2024-02-23T13:10:43.060613-00:00 0 [Note] [MY-011825] [Xtrabackup]
innodb_data_file_path = ibdata1:12M:autoextend
2024-02-23T13:10:43.060650-00:00 0 [Note] [MY-011825] [Xtrabackup]
innodb_log_group_home_dir = ./
2024-02-23T13:10:43.060662-00:00 0 [Note] [MY-011825] [Xtrabackup]
innodb_log_files_in_group = 2
2024-02-23T13:10:43.060672-00:00 0 [Note] [MY-011825] [Xtrabackup]
innodb_log_file_size = 50331648
....
2024-02-23T13:10:50.751443-00:00 0 [Note] [MY-011825] [Xtrabackup] MySQL binlog
position: filename 'binlog.000011', position '157'
2024-02-23T13:10:50.814250-00:00 0 [Note] [MY-011825] [Xtrabackup] Writing /
data/backups/inc2/backup-my.cnf
2024-02-23T13:10:50.814471-00:00 0 [Note] [MY-011825] [Xtrabackup] Done:
Writing file /data/backups/inc2/backup-my.cnf
2024-02-23T13:10:51.014542-00:00 0 [Note] [MY-011825] [Xtrabackup] Writing /
data/backups/inc2/xtrabackup_info
2024-02-23T13:10:51.014890-00:00 0 [Note] [MY-011825] [Xtrabackup] Done:
Writing file /data/backups/inc2/xtrabackup_info
2024-02-23T13:10:51.018154-00:00 0 [Note] [MY-011825] [Xtrabackup] Transaction
log of lsn (21291941) to (21291941) was copied.
2024-02-23T13:10:51.140104-00:00 0 [Note] [MY-011825] [Xtrabackup] completed OK!
[root@mysql8 ~]#

Dieser Befehl erstellt eine neue inkrementelle Sicherung im Verzeichnis /data/backups/inc2/, die auf der vorherigen inkrementellen Sicherung in/data/backups/inc1/ basiert. Die Datei xtrabackup_checkpoints in diesem Verzeichnis sollte den neuen LSN-Wert anzeigen, der den Endpunkt der neuen inkrementellen Sicherung darstellt.

Du kannst auf diese Weise mehrere inkrementelle Backups erstellen, wobei jedes neue inkrementelle Backup auf dem vorherigen Backup basiert. Jede inkrementelle Sicherung enthält nur die Änderungen, die seit der vorherigen Sicherung vorgenommen wurden, was dazu beiträgt, den Zeit- und Speicherbedarf für Sicherungs- und Wiederherstellungsvorgänge zu reduzieren:

[root@mysql8 ~]# cat /data/backups/inc2/xtrabackup_checkpoints
backup_type = incremental
from_lsn = 20784993
to_lsn = 21291941
last_lsn = 21291941
flushed_lsn = 21291941
redo_memory = 0
redo_frames = 0
[root@mysql8 ~]#

Du hast jetzt eine Vollsicherung und zwei inkrementelle Sicherungen erstellt, die alle im Sicherungsverzeichnis gespeichert werden. Jede Sicherung wird in einem eigenen Verzeichnis in diesem Backup-Verzeichnis gespeichert. Wenn du dir den Inhalt des Backup-Verzeichnisses mit dem Befehlls -ltr Befehl auflistest, findest du die folgenden:

[root@mysql8 backups]# ls -ltr
total 12
drwxr-xr-x. 5 root root 4096 Feb 23 11:50 base
drwxr-x---. 6 root root 4096 Feb 23 12:07 inc1
drwxr-x---. 6 root root 4096 Feb 23 13:10 inc2
[root@mysql8 backups]#

Vorbereiten inkrementeller Backups

Der --prepare Schritt für inkrementelle Backups unterscheidet sich von dem für vollständige Backups. Bei Voll-Backups führt der Schritt --prepare zwei Arten von Operationen durch, um die Datenbank konsistent zu machen: Er gleicht festgeschriebene Transaktionen aus der Logdatei mit den Datendateien ab und rollt nicht festgeschriebene Transaktionen zurück. Bei der Vorbereitung eines inkrementellen Backups musst du jedoch das Rollback von unbestätigten Transaktionen auslassen. Der Grund dafür ist, dass Transaktionen, die zum Zeitpunkt des Backups noch nicht übertragen wurden, möglicherweise noch in Bearbeitung sind und bei der nächsten inkrementellen Sicherung übertragen werden.

Um die Rollback-Phase während des --prepare Schritts für inkrementelle Backups zu verhindern, verwendest du die Option --apply-log-only. Diese Option wendet nur die Logfiles auf das Backup an, um die Seiten zu aktualisieren, und führt kein Rollback der Transaktionen durch. Nach der Anwendung der Logdateien kann das Backup zum Zeitpunkt der Erstellung des Backups wiederhergestellt werden:

[root@mysql8 backups]# xtrabackup --prepare --apply-log-only \
--target-dir=/data/backups/base
2024-02-23T13:28:08.266142-00:00 0 [Note] [MY-011825] [Xtrabackup] recognized
server arguments: --innodb_checksum_algorithm=crc32 --innodb_log_checksums=1
--innodb_data_file_path=ibdata1:12M:autoextend --innodb_log_file_size=50331648
--innodb_page_size=16384 --innodb_undo_directory=./ --innodb_undo_tablespaces=2
--server-id=0 --innodb_log_checksums=ON --innodb_redo_log_encrypt=0
--innodb_undo_log_encrypt=0
2024-02-23T13:28:08.266501-00:00 0 [Note] [MY-011825] [Xtrabackup] recognized
client arguments: --prepare=1 --apply-log-only=1 --target-dir=/data/backups/base
xtrabackup version 8.0.35-30 based on MySQL server 8.0.35 Linux (x86_64)
(revision id: 6beb4b49)
2024-02-23T13:28:08.266735-00:00 0 [Note] [MY-011825] [Xtrabackup] cd to /data/
backups/base/
2024-02-23T13:28:08.268271-00:00 0 [Note] [MY-011825] [Xtrabackup] This target
seems to be not prepared yet.
2024-02-23T13:28:08.290071-00:00 0 [Note] [MY-011825] [Xtrabackup]
inititialize_service_handles suceeded
2024-02-23T13:28:08.290782-00:00 0 [Note] [MY-011825] [Xtrabackup] using the
following InnoDB configuration for recovery:
2024-02-23T13:28:08.290856-00:00 0 [Note] [MY-011825] [Xtrabackup]
innodb_data_home_dir = .
2024-02-23T13:28:08.290906-00:00 0 [Note] [MY-011825] [Xtrabackup]
innodb_data_file_path = ibdata1:12M:autoextend

Nach Beendigung dieses Befehls sollte die Ausgabe mit einem Text ähnlich diesem enden:

2024-02-23T13:28:09.840970-00:00 0 [Note] [MY-013072] [InnoDB]
Starting shutdown...
2024-02-23T13:28:09.848432-00:00 0 [Note] [MY-013084] [InnoDB]
Log background threads are being closed...
2024-02-23T13:28:09.868724-00:00 0 [Note] [MY-012980] [InnoDB]
Shutdown completed; log sequence number 20289665
2024-02-23T13:28:09.876150-00:00 0 [Note] [MY-011825] [Xtrabackup] completed OK!
[root@mysql8 backups]#

Um die erste inkrementelle Sicherung auf die Vollsicherung anzuwenden, kannst du den folgenden Befehl ausführen:

[root@mysql8 backups]# xtrabackup --prepare --apply-log-only --target-dir=/data/
backups/base \
    --incremental-dir=/data/backups/inc1
2024-02-23T13:30:43.873233-00:00 0 [Note] [MY-011825] [Xtrabackup] recognized
server arguments: --innodb_checksum_algorithm=crc32 --innodb_log_checksums=1
--innodb_data_file_path=ibdata1:12M:autoextend --innodb_log_file_size=50331648
--innodb_page_size=16384 --innodb_undo_directory=./ --innodb_undo_tablespaces=2
--server-id=0 --innodb_log_checksums=ON --innodb_redo_log_encrypt=0
--innodb_undo_log_encrypt=0
2024-02-23T13:30:43.874162-00:00 0 [Note] [MY-011825] [Xtrabackup] recognized
client arguments: --prepare=1 --apply-log-only=1 --target-dir=/data/backups/base
--incremental-dir=/data/backups/inc1
xtrabackup version 8.0.35-30 based on MySQL server 8.0.35 Linux (x86_64)
(revision id: 6beb4b49)
2024-02-23T13:30:43.877184-00:00 0 [Note] [MY-011825] [Xtrabackup] incremental
backup from 20289655 is enabled.
2024-02-23T13:30:43.877299-00:00 0 [Note] [MY-011825] [Xtrabackup] cd to /data/
backups/base/
2024-02-23T13:30:43.878200-00:00 0 [Note] [MY-011825] [Xtrabackup] This target
seems to be already prepared with --apply-log-only.
2024-02-23T13:30:43.888050-00:00 0 [Note] [MY-011825] [Xtrabackup]
xtrabackup_logfile detected: size=8388608, start_lsn=(20784993)
2024-02-23T13:30:43.888535-00:00 0 [Note] [MY-011825] [Xtrabackup] using the
following InnoDB configuration for recovery:
2024-02-23T13:30:43.888643-00:00 0 [Note] [MY-011825] [Xtrabackup]
innodb_data_home_dir = .
2024-02-23T13:30:43.888699-00:00 0 [Note] [MY-011825] [Xtrabackup]
innodb_data_file_path = ibdata1:12M:autoextend
2024-02-23T13:30:43.888796-00:00 0 [Note] [MY-011825] [Xtrabackup]
innodb_log_group_home_dir = /data/backups/inc1/
2024-02-23T13:30:46.424279-00:00 0 [Note] [MY-011825] [Xtrabackup] Done:
Copying /data/backups/inc1/binlog.000006 to ./binlog.000006
2024-02-23T13:30:46.425801-00:00 0 [Note] [MY-011825] [Xtrabackup] Copying /
data/backups/inc1/binlog.index to ./binlog.index
2024-02-23T13:30:46.425940-00:00 0 [Note] [MY-011825] [Xtrabackup] Done:
Copying /data/backups/inc1/binlog.index to ./binlog.index
2024-02-23T13:30:46.427799-00:00 0 [Note] [MY-011825] [Xtrabackup] completed OK!
[root@mysql8 backups]#

Dieser Befehl wendet die Deltadateien in /data/backups/inc1 auf die Dateien in /data/backups/base an, wodurch sie auf den Zeitpunkt der inkrementellen Sicherung vorgerollt werden. Anschließend wird das Redo-Log wie üblich auf das Ergebnis angewendet. Die endgültigen Daten befinden sich in /data/backups/base, nicht im inkrementellen Verzeichnis.

Beim Zusammenführen inkrementeller Backups sollte die Option --apply-log-only für alle dazwischenliegenden inkrementellen Backups außer dem letzten verwendet werden. Das liegt daran, dass die Option --apply-log-only die Rollback-Phase überspringt und das Backup nur für die Anwendung des nächsten inkrementellen Backups vorbereitet.

Um das letzte inkrementelle Backup zusammenzuführen, solltest du daher den folgenden Befehl ausführen:

[root@mysql8 backups]# xtrabackup --prepare --target-dir=/data/backups/base \
--incremental-dir=/data/backups/inc2
2024-02-23T13:32:54.413264-00:00 0 [Note] [MY-011825] [Xtrabackup] recognized
server arguments: --innodb_checksum_algorithm=crc32 --innodb_log_checksums=1
--innodb_data_file_path=ibdata1:12M:autoextend --innodb_log_file_size=50331648
--innodb_page_size=16384 --innodb_undo_directory=./ --innodb_undo_tablespaces=2
--server-id=0 --innodb_log_checksums=ON --innodb_redo_log_encrypt=0
--innodb_undo_log_encrypt=0
2024-02-23T13:32:54.414978-00:00 0 [Note] [MY-011825] [Xtrabackup] recognized
client arguments: --prepare=1 --target-dir=/data/backups/base
--incremental-dir=/data/backups/inc2
xtrabackup version 8.0.35-30 based on MySQL server 8.0.35 Linux (x86_64)
(revision id: 6beb4b49)
2024-02-23T13:32:54.415995-00:00 0 [Note] [MY-011825] [Xtrabackup] incremental
backup from 20784993 is enabled.
2024-02-23T13:32:54.416111-00:00 0 [Note] [MY-011825] [Xtrabackup] cd to /data/
backups/base/
2024-02-23T13:32:54.416290-00:00 0 [Note] [MY-011825] [Xtrabackup] This target
seems to be already prepared with --apply-log-only.
2024-02-23T13:32:54.426669-00:00 0 [Note] [MY-011825] [Xtrabackup]
xtrabackup_logfile detected: size=8388608, start_lsn=(21291941)
2024-02-23T13:32:54.427121-00:00 0 [Note] [MY-011825] [Xtrabackup] using the
following InnoDB configuration for recovery:
2024-02-23T13:32:54.427198-00:00 0 [Note] [MY-011825] [Xtrabackup]
innodb_data_home_dir = .
2024-02-23T13:32:54.427266-00:00 0 [Note] [MY-011825] [Xtrabackup]
innodb_data_file_path = ibdata1:12M:autoextend
2024-02-23T13:32:54.427333-00:00 0 [Note] [MY-011825] [Xtrabackup]
innodb_log_group_home_dir = /data/backups/inc2/
2024-02-23T13:32:57.169249-00:00 0 [Note] [MY-011825] [Xtrabackup] Done:
Copying /data/backups/inc2/binlog.000011 to ./binlog.000011
2024-02-23T13:32:57.170686-00:00 0 [Note] [MY-011825] [Xtrabackup] Copying /
data/backups/inc2/binlog.index to ./binlog.index
2024-02-23T13:32:57.170819-00:00 0 [Note] [MY-011825] [Xtrabackup] Done:
Copying /data/backups/inc2/binlog.index to ./binlog.index
2024-02-23T13:32:57.173092-00:00 0 [Note] [MY-011825] [Xtrabackup] completed OK!
[root@mysql8 backups]#

Da dies die letzte inkrementelle Sicherung ist, kannst du --prepare ohne die--apply-log-only Option ausführen. Das Backup ist dann immer noch konsistent, aber der Server führt die Rollback-Phase durch. Nach der Vorbereitung ist das Backup einsatzbereit.

Logische Backups

Die beliebtesten Werkzeuge für logische Backups sind das MySQL Shell Dump Utility, mydumper und mysqldump. In diesem Abschnitt behandeln wir das MySQL Shell Dump Utility und mysqldump und erklären, wie man eine vollständige Sicherung und Wiederherstellung durchführt.

Wir behandeln mydumper und myloader in "Große Datenbanken zu Azure Database for MySQL migrieren". Unter "Konvertieren von Tabellen von MyISAM nach InnoDB" findest du weitere Informationen zur Migration auf Tabellenebene.

Das Dienstprogramm MySQL Shell Dump

MySQL Shell ist ein fortschrittlicher Befehlszeilen-Client und eine Skripting-Schnittstelle für MySQL. Sie bietet eine Reihe leistungsfähiger Dienstprogramme für die Datenbankverwaltung und -administration, darunter das Dump-Dienstprogramm, das für die Sicherung und Wiederherstellung von Datenbanken verwendet wird.

Das Dump Utility ist ein funktionsreiches Werkzeug, das die MySQL Shell für die Sicherung von MySQL-Datenbanken bereitstellt. Es ermöglicht dir, komplette Instanz-Backups oder Teil-Backups ausgewählter Schemas oder Tabellen durchzuführen. Außerdem kannst du den Sicherungsprozess mit den verschiedenen Optionen des Dienstprogramms individuell anpassen.

Nachdem du dich eingeloggt hast, kannst du mit dem Dump-Dienstprogramm Sicherungen durchführen, wie in diesem Beispiel gezeigt:

[root@mysql80 ~]# mysqlsh --uri root@localhost:3306
MySQL Shell 8.0.36

Copyright (c) 2016, 2023, Oracle and/or its affiliates.
Oracle is a registered trademark of Oracle Corporation and/or its
Server version: 8.0.36 MySQL Community Server - GPL
No default schema selected; type \use <schema> to set one.
 MySQL  localhost:3306 ssl  JS >

Bevor du das eigentliche Backup durchführst, solltest du einen Trockenlauf durchführen, um den Backup-Prozess zu überprüfen. Der folgende Befehl, util.dumpInstance, kann für den Trockenlauf verwendet werden:

 MySQL  localhost:3306 ssl  JS > util.dumpInstance("/mysqlsh/backuputildump/",
  {dryRun:"true"})

dryRun enabled, no locks will be acquired and no files will be created.
Acquiring global read lock
Global read lock acquired
Initializing - done
1 out of 5 schemas will be dumped and within them 1 table, 0 views.
1 out of 4 users will be dumped.
Gathering information - done
All transactions have been started
Locking instance for backup
Global read lock has been released
Writing global DDL files
Writing users DDL
Writing DDL - done
Starting data dump
0% (0 rows / ~20 rows), 0.00 rows/s, 0.00 B/s uncompressed, 0.00 B/s compressed
 MySQL  localhost:3306 ssl  JS >

Eine Vollsicherung der Instanz stellt sicher, dass du eine Sicherung der gesamten Datenbankinstanz hast, falls unvorhergesehene Umstände eintreten. Mit dem folgenden Kommando kannst du ein vollständiges Instanz-Backup durchführen:

MySQL  localhost:3306 ssl  JS >  util.dumpInstance("/backuputildump")
Acquiring global read lock
Global read lock acquired
Initializing - done
1 out of 5 schemas will be dumped and within them 1 table, 0 views.
1 out of 4 users will be dumped.
Gathering information - done
All transactions have been started
Locking instance for backup
Global read lock has been released
Writing global DDL files
Writing users DDL
Running data dump using 4 threads.
NOTE: Progress information uses estimated values and may not be accurate.
Writing schema metadata - done
Writing DDL - done
Writing table metadata - done
Starting data dump
100% (20 rows / ~20 rows), 0.00 rows/s, 0.00 B/s uncompressed,
0.00 B/s compressed
Dump duration: 00:00:00s
Total duration: 00:00:00s
Schemas dumped: 1
Tables dumped: 1
Uncompressed data size: 727 bytes
Compressed data size: 258 bytes
Compression ratio: 2.8
Rows written: 20
Bytes written: 258 bytes
Average uncompressed throughput: 727.00 B/s
Average compressed throughput: 258.00 B/s
 MySQL  localhost:3306 ssl  JS >

Das Backup wird in folgendem Verzeichnis gespeichert:

[root@mysql80 ~]# ls -ltr /backuputildump
total 44
-rw-r-----. 1 root root  240 Feb 20 10:37 @.sql
-rw-r-----. 1 root root  240 Feb 20 10:37 @.post.sql
-rw-r-----. 1 root root  774 Feb 20 10:37 @.json
-rw-r-----. 1 root root 1965 Feb 20 10:37 @.users.sql
-rw-r-----. 1 root root  301 Feb 20 10:37 mytestdb.json
-rw-r-----. 1 root root  575 Feb 20 10:37 mytestdb.sql
-rw-r-----. 1 root root  784 Feb 20 10:37 mytestdb@test_table.sql
-rw-r-----. 1 root root  649 Feb 20 10:37 mytestdb@test_table.json
-rw-r-----. 1 root root    8 Feb 20 10:37 mytestdb@test_table@@0.tsv.zst.idx
-rw-r-----. 1 root root  258 Feb 20 10:37 mytestdb@test_table@@0.tsv.zst
-rw-r-----. 1 root root  228 Feb 20 10:37 @.done.json
[root@mysql80 ~]#

Um den Instanz-Dump mit erweiterten Optionen auszuführen, verwende den folgenden Befehl:

 MySQL  localhost:3306 ssl  JS > util.dumpInstance(\"/backuputildump/
 mysqlinstance", {threads:8,maxRate:\"100M",consistent:true,chunking:true,
 bytesPerchunk:\"64M",compression:\"zstd"})

Acquiring global read lock
Global read lock acquired
Initializing - done
1 out of 5 schemas will be dumped and within them 1 table, 0 views.
1 out of 4 users will be dumped.
Gathering information - done
All transactions have been started
Locking instance for backup
Global read lock has been released
Writing global DDL files
Writing users DDL
Running data dump using 8 threads.
NOTE: Progress information uses estimated values and may not be accurate.
Writing schema metadata - done
Writing DDL - done
Writing table metadata - done
Starting data dump
100% (20 rows / ~20 rows), 0.00 rows/s, 0.00 B/s uncompressed,
0.00 B/s compressed
Dump duration: 00:00:00s
Total duration: 00:00:00s
Schemas dumped: 1
Tables dumped: 1
Uncompressed data size: 727 bytes
Compressed data size: 258 bytes
Compression ratio: 2.8
Rows written: 20
Bytes written: 258 bytes
Average uncompressed throughput: 727.00 B/s
Average compressed throughput: 258.00 B/s
 MySQL  localhost:3306 ssl  JS >

In diesem Befehl kannst du verschiedene Optionen angeben, um den Dump-Prozess zu steuern und zu verbessern. Du kannst z.B. die Anzahl der zu verwendenden Threads, die maximale Geschwindigkeit, mit der das Backup geschrieben werden soll, angeben, ob ein konsistentes Backup durchgeführt werden soll, ob die Backup-Daten in Chunks aufgeteilt werden sollen, wie groß die einzelnen Chunks sein sollen und welcher Kompressionsalgorithmus verwendet werden soll.

Mit dem Schema-Dump-Dienstprogramm kannst du Teil-Backups ausgewählter Schemas durchführen. Du kannst den folgenden Befehl util.dumpSchemas verwenden, um bestimmte Schemas zu sichern:

 MySQL  localhost:3306 ssl  JS > util.dumpSchemas([\"employees"],
 \"/backupdir/employees",{threads :2})
Acquiring global read lock
Global read lock acquired
Initializing - done
1 schemas will be dumped and within them 2 tables, 0 views.
Gathering information - done
All transactions have been started
Locking instance for backup
Global read lock has been released
Writing global DDL files
Running data dump using 2 threads.
NOTE: Progress information uses estimated values and may not be accurate.
Writing schema metadata - done
Writing DDL - done
Writing table metadata - done
Starting data dump
100% (8 rows / ~8 rows), 0.00 rows/s, 0.00 B/s uncompressed, 0.00 B/s compressed
Dump duration: 00:00:00s
Total duration: 00:00:00s
Schemas dumped: 1
Tables dumped: 2
Uncompressed data size: 224 bytes
Compressed data size: 182 bytes
Compression ratio: 1.2
Rows written: 8
Bytes written: 182 bytes
Average uncompressed throughput: 224.00 B/s
Average compressed throughput: 182.00 B/s
 MySQL  localhost:3306 ssl  JS >

In diesem Befehl kannst du den Speicherort der Sicherung und die Namen der zu sichernden Schemas angeben. Die Sicherung wird im folgenden Verzeichnis gespeichert, das nur für die Datenbank employees gilt:

[root@mysql80 ~]# ls -ltr /backupdir/employees
total 64
-rw-r-----. 1 root root 240 Feb 20 10:51 @.sql
-rw-r-----. 1 root root 240 Feb 20 10:51 @.post.sql
-rw-r-----. 1 root root 771 Feb 20 10:51 @.json
-rw-r-----. 1 root root 362 Feb 20 10:51 employees.json
-rw-r-----. 1 root root 716 Feb 20 10:51 employees@salaries.sql
-rw-r-----. 1 root root 631 Feb 20 10:51 employees@salaries.json
-rw-r-----. 1 root root 798 Feb 20 10:51 employees@employees.sql
-rw-r-----. 1 root root 657 Feb 20 10:51 employees@employees.json
-rw-r-----. 1 root root 581 Feb 20 10:51 employees.sql
-rw-r-----. 1 root root   8 Feb 20 10:51 employees@salaries@0.tsv.zst.idx
-rw-r-----. 1 root root   8 Feb 20 10:51 employees@employees@@0.tsv.zst.idx
-rw-r-----. 1 root root  52 Feb 20 10:51 employees@salaries@0.tsv.zst
-rw-r-----. 1 root root   8 Feb 20 10:51 employees@salaries@@1.tsv.zst.idx
-rw-r-----. 1 root root 121 Feb 20 10:51 employees@employees@@0.tsv.zst
-rw-r-----. 1 root root   9 Feb 20 10:51 employees@salaries@@1.tsv.zst
-rw-r-----. 1 root root 344 Feb 20 10:51 @.done.json
[root@mysql80 ~]#

Mit dem Table Dump Utility kannst du partielle Backups ausgewählter Tabellen durchführen. Verwende den folgenden Befehl, util.dumpTables, um einzelne Tabellen zu sichern:

 MySQL  localhost:3306 ssl  JS > util.dumpTables(\"employees",[\"salaries"],
 \"/backupdir/employees/salaries",{threads:2})
Acquiring global read lock
Global read lock acquired
Initializing - done
1 tables and 0 views will be dumped.
Gathering information - done
All transactions have been started
Locking instance for backup
Global read lock has been released
Writing global DDL files
Running data dump using 2 threads.
NOTE: Progress information uses estimated values and may not be accurate.
Writing schema metadata - done
Writing DDL - done
Writing table metadata - done
Starting data dump
100% (4 rows / ~4 rows), 0.00 rows/s, 0.00 B/s uncompressed, 0.00 B/s compressed
Dump duration: 00:00:00s
Total duration: 00:00:00s
Schemas dumped: 1
Tables dumped: 1
Uncompressed data size: 88 bytes
Compressed data size: 61 bytes
Compression ratio: 1.4
Rows written: 4
Bytes written: 61 bytes
Average uncompressed throughput: 88.00 B/s
Average compressed throughput: 61.00 B/s
 MySQL  localhost:3306 ssl  JS >

Das Backup wird in folgendem Verzeichnis gespeichert, das nur für die Tabelle employees​.sal⁠aries gilt:

[root@mysql80 ~]# ls -ltr /backupdir/employees/salaries
total 48
-rw-r-----. 1 root root 240 Feb 20 11:05 @.sql
-rw-r-----. 1 root root 240 Feb 20 11:05 @.post.sql
-rw-r-----. 1 root root 770 Feb 20 11:05 @.json
-rw-r-----. 1 root root 236 Feb 20 11:05 employees.json
-rw-r-----. 1 root root 478 Feb 20 11:05 employees.sql
-rw-r-----. 1 root root 631 Feb 20 11:05 employees@salaries.json
-rw-r-----. 1 root root 716 Feb 20 11:05 employees@salaries.sql
-rw-r-----. 1 root root   8 Feb 20 11:05 employees@salaries@0.tsv.zst.idx
-rw-r-----. 1 root root   8 Feb 20 11:05 employees@salaries@@1.tsv.zst.idx
-rw-r-----. 1 root root  52 Feb 20 11:05 employees@salaries@0.tsv.zst
-rw-r-----. 1 root root   9 Feb 20 11:05 employees@salaries@@1.tsv.zst
-rw-r-----. 1 root root 266 Feb 20 11:05 @.done.json
[root@mysql80 ~]#

In diesem Befehl kannst du den Sicherungsort und die Namen der zu sichernden Tabellen sowie die jeweiligen Schemanamen angeben.

Nachdem du die Datenbank gesichert hast, möchtest du die Daten in eine andere oder dieselbe Datenbank zurückspielen. Zu diesem Zweck enthält die MySQL Shell ein Dienstprogramm zum Laden von Daten. Mit diesem Dienstprogramm kannst du Daten aus einer Sicherungsdatei in eine Datenbank importieren.

Bevor du die Daten wiederherstellst, empfehlen wir dir, einen Trockenlauf durchzuführen, um die Sicherungsdatei zu überprüfen. Verwende diesen einfachen loadDump Befehl, um einen Trockenlauf durchzuführen:

 MySQL  localhost:3306 ssl  JS > util.loadDump(\"/backuputildump/",{dryRun:true})
Loading DDL and Data from '/backuputildump/' using 4 threads.
Opening dump...
dryRun enabled, no changes will be made.
Target is MySQL 8.0.36. Dump was produced from MySQL 8.0.36
Scanning metadata - done
Checking for pre-existing objects...
Executing common preamble SQL
Executing DDL - done
Executing view DDL - done
Starting data load
Executing common postamble SQL
0% (0 bytes / 727 bytes), 0.00 B/s, 1 / 1 tables done
Recreating indexes - done
No data loaded.
0 warnings were reported during the load.
 MySQL  localhost:3306 ssl  JS >

Ebenso kannst du den Befehl (je nach Anforderung) vor dem Laden der Daten testen, um sicherzustellen, dass er richtig funktioniert. Das folgende Beispiel zeigt, wie du dieses Dienstprogramm für die Wiederherstellung von Backups verwenden kannst:

 MySQL  localhost:3306 ssl  JS > util.loadDump(\"/backuputildump/",
 {progressFile:
 \"/backuputildump/backuplog.json",threads:4,backgroundThreads:4,
 maxBytesPerTransaction:"4096"})
Loading DDL and Data from '/backuputildump/' using 4 threads.
Opening dump...
Target is MySQL 8.0.36. Dump was produced from MySQL 8.0.36
Scanning metadata - done
Checking for pre-existing objects...
Executing common preamble SQL
Executing DDL - done
Executing view DDL - done
Starting data load
Executing common postamble SQL
100% (727 bytes / 727 bytes), 0.00 B/s, 1 / 1 tables done
Recreating indexes - done
1 chunks (20 rows, 727 bytes) for 1 tables in 1 schemas were loaded in 0 sec
(avg throughput 727.00 B/s)
0 warnings were reported during the load.
 MySQL  localhost:3306 ssl  JS >

Der vorangehende Befehl stellt die Daten aus der Sicherung des Verzeichnisses/backuputildump/ wieder her und verwendet während des Wiederherstellungsprozesses vier Threads und vier Hintergrundthreads. Außerdem wird eine Fortschrittsdatei unter /backuputildump/backuplog.json erstellt und die maximale Anzahl von Bytes pro Transaktion auf 4.096 gesetzt.

mysqldump

MySQL bietet das mysqldump Kommandozeilenprogramm zum Erstellen von logischen Datenbanksicherungen. In diesem Abschnitt erfahren wir, wie wir mysqldump effektiv nutzen können. Bevor wir uns mit dem Backup-Prozess beschäftigen, ist es wichtig, den Befehl mysqldump und seine Optionen zu verstehen. Der einfachste Weg, um auf diemysqldump Dokumentation zuzugreifen, ist die Kommandozeilenhilfe:

[root@mysql80 ~]# man mysqldump

Mit diesem Befehl wird das Handbuch mysqldump aufgerufen, das detaillierte Informationen über die Syntax, die Optionen und die Verwendung des Befehls enthält.

Sichern einzelner Tabellen

Die Sicherung von einzelnen Tabellen ist nützlich, wenn du nur bestimmte Datensätze wiederherstellen musst. Um mit dem Befehl mysqldump Backups von einzelnen Tabellen in einer Datenbank zu erstellen, verwendest du die folgende Syntax:

mysqldump database_name table_name > backup_file.sql

Um zum Beispiel ein Backup der Tabelle city in der world database zu erstellen, verwende den folgenden Befehl:

[root@mysql80 backup]# mysqldump -uroot -p world city > city.sql
Enter password:
[root@mysql80 backup]# ls -ltr
total 176
-rw-r--r--. 1 root root 179263 Feb 20 12:59 city.sql
[root@mysql80 backup]#

Verwende die Option --where, um nur eine Teilmenge der Daten einer Tabelle zu sichern. Um zum Beispiel nur die Zeilen in der Tabelle city zu sichern, in der CountryCode 5 ist, führe folgenden Befehl aus:

[root@mysql80 backup]# mysqldump world -u root -p city
--where=\"CountryCode='USA'" > city_USA.sql
Enter password:
[root@mysql80 backup]# ls -ltr
-rw-r--r--. 1 root root  14060 Feb 20 13:01 city_USA.sql
[root@mysql80 backup]#

Verwende die Option --ignore-table, um bestimmte Tabellen von deiner Sicherung auszuschließen. Du kannst zum Beispiel den folgenden Befehl verwenden, um alle Tabellen in der Datenbank world mit Ausnahme der Tabelle city zu sichern:

[root@mysql80 backup]# mysqldump -u root -p world
--ignore-table=world.city > ignore_city_world.sql
Enter password:
[root@mysql80 backup]# ls -ltr
-rw-r--r--. 1 root root  66071 Feb 20 13:08 ignore_city_world.sql
[root@mysql80 backup]#

Um eine komplette Datenbanksicherung zu erstellen, verwendest du den Befehl mysqldump mit dem Datenbanknamen als Argument:

mysqldump database_name > backup_file.sql

Um zum Beispiel die Datenbank world zu sichern, verwende den folgenden Befehl:

[root@mysql80 backup]# mysqldump -u root -p world > world.sql
Enter password:
[root@mysql80 backup]# ls -ltr
-rw-r--r--. 1 root root 244085 Feb 20 13:05 world.sql
[root@mysql80 backup]#

Sichern von mehreren Datenbanken

Um mehrere Datenbanken zu sichern, gibst du sie als kommagetrennte Liste an:

mysqldump --databases database1,database2 > backup_file.sql

Um zum Beispiel die Datenbanken mytestdb sakila world_x und example_db1 zu sichern, führe den folgenden Befehl aus:

[root@mysql80 backup]# mysqldump -u root -p --databases mytestdb employees
sakila> all_db_backup.sql
Enter password:
[root@mysql80 backup]# ls -ltr
-rw-r--r--. 1 root root 3390832 Feb 20 13:27 all_db_backup.sql
[root@mysql80 backup]#

Sichern aller Datenbanken

Um alle Datenbanken auf dem MySQL-Server zu sichern, verwendest du die Option --all-databases:

[root@mysql80 backup]#  mysqldump -u root -p --all-databases
> all_databases_backup.sql
Enter password:
[root@mysql80 backup]# ls -ltr
-rw-r--r--. 1 root root 4937167 Feb 20 13:29 all_databases_backup.sql
[root@mysql80 backup]#

Dadurch wird eine einzige Sicherungsdatei erstellt, die alle Datenbanken auf dem Server enthält.

Das Befehlszeilentool mysqldump erstellt ein logisches Backup einer Datenbank, indem es eine Reihe von SQL-Anweisungen generiert, mit denen die Datenbankobjekte und -daten neu erstellt werden können. Das folgende Beispiel erstellt ein Backup der Datenbank sakila mit verschiedenen Optionen für ein effizientes und konsistentes Backup:

[root@mysql80 backup]# mysqldump -u root -p --single-transaction --quick
--lock-tables=false --routines --events --triggers
--default-character-set=utf8mb4 sakila >backup.sql
Enter password:
[root@mysql80 backup]# ls -ltr
-rw-r--r--. 1 root root 3397023 Feb 20 13:31 backup.sql
[root@mysql80 backup]#

Schauen wir uns die einzelnen Optionen des Befehls an. Mit diesem Befehl wird mysqldump angewiesen, ein Backup der angegebenen Datenbank (dbname) zu erstellen und es in einer Datei namens backup.sql zu speichern:

--single-transaction

Stellt sicher, dass die Sicherung konsistent ist, auch wenn zur gleichen Zeit andere Transaktionen in der Datenbank durchgeführt werden.

--quick

Weist mysqldump an, eine Zeile nach der anderen abzurufen, anstatt die gesamte Ergebnismenge auf einmal abzurufen, was dazu beitragen kann, die Speichernutzung zu reduzieren.

--lock-tables=false

Stellt sicher, dass die Tabellen während des Backup-Prozesses nicht gesperrt werden, so dass die Datenbank weiterhin normal funktionieren kann.

--routines, --events, und --triggers

Weist mysqldump an, gespeicherte Routinen, Ereignisse und Auslöser in das Backup aufzunehmen.

--default-character-set=utf8mb4

Ermöglicht es dir, die Verwendung des Zeichensatzes utf8mb4 in dem erzeugten SQL-Skript zu erzwingen. Dies kann nützlich sein, wenn du sicherstellen musst, dass das Backup alle in deiner Datenbank verwendeten Zeichen unterstützt, insbesondere wenn es Emojis oder andere Sonderzeichen enthält, die nicht in den Standardzeichensatz UTF-8 passen.

Wenn du ein logisches Backup mit mysqldump erstellt hast, kannst du es verwenden, um die Datenbank auf einem anderen Server neu zu erstellen oder um sie wiederherzustellen, wenn sie beschädigt wurde. Um ein logisches Backup wiederherzustellen, führst du einfach mit dem MySQL-Client die SQL-Anweisungen aus, die in der Backup-Datei enthalten sind.

Um einen Replikat-Knoten zu sichern und wiederherzustellen, kannst du entweder die --source-data oder--master-data Option verwenden. Verwenden Sie --source-data für MySQL 8.0.26 und neuer, oder verwenden Sie--master-data für frühere Versionen. Beide Optionen haben den gleichen Zweck, nämlich eine Dump-Datei zu erzeugen, die dazu verwendet werden kann, während der Replikation einen anderen Server als Replikat des Ausgangsservers einzurichten.

Wenn diese Optionen verwendet werden, enthält die resultierende Dump-Ausgabe eine CHANGE REPLICATION SOURCE TO -Anweisung (eingeführt in MySQL 8.0.23) oder eine CHANGE MASTER TO -Anweisung (verwendet vor MySQL 8.0.23). Diese Anweisung gibt die binären Log-Koordinaten (Dateiname und Position) des gedumpten Servers an, die angeben, von wo aus der Replikations-Quellserver nach dem Laden der Dump-Datei in dasReplikat mit der Replikation beginnen soll.

Wenn die Optionen --source-data oder --master-data auf 2 gesetzt sind, wird die Anweisung CHANGE REPLICATION SOURCE TO oder CHANGE MASTER TO in der Dumpdatei auskommentiert, so dass sie beim erneuten Laden der Dumpdatei nicht wirksam wird. Mit dem Optionswert 1 wird die Anweisung unkommentiert geschrieben und beim Neuladen der Dumpdatei wirksam. Wenn kein Optionswert explizit angegeben wird, wird der Standardwert 1 verwendet.

Einrichten eines Zeitplans für die Datensicherung

Erstelle ein Shell-Skript, das die MySQL-Sicherung mit Percona XtraBackup durchführt. Du kannst eine neue Datei mit einem beliebigen Texteditor (z.B. nano oder Vim) erstellen und sie mit der Erweiterung .sh speichern. In diesem Skript musst du die folgenden Befehle einfügen:

[root@mysql80 backup]# cat backup_script.sh
#!/bin/bash
# Set the MySQL username and password
MYSQL_USER="root"
MYSQL_PASSWORD='D@#NJU#$@MK28#nM'
# Set the backup directory
BACKUP_DIR="/root/backupdir/newbackup"
# Take a full backup using Percona XtraBackup
xtrabackup --backup --user=$MYSQL_USER --password=$MYSQL_PASSWORD
--target-dir=$BACKUP_DIR/full_backup_$(date +%Y-%m-%d_%H-%M-%S)
[root@mysql80 backup]#

In diesem Skript musst du die Werte für MYSQL_USER, MYSQL_PASSWORD und BACKUP_DIR durch die entsprechenden Werte für dein System ersetzen. Vergewissere dich außerdem, dass du dem Skript Ausführungsrechte gibst, indem du den Befehl:

[root@mysql80 backup]#  chmod +x backup_script.sh
[root@mysql80 backup]# ls -ltr
total 4
-rwxr-xr-x. 1 root root 344 Feb 20 13:35 backup_script.sh
[root@mysql80 backup]#

Der Befehl ./backup_script.sh führt ein Shell-Skript namens backup_script.sh aus, das sich im aktuellen Verzeichnis befindet:

[root@mysql80 backup]# ./backup_script.sh

2024-02-20T13:42:56.095800-00:00 0 [Note] [MY-011825] [Xtrabackup] recognized
server arguments: --datadir=/var/lib/mysql
2024-02-20T13:42:56.096132-00:00 0 [Note] [MY-011825] [Xtrabackup] recognized
client arguments: --user=root --password=* --socket=/var/lib/mysql/mysql.sock
--backup=1 --user=root --password=*
--target-dir=/root/backupdir/newbackup/full_backup_2024-02-20_13-42-55
xtrabackup version 8.0.35-30 based on MySQL server 8.0.35 Linux (x86_64)
(revision id: 6beb4b49)
240220 13:42:56  version_check Connecting to MySQL server with DSN 'dbi:mysql:;
mysql_read_default_group=xtrabackup;mysql_socket=/var/lib/mysql/mysql.sock'
as 'root'  (using password: YES).
240220 13:42:56  version_check Connected to MySQL server
240220 13:42:56  version_check Executing a version check against the server...
240220 13:42:56  version_check Done.
2024-02-20T13:42:56.369830-00:00 0 [Note] [MY-011825] [Xtrabackup]
Connecting to MySQL server host: localhost, user: root, password: set,
port: not set, socket: /var/lib/mysql/mysql.sock
2024-02-20T13:42:59.708031-00:00 0 [Note] [MY-011825] [Xtrabackup]
Done: Writing file /root/backupdir/newbackup/full_backup_2024-02-20_13-42-55/
xtrabackup_info
2024-02-20T13:43:00.711702-00:00 0 [Note] [MY-011825] [Xtrabackup]
Transaction log of lsn (32549485) to (32549485) was copied.
2024-02-20T13:43:00.831082-00:00 0 [Note] [MY-011825] [Xtrabackup] completed OK!
[root@mysql80 backup]#

Um sicherzustellen, dass deine Datenbank regelmäßig gesichert wird, ist es wichtig, dass du einen Zeitplan für die Datensicherung erstellst. Um einen Zeitplan für die Datensicherung einzurichten, kannst du Cron-Aufträge oder andere Zeitplanungsprogramme verwenden. Hier ist ein Beispiel für einen Cron-Job, der jeden Tag um 2 Uhr nachts eine Sicherung durchführt:

crontab -e
0 2 * * * /root/backupdir/newbackup/backup_script.sh

Um einen Backup-Zeitplan einzurichten, kannst du eine Kombination aus crontab und der von dir gewählten Backup-Methode verwenden. Hier ist eine Beispielkonfiguration für die Einrichtung eines täglichen Sicherungsplans mit mysqldump:

  1. Erstelle ein Backup-Verzeichnis, um die Backup-Dateien zu speichern:

    [root@mysql80 ~]# sudo mkdir -p /mnt/backups/mysql/
    [root@mysql80 ~]#
  2. Erteile dem Backup-Verzeichnis die erforderlichen Berechtigungen:

    [root@mysql80 ~]# sudo chown -R mysql:mysql /mnt/backups/mysql/
    [root@mysql80 ~]#
  3. Verwende sudo chmod -R 700 /mnt/backups/mysql/, um die Berechtigungen des Verzeichnisses /mnt/backups/mysql/ und aller seiner Unterverzeichnisse und Dateien zu ändern:

    [root@mysql80 ~]# sudo chmod -R 700 /mnt/backups/mysql/
    [root@mysql80 ~]#
  4. Erstelle ein Shell-Skript:

    [root@mysql80 mysql]# cat /mnt/backups/mysql/backup_mysqldump.sh
    
    #!/bin/bash
    # Set the backup directory
    backup_dir="/mnt/backups/mysql"
    # Set the MySQL credentials
    mysql_user="root"
    mysql_password='D@#NJU#$@MK28#nM'
    # Create the backup filename with date stamp
    backup_filename="$backup_dir/daily_backup_$(date +%Y%m%d).sql"
    # Execute the mysqldump command and save output to file
    mysqldump --all-databases --user="$mysql_user" --password="$mysql_password"
    > "$backup_filename"
    [root@mysql80 mysql]#
  5. Teste das Skript, indem du es ausführst:

    [root@mysql80 mysql]# /mnt/backups/mysql/backup_mysqldump.sh
    /mnt/backups/mysql/daily_backup_20240220.sql
    [root@mysql80 mysql]# ls -ltr
    total 4828
    -rwxr-xr-x. 1 root root     472 Feb 20 14:18 backup_mysqldump.sh
    -rw-r--r--. 1 root root 4937167 Feb 20 14:18 daily_backup_20240220.sql
    [root@mysql80 mysql]#
  6. Öffne die crontab-Konfiguration:

    crontab -e
  7. Füge die folgende Zeile in die Datei crontab ein, um ein tägliches Backup um 2 Uhr morgens zu planen:

    0 2 * * * /mnt/backups/mysql/backup_mysqldump.sh
  8. Speichere und schließe die crontab-Datei.

Wenn du diese Beispielkonfiguration befolgst, kannst du mit mysqldump einen täglichen Sicherungsplan für eine MySQL-Datenbank einrichten und sicherstellen, dass die Sicherungsdateien sicher gespeichert werden und bei Bedarf wiederhergestellt werden können. Die mitgelieferten Sicherungsskripte sind einfache Beispiele. Je nach deinen Anforderungen musst du eventuell Skripte mit Skriptsprachen wie Python oder einem Shell-Skript schreiben.

Auswahl der Sicherungsoptionen

Wenn du auf ein Backup erstellst, wähle verschiedene Backup-Optionen, um den Backup-Prozess anzupassen. Hier sind einige wichtige Backup-Optionen:

Sicherungsart

Wähle entweder eine Vollsicherung oder eine inkrementelle Sicherung. Vollsicherungen erstellen eine vollständige Sicherung der Datenbank, während inkrementelle Sicherungen nur die Änderungen seit der letzten Sicherung sichern.

Komprimierung

Komprimiere die Sicherungsdatei, um Speicherplatz zu sparen. XtraBackup, mydumper und mysqldump unterstützen die Komprimierung.

Verschlüsselung

Verschlüssele die Sicherungsdatei, um sensible Daten zu schützen. XtraBackup unterstützt die Verschlüsselung über die Option --encrypt.

Überwachung des Backup-Prozesses

ist es wichtig, den Backup-Prozess zu überwachen, um sicherzustellen, dass er erfolgreich abgeschlossen wird. Hier sind einige Möglichkeiten, diesen Prozess zu überwachen:

  • Überprüfe das Backup-Logfile auf Fehler oder Warnungen.

  • Überprüfe die Größe der Sicherungsdatei, um sicherzustellen, dass sie nicht zu klein oder zu groß ist.

  • Um die Gültigkeit der Sicherungsdatei sicherzustellen, führe regelmäßig Wiederherstellungen durch, indem du die Produktionssicherung auf dem Testsystem verwendest.

Einrichten der Wiederherstellungsumgebung

Nachdem du unter eine Wiederherstellungsmethode ausgewählt hast, richte die Umgebung für den Wiederherstellungsprozess ein. Vergewissere dich, dass die Serverkonfiguration mit den Sicherungsdateien kompatibel ist, einschließlich der Version von MySQL und dem Speicherort des Datenverzeichnisses. Erstelle bei Bedarf eine neue MySQL-Instanz mit der gleichen Konfiguration wie die ursprüngliche Instanz.

Angenommen, das Backup wurde von einer MySQL 8.0.23 Instanz erstellt und du möchtest es auf einer neuen MySQL 8.0.25 Instanz wiederherstellen, kannst du die Umgebung für den Wiederherstellungsprozess mit den folgenden Schritten einrichten:

  • Installiere MySQL 8.0.25 auf dem Server, auf dem du die Datenbank wiederherstellen willst.

  • Beende den MySQL-Dienst mit dem Befehl systemctl stop mysqld.

  • Kopiere die Konfigurationsdatei von der ursprünglichen Instanz auf die neue Instanz, indem du einen Befehl wie scp verwendest.

  • Bearbeite die Konfigurationsdatei /etc/my.cnf so, dass sie mit der Konfiguration der ursprünglichen Instanz übereinstimmt, einschließlich des Speicherorts für das Datenverzeichnis.

  • Je nach Backup variiert der Wiederherstellungsprozess.

  • Starte den MySQL-Dienst mit dem Befehl systemctl start mysqld.

Bei der Wahl einer Sicherungsmethode solltest du die Größe deiner Datenbank, die Anzahl der Datenänderungen und die RTO und RPO deines Unternehmens berücksichtigen. XtraBackup ist zum Beispiel eine effiziente Sicherungsmethode für große Datenbanken, die eine schnelle Wiederherstellungszeit benötigen, während mydumper im Vergleich zu XtraBackup mehr Zeit benötigt und mysqldump für kleinere Datenbanken geeignet ist, die sich längere Wiederherstellungszeiten leisten können.

Point-in-Time Recovery

Point-in-Time Recovery (PITR) ist eine Technik, mit der eine Datenbank zu einem bestimmten Zeitpunkt wiederhergestellt werden kann, in der Regel nach einer versehentlichen Löschung, Datenbeschädigung oder anderen Arten von Datenverlust. Dabei wird eine Datenbank in einem früheren Zustand wiederhergestellt, indem Transaktionsprotokolle wiedergegeben werden, die zu bestimmten Zeitpunkten erfasst wurden.

PITR ist notwendig, wenn du deine Datenbank zu einem bestimmten Zeitpunkt wiederherstellen musst. Wenn du zum Beispiel versehentlich wichtige Daten aus der Datenbank gelöscht hast und dies erst einige Stunden später bemerkst, kannst du mit PITR die Datenbank zu einem Zeitpunkt wiederherstellen, kurz bevor die Daten gelöscht wurden. Wenn die Datenbank beschädigt wurde, kannst du sie mit PITR zu einem Zeitpunkt wiederherstellen, bevor die Beschädigung aufgetreten ist.

PITR ist in den folgenden Situationen notwendig:

Katastrophenhilfe

Wenn du durch eine Katastrophe wie einen Hardwareausfall, einen Stromausfall oder eine Naturkatastrophe einen Datenverlust erleidest, hilft dir PITR, die Daten zu einem bestimmten Zeitpunkt wiederherzustellen, bevor die Katastrophe eintrat.

Menschliches Versagen

Wenn du versehentlich Daten löschst oder veränderst, kannst du mit PITR die Daten zu dem Zeitpunkt wiederherstellen, bevor der Fehler aufgetreten ist.

Compliance

PITR wird oft benötigt, um Vorschriften wie den Health Insurance Portability and Accountability Act (HIPAA), den Sarbanes-Oxley Act (SOX) und die General Data Protection Regulation (GDPR) einzuhalten. Diese Vorschriften können verlangen, dass du Sicherungskopien von Daten aufbewahrst und in der Lage bist, die Daten zu einem bestimmten Zeitpunkt wiederherzustellen.

Wiederherstellung auf Instanz-Ebene

Mit dieser Wiederherstellungsmethode kannst du die gesamte MySQL-Instanz, einschließlich der Datenbanken, Tabellen, Schemas und Konfigurationen, in einem konsistenten Zustand wiederherstellen. Hier ist ein einfaches Beispiel für die Ausführung von PITR. Die Schritte können sich jedoch je nach verwendetem Backup-Tool (z.B. XtraBackup, MySQL Shell dump utility oder mydumper) sowie je nach Backup und Szenario der Produktionsumgebung unterscheiden, daher ist es wichtig, die entsprechenden Maßnahmen zu ergreifen.

Angenommen, du hast eine Datenbank für einen Online-Shop und hast versehentlich die Bestellung eines Kunden gelöscht. Du möchtest diese Bestellung wiederherstellen, aber keine Daten verlieren, die seit dem Löschen der Bestellung hinzugefügt wurden.

So kannst du mit PITR die Bestellung bis zu dem Moment wiederherstellen, bevor sie gelöscht wurde:

  1. Um regelmäßige Sicherungen der Datenbank zu gewährleisten, ist es wichtig, diese in bestimmten Abständen zu planen. Eine Möglichkeit, eine vollständige Sicherung der Datenbank durchzuführen, ist der Befehl xtrabackup, der bereits in "Percona XtraBackup" beschrieben wurde.

  2. Erstelle eine binäre Log-Sicherung der Datenbank mit dem Befehlmysqlbinlog. Um regelmäßige Sicherungen zu gewährleisten, ist es wichtig, ein Skript zu erstellen und sie in bestimmten Abständen zu planen.

    Wenn du die binären Logdateien eines Servers mit mysqlbinlog sicherst, musst du die tatsächlichen Dateinamen angeben, die auf dem Server existieren. Du kannst die Anweisung SHOW BINARY LOGS verwenden, um die aktuellen Namen zu sehen, wenn du dir nicht sicher bist, wie sie lauten:

    mysql> SHOW BINARY LOGS;
    +---------------+-----------+-----------+
    | Log_name      | File_size | Encrypted |
    +---------------+-----------+-----------+
    | binlog.000001 |     35421 |        No |
    | binlog.000002 |     12416 |        No |
    | binlog.000003 |     52273 |        No |
    +---------------+-----------+-----------+

    Um ein statisches Backup von binlog.000001 bis binlog.000003 zu erstellen, kannst du einen der folgenden Befehle verwenden:

    mysqlbinlog --read-from-remote-server --host=host_name --raw
    binlog.000001 binlog.000002 binlog.000003
    
    mysqlbinlog --read-from-remote-server --host=host_name --raw
    --to-last-log binlog.000001

    Der erste Befehl listet explizit alle Dateinamen auf, während der zweite Befehl nur die erste Datei nennt und --to-last-log verwendet, um die letzte Datei zu lesen. Ein Unterschied zwischen diesen Befehlen besteht darin, dass, wenn der Serverbinlog.000133 öffnet, bevor mysqlbinlog das Ende von binlog.000003 erreicht, der erste Befehl diese Datei nicht liest, der zweite Befehl aber schon.

    Um ein Live-Backup zu erstellen, bei dem mysqlbinlog mit binlog.000001 beginnt, um bestehende Logdateien zu kopieren, und dann verbunden bleibt, um neue Ereignisse zu kopieren, sobald der Server sie erzeugt, kannst du Folgendes verwenden:

    mysqlbinlog --read-from-remote-server --host=host_name --raw
    --stop-never binlog.000001

    Mit --stop-never ist es nicht notwendig, alle bereits vorhandenen binären Logdateien anzugeben.

  3. Stelle das vollständige Backup wieder her. (Siehe "Percona XtraBackup" für die Schritte, die erforderlich sind, um die von XtraBackup erstellte Vollsicherung wiederherzustellen).

  4. Wende inkrementelle Backups an, um die Datenbank bis zum gewünschten Zeitpunkt wiederherzustellen:

    mysqlbinlog --start-datetime='2023-03-01 12:00:00'
    --stop-datetime='2023-03-01 13:00:00' /var/log/mysql/binlog.000001 |
    mysql -u root -p mydatabase
Hinweis

Dieses Beispiel demonstriert die Verwendung von XtraBackup. Je nachdem, welches Backup-System in der Produktion eingesetzt wird, hast du die Möglichkeit, entweder das MySQL Shell Dump Utility, mydumper, XtraBackup oder MySQL Enterprise Backup zu verwenden.

In diesem Beispiel stellen wir die Datenbank bis zu einer bestimmten Stunde am 1. März 2023 wieder her, also eine Stunde bevor die Bestellung gelöscht wurde.

Wenn du diese Schritte befolgst, kannst du den gelöschten Auftrag wiederherstellen, ohne dass Daten, die seit der Löschung hinzugefügt wurden, verloren gehen. PITR gibt dir mehr Kontrolle über deinen Datenwiederherstellungsprozess und kann ein wertvolles Hilfsmittel in Disaster-Recovery-Szenarien sein.

Wiederherstellung auf Tabellenebene

Um die Tabelle allein auf einer neuen Instanz wiederherzustellen, musst du sicherstellen, dass du eine gültige Sicherung der Tablespace-Dateien der Tabelle hast. Wenn du das getan hast, kannst du die folgenden Schritte ausführen, um eine Wiederherstellung auf Tabellenebene zu erstellen:

  1. Verbinde dich mit der MySQL-Instanz, in der du die Tabelle wiederherstellen willst, und erstelle die Tabellenstruktur:

    mysql> use adddb;
    Database changed
    mysql> CREATE TABLE `authors` (
        ->       `id` int NOT NULL AUTO_INCREMENT,
        ->       `first_name` varchar(50) COLLATE utf8mb3_unicode_ci NOT NULL,
        ->       `last_name` varchar(50) COLLATE utf8mb3_unicode_ci NOT NULL,
        ->       `email` varchar(100) COLLATE utf8mb3_unicode_ci NOT NULL,
        ->       `birthdate` date NOT NULL,
        ->       `added` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
        ->       PRIMARY KEY (`id`)
        ->     ) ENGINE=InnoDB AUTO_INCREMENT=72639469 DEFAULT CHARSET=utf8mb4
        COLLATE=utf8mb4_0900_ai_ci;
    Query OK, 0 rows affected, 3 warnings (0.03 sec)
  2. Verwerfe den Tablespace der Tabelle authors:

    mysql> select count(*) from authors;
    +----------+
    | count(*) |
    +----------+
    |        0 |
    +----------+
    1 row in set (0.01 sec)
    mysql> ALTER TABLE authors DISCARD TABLESPACE;
    Query OK, 0 rows affected (0.01 sec)
    mysql>

    Wenn ein Tablespace verworfen wird, wird die Verbindung zwischen der Tabelle und dem zugrunde liegenden Tablespace aufgehoben. Die Tabellenstruktur und die Metadaten bleiben erhalten, aber die Tablespace-Dateien sind nicht mehr mit der Tabelle verbunden. Dieser Vorgang wird in der Regel durchgeführt, wenn du die Tablespace-Dateien durch einen anderen Satz von Dateien ersetzen oder die Tabelle aus einer Sicherung wiederherstellen willst.

  3. Kopiere den Tablespace aus dem Backup:

    root@UbuntuMysql8:~# scp /var/lib/mysql/adddb/authors.ibd 172.31.84.219:/var/
    lib/mysql/adddb/
    authors.
    ibd
    100%  544KB  49.3MB/s   00:00
    root@MyUbuntuMysql8:~#
  4. Ändere den Eigentümer der Datei authors.ibd, die sich im Verzeichnis /var/lib/mysql/adddb befindet. Der folgende Befehl weist den Benutzer und die Gruppe mysql als neue Eigentümer der Datei zu:

    [root@mysql80 ~]# chown mysql.mysql /var/lib/mysql/adddb/authors.ibd
    [root@mysql80 ~]#
  5. Importiere den Tablespace. Die Anweisung ALTER TABLE authors IMPORT TABLESPACE; wird in MySQL verwendet, um einen Tablespace für die Tabelle authors innerhalb der Datenbank adddb zu importieren. Mit diesem Befehl kannst du den Tablespace der Tabelle authors wiederherstellen oder ersetzen, indem du eine zuvor exportierte oder gesicherte Tablespace-Datei(normalerweise mit der Erweiterung .ibd ) verwendest. Wenn du diese Anweisung ausführst, weist du MySQL an, die importierte Tablespace-Datei mit der Tabelle authors in der angegebenenDatenbank zu verknüpfen.

    Das Importieren des Tablespaces ermöglicht es dir, eine Tabelle zusammen mit ihren Daten- und Indexstrukturen wiederherzustellen oder zu migrieren. Er stellt die Verbindung zwischen der Tabellendefinition und der zugrundeliegenden Tablespace-Datei her, so dass die Tabelle innerhalb der MySQL-Datenbankinstanz vollständig zugänglich und betriebsbereit ist:

    [root@mysql80 mysql]# mysql
    Welcome to the MySQL monitor.  Commands end with ; or \g.
    mysql>
    
    mysql> ALTER TABLE adddb.authors IMPORT TABLESPACE;
    Query OK, 0 rows affected, 1 warning (0.05 sec)
    mysql>
  6. Nach dem Import des Tablespaces für die Tabelle authors überprüfe die Daten in der Tabelle:

    select count(id) from adddb.authors;mysql> select count(id) from
    adddb.authors;
    +-----------+
    | count(id) |
    +-----------+
    |      6000 |
    +-----------+
    1 row in set (0.03 sec)

Nachdem du die Tabelle im Rahmen des PITR-Prozesses importiert hast, musst du die binlog-Backups verwenden, um die restlichen Daten vom Zeitpunkt des ersten Backups bis zum aktuellen Zeitpunkt wiederherzustellen. Dazu befolgst du die hier beschriebenen Schritte:

  1. Kopiere das gewünschte binlog und erstelle den Index:

    sudo cp or scp mysql-bin.* /data/
    sudo chown mysql.mysql /data/mysql-bin.*
  2. Aktualisiere die Datei my.cnf:

    relay-log = mysql-bin
  3. Bereite den Index vor, indem du die kopierten binlogs verwendest:

    ls ./mysql-bin.0* >mysql-bin.index

    Mit IMPORT TABLESPACE hast du die Tabelle bereits aus dem bestehenden Backup importiert.

  4. Konfiguriere diese Tabelle als Dummy-Replikat:

    mysql> CHANGE REPLICATION SOURCE TO
    RELAY_LOG_FILE='mysql-bin.000001',RELAY_LOG_POS=4, SOURCE_HOST='dummy';
    Query OK, 0 rows affected (0.08 sec)
    
    mysql> CHANGE REPLICATION FILTER REPLICATE_DO_TABLE = (adddb.authors);
    Query OK, 0 rows affected (0.00 sec)
  5. Validiere die Ausgabe und starte den Replikations-Thread (nur der SQL-Thread wird benötigt):

    mysql> START REPLICA SQL_THREAD;
    Query OK, 0 rows affected (0.01 sec)

PITR ist ein wichtiger Prozess, der das Fachwissen eines DBAs erfordert. In MySQL ermöglicht es dir, deine Datenbank in kritischen Situationen wie versehentlicher Datenlöschung, Datenbeschädigung, menschlichen Fehlern und Disaster Recovery zu einem bestimmten Zeitpunkt wiederherzustellen. Die geschickte Implementierung von PITR stellt die Datenintegrität sicher und minimiert mögliche Datenverluste in diesen kritischen Szenarien.

Indem du die binäre Protokollierung aktivierst, ein vollständiges Backup erstellst, das Backup an einem neuen Ort wiederherstellst, den Zeitpunkt der Wiederherstellung bestimmst und die Datenbank zu diesem Zeitpunkt wiederherstellst, kannst du die Datenintegrität sicherstellen und dich vor Datenverlust schützen.

Verwaltung von binären Protokollen

MySQL bietet einen robusten und zuverlässigen Logging-Mechanismus zur Nachverfolgung von Änderungen an der Datenbank, das so genannte Binary Logging. In diesem Abschnitt gehen wir auf die Bedeutung von Binärprotokollen ein und geben einen umfassenden Leitfaden zu deren Verwaltung.

Binäre Logs sind eine Art von Logdatei, die von MySQL erstellt wird, um alle Änderungen an der Datenbank aufzuzeichnen. Zu diesen Änderungen gehören Datenänderungen, Schemaänderungen und administrative Vorgänge wie die Benutzerverwaltung. Binäre Logs werden in einem binären Format gespeichert, was sie plattformunabhängig macht und eine einfache Replikation von Änderungen über mehrere Server hinweg ermöglicht.

Binäre Logs sind eine wichtige Komponente der HA- und Disaster-Recovery-Mechanismen von MySQL. Sie werden verwendet, um die Datenbank im Falle eines Serverabsturzes, einer Datenbeschädigung oder eines Benutzerfehlers wiederherzustellen. Binärprotokolle werden auch für die Replikation benötigt, um Datenänderungen zwischen Quell- und Replikat-Servern zu synchronisieren.

Aktivieren der binären Protokollierung

In früheren Versionen von MySQL musste die Binärprotokollierung manuell durch Angabe der Option --log-bin aktiviert werden, da sie standardmäßig deaktiviert war. Ab MySQL 8 ist die binäre Protokollierung jedoch standardmäßig aktiviert, unabhängig davon, ob die Option --log-bin angegeben ist.

Die einzige Ausnahme ist die manuelle Initialisierung des Datenverzeichnisses mit mysqld und der Option --initialize oder --initialize-insecure, die das binäre Logging standardmäßig deaktiviert. Um die binäre Protokollierung in diesem Fall zu aktivieren, muss die Option --log-bin angegeben werden. Durch die Aktivierung der binären Protokollierung wird die Systemvariable log_bin auf ON gesetzt, was den Status der binären Protokollierung auf dem Server anzeigt.

Um das binäre Logging zu aktivieren, füge die folgende Zeile in die MySQL-Konfigurationsdatei(my.cnf oder my.ini) ein:

[mysqld]
log-bin=mysql-bin

Diese Konfiguration erstellt eine binäre Logdatei namensmysql-bin in dem in der MySQL-Konfigurationsdatei angegebenen Datenverzeichnis.

Konfigurieren der binären Protokollierung

MySQL bietet eine Reihe von Konfigurationsoptionen für die binäre Protokollierung. Diese Optionen können in der MySQL-Konfigurationsdatei oder dynamisch mit dem Befehl SET GLOBAL gesetzt werden. Einige der wichtigsten Konfigurationsoptionen für die binäre Protokollierung sind diefolgenden:

binlog_format

Legt das Format fest, das für das binäre Logging verwendet wird. MySQL unterstützt drei Formate: ROW, STATEMENT, undMIXED. Das Standardformat ist ROW.

expire_logs_days

Legt die Anzahl der Tage fest, nach denen die Binärprotokolle automatisch gelöscht werden sollen. Der Standardwert ist 0, was bedeutet, dass die Binärprotokolle nicht automatisch gelöscht werden.

max_binlog_size

Gibt die maximale Größe einer binären Logdatei an, bevor eine neue Datei erstellt wird. Der Standardwert ist 1.073.741.824 Bytes (1 GB).

binlog_row_image

Legt das Format fest, das für die binäre Protokollierung von zeilenbasierten Ereignissen verwendet wird. MySQL unterstützt drei Formate: FULL, MINIMAL und NOBLOB. Das Standardformat ist FULL.

Um zum Beispiel die Option binlog_format auf ROW zu setzen, fügen Sie die folgende Zeile in die MySQL-Konfigurationsdatei ein:

[mysqld]
binlog_format=ROW

Löschen von Binärprotokollen

Im Laufe der Zeit können binäre Logs eine beträchtliche Menge an Speicherplatz verbrauchen. Um dies zu verhindern, bietet MySQL die Möglichkeit, alte binäre Logs zu löschen. Du kannst binäre Logs auf zwei Arten löschen: manuell oder automatisch.

Um binäre Logs manuell zu löschen, verwende den Befehl PURGE BINARY LOGS, der alle binären Logs bis einschließlich der Dateimysql-bin.000003 löscht:

PURGE BINARY LOGS TO 'mysql-bin.000003';

Um binäre Logs automatisch zu löschen, setze die Option expire_logs_days in der MySQL-Konfigurationsdatei.

Hier entsprechen 604.800 Sekunden sieben Tagen (60 Sekunden/Minute × 60 Minuten/Stunde × 24 Stunden/Tag × 7 Tage). Bei dieser Konfiguration werden Binärprotokolle, die älter als sieben Tage sind, automatisch gelöscht:

[mysqld]
binlog_expire_logs_seconds=604800;

Hier ist ein Beispiel dafür, wie du mit dem Befehl PURGE BINARY LOGS alte binäre Logdateien in MySQL löschen kannst:

  1. Verwende den MySQL-Client, um dich mit dem MySQL-Server zu verbinden:

    mysql -u root -p
  2. Listet die derzeit verwendeten binären Logdateien auf:

    mysql> SHOW BINARY LOGS;
    +---------------+-----------+-----------+
    | Log_name      | File_size | Encrypted |
    +---------------+-----------+-----------+
    | binlog.000003 |       157 | No        |
    | binlog.000004 |       201 | No        |
    | binlog.000005 |       157 | No        |
    | binlog.000006 |       201 | No        |
    | binlog.000007 |      1357 | No        |
    | binlog.000008 |       201 | No        |
    | binlog.000009 |       157 | No        |
    | binlog.000010 |       905 | No        |
    | binlog.000011 |      1743 | No        |
    | binlog.000012 |   2097859 | No        |
    | binlog.000013 |       201 | No        |
    | binlog.000014 |      1402 | No        |
    +---------------+-----------+-----------+
    12 rows in set (0.01 sec)
    mysql>

    Dieser Befehl zeigt neben den aktuell verwendeten binären Logdateien auch deren Größe und Erstellungszeitpunkt an.

  3. Verwende den Befehl PURGE BINARY LOGS, um alte binäre Logdateien zu löschen. Um zum Beispiel alle binären Logdateien zu löschen, die älter als sieben Tage sind, verwendest du den folgenden Befehl:

    mysql>  PURGE BINARY LOGS BEFORE DATE_SUB(NOW(), INTERVAL 7 DAY);
    Query OK, 0 rows affected (0.02 sec)

    Du kannst das Intervall nach Bedarf anpassen, um Dateien zu löschen, die älter oder neuer als eine bestimmte Anzahl von Tagen sind.

  4. Überprüfe, ob die alten binären Logdateien gelöscht wurden, indem du den BefehlSHOW BINARY LOGS erneut ausführst:

    mysql> SHOW BINARY LOGS;
    +---------------+-----------+-----------+
    | Log_name      | File_size | Encrypted |
    +---------------+-----------+-----------+
    | binlog.000013 |       201 | No        |
    | binlog.000014 |      1402 | No        |
    +---------------+-----------+-----------+
    2 rows in set (0.00 sec)

    Jetzt siehst du die aktuell verwendeten binären Logdateien, mit Ausnahme der Dateien, die mit dem Befehl PURGE BINARY LOGSgelöscht wurden.

Mit dem Befehl PURGE BINARY LOGS kannst du deine binären Logdateien unter Kontrolle halten und verhindern, dass sie mit der Zeit zu viel Speicherplatz verbrauchen. Binäre Logdateien sind eine wichtige Komponente der HA- und Disaster-Recovery-Mechanismen von MySQL. Sie bieten eine zuverlässige Möglichkeit, Änderungen an der Datenbank zu verfolgen und ermöglichen eine einfache Replikation der Änderungen über mehrere Server hinweg. Wenn du die in diesem Abschnitt beschriebenen Richtlinien befolgst, kannst du sicherstellen, dass deine Binärprotokolle richtig konfiguriert undverwaltet werden.

Bewährte Methoden für Backup und Wiederherstellung

In der Welt der Datenbanken sind Sicherung und Wiederherstellung unerlässlich, um die Integrität der Daten zu gewährleisten. Ein einziger Datenbankausfall kann zum Verlust wichtiger Daten führen, was den Geschäftsbetrieb beeinträchtigen kann. Deshalb ist es wichtig, bewährte Methoden für die Sicherung und Wiederherstellung in MySQL zu implementieren.

Regelmäßige Backups sind wichtig, um sicherzustellen, dass deine Daten sicher und wiederherstellbar sind. Der Zeitplan für regelmäßige Sicherungen hängt von der Größe deiner Daten und der Änderungsrate der Daten ab. Als Faustregel gilt, dass du bei Datenbanken mit hohem Transaktionsvolumen täglich, bei Datenbanken mit geringerem Datenaustausch wöchentlich oder monatlich Sicherungen durchführen solltest. Hier sind einige weitere bewährte Methoden zur Datensicherung:

Erstelle eine Backup-Strategie

Lege eine Backup-Strategie fest, die deine Anforderungen an die Wiederherstellung erfüllt, z. B. die Häufigkeit der Backups, die Art der Backups (vollständig oder inkrementell) und die Aufbewahrungszeiträume.

Sichern von einem Replikat-Knoten

Es wird empfohlen, ein MySQL-Backup von einem Replikat-Knoten zu erstellen, da dies die Belastung des primären Knotens reduziert und eine konsistente Sicherung gewährleistet. Durch die Sicherung von einem Replikat-Knoten wird der primäre Knoten nicht mit zusätzlicher Arbeitslast belastet, die die Leistung des Live-Systems beeinträchtigen kann. Da der Replikat-Knoten mit dem Primärknoten synchronisiert ist, garantiert er außerdem die Konsistenz der Sicherung und verringert das Risiko von, dass Daten beschädigt werden oder verloren gehen. Insgesamt ist die Sicherung von einem Replikat-Knoten eine bewährte Methode für MySQL-DBAs, um die Verfügbarkeit und Integrität ihrer Daten sicherzustellen.

Die Bestätigung der Integrität der Daten im Replikat ist ebenfalls sehr wichtig und wird nicht unbedingt nur durch die laufende Replikation gewährleistet. Es ist die Aufgabe des DBAs sicherzustellen, dass es sich um eine exakte Kopie handelt, indem er Tools wie pt-table-checksum einsetzt.

Sichern Sie das MySQL-Binlog oder Binär-Log

Ein Binärlog ist eine Protokolldatei, die alle Änderungen an einer Datenbank aufzeichnet, einschließlich Einfügungen, Aktualisierungen und Löschungen. Die Sicherung des MySQL-Binlogs ist wichtig, da es dabei hilft, Daten von einem bestimmten Zeitpunkt aus wiederherzustellen, was in verschiedenen Szenarien nützlich sein kann, z. B. bei der Wiederherstellung im Katastrophenfall, bei der Replikation und bei der Rechnungsprüfung. Im Falle einer Katastrophe, z. B. eines Hardwareausfalls oder einer Datenbeschädigung, kann das Binlog verwendet werden, um die Datenbank zu einem bestimmten Zeitpunkt vor dem Eintreten der Katastrophe wiederherzustellen und so den Datenverlust zu minimieren. Außerdem ist die Sicherung des Binlogs wichtig für die Replikation, da es die Synchronisation der Replikat-Datenbanken mit der primären Datenbank ermöglicht. Schließlich kann das Binlog für Prüfungszwecke verwendet werden, indem es eine detaillierte Aufzeichnung aller Änderungen an der Datenbank liefert, was für die Einhaltung von Vorschriften und die Sicherheit nützlich sein kann. Insgesamt ist die Sicherung des MySQL-Binlogs eine wichtige Praxis, um die Verfügbarkeit, Integrität und Sicherheit der Daten zu gewährleisten.

MySQL Enterprise Backup verwenden

MySQL Enterprise Backup ist eine kommerzielle Backup-Lösung, die unternehmenstaugliche Sicherungs- und Wiederherstellungsfunktionen für MySQL-Datenbanken bietet. Sie bietet schnelle, zuverlässige und skalierbare Backups sowie Unterstützung für PITR und partielleBackups.

Percona XtraBackup verwenden

XtraBackup ist ein beliebtes Open-Source-Tool zum Sichern und Wiederherstellen von MySQL-Datenbanken. Einer der Hauptgründe für den Einsatz von XtraBackup ist, dass es Hot Backups von InnoDB- und XtraDB-Speicher-Engines durchführt, d.h. es kann Backups erstellen, ohne die Datenbank zu sperren oder Ausfallzeiten zu verursachen. XtraBackup bietet noch weitere nützliche Funktionen wie parallele Komprimierung und inkrementelle Backups, die die Backup-Leistung und -Effizienz weiter verbessern. Außerdem ist XtraBackup in hohem Maße anpassbar, so dass DBAs die Backups auf ihre speziellen Bedürfnisse zuschneiden können. Insgesamt ist XtraBackup ein zuverlässiges und flexibles Werkzeug, das den Sicherungs- und Wiederherstellungsprozess für MySQL-Datenbanken vereinfacht.

MySQL Shell dump utility

Der MySQL-Shell-Dump ist ein Kommandozeilen-Tool, das zur Sicherung und Wiederherstellung von MySQL-Datenbanken verwendet wird. Einer der Hauptvorteile des MySQL Shell dump ist, dass es eine umfassendere Sicherungslösung bietet als herkömmliche Sicherungsmethoden. Mit dem MySQL Shell dump ist es möglich, nicht nur das Datenbankschema und die Daten, sondern auch gespeicherte Routinen, Trigger und Benutzerkonten zu sichern. Der MySQL Shell dump unterstützt auch parallele Backups und ermöglicht so schnellere und effizientere Backups großer Datenbanken. Außerdem ist der MySQL Shell dump sehr anpassungsfähig und ermöglicht es DBAs, Backup-Optionen wie Komprimierung und selektive Backups festzulegen. Insgesamt ist MySQL Shell dump ein leistungsstarkes und flexibles Werkzeug, das den Sicherungs- und Wiederherstellungsprozess für MySQL-Datenbanken vereinfacht.

Verwende mysqldump für kleine Datenbanken

Für kleine Datenbanken ist mysqldump eine zuverlässige und kostengünstige Backup-Lösung. Sie kann MySQL-Datenbanken im SQL-Format sichern, so dass sie im Falle eines Datenverlusts leicht wiederhergestellt werden können.

Teste deine Backups

Es reicht nicht aus, Daten zu sichern, wenn du nicht überprüft hast, ob die Sicherungen wiederherstellbar sind. Deshalb ist es wichtig, deine Backups regelmäßig zu testen, um sicherzustellen, dass sie im Falle einer Katastrophe wiederhergestellt werden können. Du kannst deine Backups testen, indem du sie in einer Testumgebung wiederherstellst und die Daten auf Richtigkeit und Konsistenz überprüfst.

Speichere deine Backups offsite

Die Auslagerung von Backups ist wichtig für den Fall einer Katastrophe wie Feuer, Diebstahl oder Naturkatastrophen, die dein primäres Rechenzentrum betreffen könnten. Wenn du die Backups an einem anderen Ort aufbewahrst, ist sichergestellt, dass sie sicher und wiederherstellbar sind. Du kannst Backups in verschiedenen Cloud-Speicherlösungen wie Amazon Simple Storage Service (S3), Google Cloud Storage oder Microsoft Azure speichern oder physische Speichergeräte wie Bänder oder externe Festplatten verwenden.

Nutze die Speicherung in der Cloud

Cloud-Provider wie Amazon S3, Google Cloud Storage und Microsoft Azure bieten zuverlässige und sichere Möglichkeiten für die externe Speicherung deiner Backups. Wenn du S3 nutzt, kannst du die Amazon Web Services (AWS) CLI verwenden, um den Sicherungs- und Wiederherstellungsprozess zu automatisieren. Du kannst zum Beispiel den folgenden Befehl verwenden, um dein Backup in den S3 Bucket mit dem Namenmybucket/backups hochzuladen:

aws s3 cp /backup/full/backup-to-image s3://mybucket/backups/
Sichere Transportprotokolle verwenden

Verwende sichere Transportprotokolle wie SSL oder Secure Shell (SSH), um deine Backups vor unberechtigtem Zugriff zu schützen. Die AWS CLI verwendet SSL als Standard-Kommunikationsprotokoll, und für jede SSL-Verbindung werden SSL-Zertifikate von der AWS CLIüberprüft. Mit dem folgenden Befehl wird dein Backup-Image über SSL an S3 übertragen:

aws s3 cp /backup/full/backup-to-image s3://mybucket/backups/ --sse

Der Parameter --sse legt die serverseitige Verschlüsselung für ein Objekt in S3 fest und kann die Werte AES256 oder aws:kms annehmen. Wird kein Wert für den Parameter angegeben, wird die Standardverschlüsselung AES256 verwendet.

Verschlüsselung zum Schutz deiner Backups

Die Verschlüsselung von Backups sorgt dafür, dass sie sicher und vor unberechtigtem Zugriff geschützt sind. Du kannst verschiedene Verschlüsselungsmethoden verwenden, z. B. symmetrische oder asymmetrische Verschlüsselung, um deine Backups zu verschlüsseln. MySQL bietet Verschlüsselungsoptionen wie die Option --ssl* fürmysqldump oder die Option --encrypt für MySQL Enterprise Backup. Hier sind einige bewährte Methoden für die Verschlüsselung deiner Backups:

MySQL Enterprise Backup verwenden

MySQL Enterprise Backup bietet Verschlüsselungsfunktionen, mit denen du deine Backups mit AES-256 verschlüsseln kannst. Außerdem unterstützt es die Verwendung von Schlüsselverwaltungssystemen wie Oracle Key Vault.

Verschlüsselungstools von Drittanbietern verwenden

Du kannst Verschlüsselungstools von Drittanbietern wie GNU Privacy Guard (GnuPG) oder OpenSSL verwenden, um deine Backups zu verschlüsseln, bevor du sie außer Haus speicherst.

Verschlüsselungs-Plug-ins verwenden

MySQL Enterprise Backup bietet Verschlüsselungs-Plug-ins, mit denen du deine Backups verschlüsseln kannst. Du kannst zum Beispiel das AES-256 Verschlüsselungs-Plug-in verwenden, um deine Backups mit dem folgenden Befehl zu verschlüsseln:

mysqlbackup --backup-dir=/backup/full
--backup-image=/backup/full/backup-to-image \
--encrypt=AES256 --key-file=/path/to/keyfile --host=mydb.example.com \
--port=3306 --user=admin --password backup-to-image

Dieser Befehl verschlüsselt dein Backup-Image mit AES-256-Verschlüsselung und der Schlüsseldatei, die sich unter /path/to/key befindet.

XtraBackup Verschlüsselung

Da MySQL 8 und Percona Server 8.0 von Percona XtraBackup 2.4.x nicht unterstützt werden, musst du Percona XtraBackup 8.0.x für Backups und Wiederherstellungen verwenden. In diesem Abschnitt findest du die aktualisierten Schritte zur Installation von Percona XtraBackup 8.0.x.

Wie bereits erwähnt, musst du das Percona-Repository zur Liste der verfügbaren Repositories in deinem Paketmanager hinzufügen. Öffne ein Terminal oder eine Eingabeaufforderung und führe die Befehle in diesem Abschnitt aus.

Für Debian/Ubuntu lädst du die Debian-Paketdatei mit wget herunter:

root@MyUbuntuMysql8:~# wget https://repo.percona.com/apt/p
ercona-release_latest.generic_all.deb
--2024-02-20 14:57:01--  https://repo.percona.com/apt/
percona-release_latest.generic_all.deb
Resolving repo.percona.com (repo.percona.com)... 147.135.54.159,
Length: 11804 (12K) [application/x-debian-package]
Saving to: 'percona-release_latest.generic_all.deb'
percona-release_latest.generic_all.deb        100%
[============================================>]  11.53K  --.-KB/s    in 0s
2024-02-20 14:57:01 (196 MB/s) - 'percona-release_latest.generic_all.deb'
saved [11804/11804]
root@MyUbuntuMysql8:~#

Der Befehl sudo dpkg wird verwendet, um das Debian-Paket zu installieren:

root@MyUbuntuMysql8:~# sudo dpkg -i percona-release_latest.generic_all.deb
Selecting previously unselected package percona-release.
<*> All done!
* Enabling the Percona Release repository
<*> All done!
For example, to enable the Percona Server 8.0 repository use:
  percona-release setup ps80
Note: To avoid conflicts with older product versions, the percona-release
root@MyUbuntuMysql8:~#

Aktualisiere die Paketlisten für verfügbare Software-Repositories:

root@MyUbuntuMysql8:~# sudo apt-get update
Hit:1 http://us-east-1.ec2.archive.ubuntu.com/ubuntu jammy InRelease
Get:2 http://us-east-1.ec2.archive.ubuntu.com/ubuntu jammy-updates
InRelease [119 kB]
Hit:3 http://us-east-1.ec2.archive.ubuntu.com/ubuntu jammy-backports InRelease
Get:11 http://repo.percona.com/prel/apt jammy/main amd64 Packages [415 B]
Fetched 3088 kB in 2s (1713 kB/s)
Reading package lists... Done
root@MyUbuntuMysql8:~#

Um die Version 80 des Percona XtraBackup-Tools auf einem System zu installieren, führe den folgenden Befehl aus:

root@MyUbuntuMysql8:~# sudo apt-get install percona-xtrabackup-80
Reading package lists... Done
Building dependency tree... Done
Reading state information... Done
The following additional packages will be installed:
  libcurl4-openssl-dev libev4
Suggested packages:
  libcurl4-doc libidn11-dev libkrb5-dev libldap2-dev librtmp-dev libssh2-1-dev
  libssl-dev pkg-config zlib1g-dev
The following NEW packages will be installed:
  libcurl4-openssl-dev libev4 percona-xtrabackup-80
Processing triggers for libc-bin (2.35-0ubuntu3.6) ...
Scanning processes...
Running kernel seems to be up-to-date.
Restarting services...
Service restarts being deferred:
 systemctl restart systemd-logind.service
No containers need to be restarted.
No user sessions are running outdated binaries.
No VM guests are running outdated hypervisor (qemu) binaries on this host.
root@MyUbuntuMysql8:~#

Überprüfe die Version des installierten XtraBackup:

root@MyUbuntuMysql8:~# xtrabackup --version
2024-02-20T15:02:37.633932-00:00 0 [Note] [MY-011825] [Xtrabackup] recognized
server arguments: --innodb_directories=/var/lib/user_defined_general_tablespace
xtrabackup version 8.0.35-30 based on MySQL server 8.0.35 Linux (x86_64)
(revision id: 6beb4b49)
root@MyUbuntuMysql8:~#

Um ein verschlüsseltes Backup mit Percona XtraBackup zu erstellen, kannst du die folgenden Schritte ausführen:

  1. Bestimme den Verschlüsselungsalgorithmus. Percona XtraBackup unterstützt drei Verschlüsselungsalgorithmen: AES-128, AES-192 und AES-256. Wähle den Algorithmus, den du für die Verschlüsselung verwenden möchtest.

  2. Erstelle einen Verschlüsselungscode. Du hast zwei Optionen, um den Verschlüsselungscode beim Erstellen von verschlüsselten Backups anzugeben: xtrabackup --encrypt-key und xtrabackup --encrypt-key-file . Hier ist ein Beispielbefehl, um einen Verschlüsselungsschlüssel zu erzeugen:

    root@MyUbuntuMysql8:~#  openssl rand -base64 24
    P/Fu9cZo9gzkzpmtvUKFku3u4ONTrj5Z
    root@MyUbuntuMysql8:~#

    Hier ist ein Beispiel für den XtraBackup-Befehl, der die Option xtrabackup --encrypt-key verwendet:

    root@MyUbuntuMysql8:~# mkdir /root/backups/
    root@MyUbuntuMysql8:~# xtrabackup --backup --target-dir=/root/backups/
    --encrypt=AES256 --encrypt-key=""P/Fu9cZo9gzkzpmtvUKFku3u4ONTrj5Z""
    2024-02-20T15:04:59.723781-00:00 0 [Note] [MY-011825] [Xtrabackup]
    recognized server arguments: --innodb_directories=/var/lib/
    user_defined_general_tablespace
    2024-02-20T15:04:59.724228-00:00 0 [Note] [MY-011825] [Xtrabackup]
    recognized client arguments: --ssl-mode=REQUIRED --ssl-cert=/var/lib/mysql/
    client-cert.pem --ssl-key=/var/lib/mysql/client-key.pem --backup=1
    --target-dir=/root/backups/ --encrypt=AES256 --encrypt-key=*
    xtrabackup version 8.0.35-30 based on MySQL server 8.0.35 Linux (x86_64)
    (revision id: 6beb4b49)
    240220 15:04:59  version_check Connecting to MySQL server with DSN
    'dbi:mysql:; mysql_read_default_group=xtrabackup' (using password: NO).
    240220 15:05:00  version_check Connected to MySQL server
    240220 15:05:00  version_check Executing a version check against
    the server...
  3. Überprüfe nach Abschluss des Backups das Protokoll, um den erfolgreichen Abschluss zu bestätigen. Du solltest ein ähnliches Protokoll wie dieses erhalten:

    2024-02-20T15:05:03.706837-00:00 0 [Note] [MY-011825] [Xtrabackup]
    Encrypting /root/backups/xtrabackup_info.xbcrypt
    2024-02-20T15:05:03.707047-00:00 0 [Note] [MY-011825] [Xtrabackup]
    Done: Encrypting file /root/backups/xtrabackup_info.xbcrypt
    2024-02-20T15:05:04.717140-00:00 0 [Note] [MY-011825] [Xtrabackup]
    Transaction log of lsn (42914523) to (42914533) was copied.
    2024-02-20T15:05:04.826343-00:00 0 [Note] [MY-010733] [Server]
    Shutting down plugin 'keyring_file'
    2024-02-20T15:05:04.828326-00:00 0 [Note] [MY-010733] [Server]
    Shutting down plugin 'daemon_keyring_proxy_plugin'
    2024-02-20T15:05:04.831369-00:00 0 [Note] [MY-011825] [Xtrabackup]
    completed OK!
    root@MyUbuntuMysql8:~#

Im Backup-Verzeichnis liegen alle Dateien im .xbcrypt-Format vor und stellen verschlüsselte Versionen der MySQL-Datenbankdateien dar:

root@MyUbuntuMysql8:~# ls -ltr /root/backups/
total 76232
-rw-r----- 1 root root 12600576 Feb 20 15:05 ibdata1.xbcrypt
drwxr-x--- 2 root root     4096 Feb 20 15:05 sys
drwxr-x--- 2 root root     4096 Feb 20 15:05 mydatabase
drwxr-x--- 2 root root     4096 Feb 20 15:05 mytestschema
drwxr-x--- 2 root root     4096 Feb 20 15:05 unencryptedschema
-rw-r----- 1 root root   114872 Feb 20 15:05
  user_defined_general_tablespace.ibd.xbcrypt
-rw-r----- 1 root root   114872 Feb 20 15:05
  user_defined_general_tablespace_1.ibd.xbcrypt
drwxr-x--- 2 root root     4096 Feb 20 15:05 encryptedschema
drwxr-x--- 2 root root     4096 Feb 20 15:05 mytest
drwxr-x--- 2 root root     4096 Feb 20 15:05 mytestdb
drwxr-x--- 2 root root     4096 Feb 20 15:05 adddb
-rw-r----- 1 root root 31501440 Feb 20 15:05 mysql.ibd.xbcrypt
-rw-r----- 1 root root 16800768 Feb 20 15:05 undo_002.xbcrypt
-rw-r----- 1 root root 16800768 Feb 20 15:05 undo_001.xbcrypt
drwxr-x--- 2 root root    12288 Feb 20 15:05 performance_schema
drwxr-x--- 2 root root     4096 Feb 20 15:05 test
drwxr-x--- 2 root root     4096 Feb 20 15:05 mytestdb_inno
drwxr-x--- 2 root root     4096 Feb 20 15:05 mysql
drwxr-x--- 2 root root     4096 Feb 20 15:05 d1
-rw-r----- 1 root root      249 Feb 20 15:05 binlog.000076.xbcrypt
-rw-r----- 1 root root      108 Feb 20 15:05 binlog.index.xbcrypt
-rw-r----- 1 root root      110 Feb 20 15:05 xtrabackup_binlog_info.xbcrypt
-rw-r----- 1 root root     2744 Feb 20 15:05 xtrabackup_logfile.xbcrypt
-rw-r----- 1 root root      134 Feb 20 15:05 xtrabackup_checkpoints
-rw-r----- 1 root root     4600 Feb 20 15:05 ib_buffer_pool.xbcrypt
-rw-r----- 1 root root      567 Feb 20 15:05 backup-my.cnf.xbcrypt
-rw-r----- 1 root root      597 Feb 20 15:05 xtrabackup_info.xbcrypt
-rw-r----- 1 root root      131 Feb 20 15:05 xtrabackup_tablespaces.xbcrypt
root@MyUbuntuMysql8:~#

Verschlüsselte Backups entschlüsseln

Die Option --decrypt in Percona XtraBackup ermöglicht die Entschlüsselung von Backups:

root@MyUbuntuMysql8:~/backups/mysql# xtrabackup --decrypt=AES256
--encrypt-key="P/Fu9cZo9gzkzpmtvUKFku3u4ONTrj5Z" --target-dir=/root/backups/
--remove-original
2024-02-20T15:12:08.321590-00:00 0 [Note] [MY-011825] [Xtrabackup] recognized
server arguments: --innodb_directories=/var/lib/user_defined_general_tablespace
2024-02-20T15:12:08.322065-00:00 0 [Note] [MY-011825] [Xtrabackup] recognized
client arguments: --ssl-mode=REQUIRED --ssl-cert=/var/lib/mysql/client-cert.pem
--ssl-key=/var/lib/mysql/client-key.pem --decrypt=AES256 --encrypt-key=*
--target-dir=/root/backups/ --remove-original=1
xtrabackup version 8.0.35-30 based on MySQL server 8.0.35 Linux (x86_64)
(revision id: 6beb4b49)
2024-02-20T15:12:08.354574-00:00 0 [Note] [MY-011825] [Xtrabackup] decrypting ./
performance_schema/replication_conn_162.sdi.xbcrypt

Überprüfe nach dem Entschlüsselungsprozess das Protokoll, um sicherzustellen, dass er erfolgreich abgeschlossen wurde. Du solltest ein Protokoll sehen, das diesem ähnelt:

2024-02-20T15:12:09.727703-00:00 0 [Note] [MY-011825] [Xtrabackup] decrypting
./xtrabackup_binlog_info.xbcrypt
2024-02-20T15:12:09.731566-00:00 0 [Note] [MY-011825] [Xtrabackup] removing
./xtrabackup_binlog_info.xbcrypt
2024-02-20T15:12:09.733903-00:00 0 [Note] [MY-011825] [Xtrabackup] completed OK!
root@MyUbuntuMysql8:~/backups/mysql#

Verwende eine sichere Schlüsselverwaltungslösung, um deine Verschlüsselungsschlüssel zu speichern und zu verwalten. Du kannst zum Beispiel den AWS Key Management Service (KMS) verwenden, um deine Verschlüsselungsschlüssel zu erzeugen und zu verwalten.

Vorbereiten der entschlüsselten Backups

Der Befehl xtrabackup --prepare wird verwendet, um die Sicherungsdateien im angegebenen Verzeichnis vorzubereiten:

root@MyUbuntuMysql8:~# xtrabackup --prepare --target-dir=/root/backups/
2024-02-20T15:15:10.126368-00:00 0 [Note] [MY-011825] [Xtrabackup] recognized
server arguments: --innodb_checksum_algorithm=crc32 --innodb_log_checksums=1
--innodb_data_file_path=ibdata1:12M:autoextend --innodb_log_file_size=50331648
--innodb_page_size=16384 --innodb_undo_directory=./ --innodb_undo_tablespaces=2
--server-id=0 --innodb_log_checksums=ON --innodb_redo_log_encrypt=0
--innodb_undo_log_encrypt=0
2024-02-20T15:15:10.126706-00:00 0 [Note] [MY-011825] [Xtrabackup] recognized
client arguments: --prepare=1 --target-dir=/root/backups/
xtrabackup version 8.0.35-30 based on MySQL server 8.0.35 Linux (x86_64)
(revision id: 6beb4b49)
2024-02-20T15:15:10.127029-00:00 0 [Note] [MY-011825] [Xtrabackup] cd to
/root/backups/
2024-02-20T15:15:10.127237-00:00 0 [Note] [MY-011825] [Xtrabackup]
This target seems to be not prepared yet.

Überprüfe nach Abschluss des Vorbereitungsprozesses das Protokoll, um die erfolgreiche Ausführung zu bestätigen:

2024-02-20T15:15:12.162295-00:00 0 [Note] [MY-012980] [InnoDB]
Shutdown completed; log sequence number 42914838
2024-02-20T15:15:12.166062-00:00 0 [Note] [MY-010733] [Server]
Shutting down plugin 'keyring_file'
2024-02-20T15:15:12.166261-00:00 0 [Note] [MY-010733] [Server]
Shutting down plugin 'daemon_keyring_proxy_plugin'
2024-02-20T15:15:12.166814-00:00 0 [Note] [MY-011825] [Xtrabackup] completed OK!
root@MyUbuntuMysql8:~#

mysqldump Verschlüsselung

mysqldump Verschlüsselung sichert Datenbanksicherungen, indem sie die Daten in einen unlesbaren Chiffretext umwandelt und so den unbefugten Zugriff verhindert. Ein Entschlüsselungsschlüssel wird benötigt, um den verschlüsselten Text wieder in seine ursprüngliche, lesbare Form zu bringen.

Mit dem Befehl mysqldump kannst du ein Backup einer MySQL-Datenbank namens mytestdb erstellen und in einer Datei namens backup.sql speichern:

root@MyUbuntuMysql8:~/backups# mysqldump -u root -p mytestdb > backup.sql
Enter password:
root@MyUbuntuMysql8:~/backups# ls -ltr
total 8
-rw-r--r-- 1 root root 5714 Feb 20 15:22 backup.sql
root@MyUbuntuMysql8:~/backups#

Nachdem du das Backup erstellt hast, verschlüsselst du mit dem Befehl openssl eine Datei namens backup.sql mit dem Verschlüsselungsalgorithmus AES-256-CBC:

root@MyUbuntuMysql8:~/backups# openssl aes-256-cbc -salt -in backup.sql -out
backup.sql.enc
enter AES-256-CBC encryption password:
Verifying - enter AES-256-CBC encryption password:
root@MyUbuntuMysql8:~/backups#

Dieser Code erstellt eine Sicherungskopie der Datenbank mydatabase mit dem Befehlmysqldump und verschlüsselt sie mit OpenSSL mit dem AES-256-CBC-Algorithmus.

Um das Backup zu entschlüsseln, kannst du den folgenden Befehl verwenden:

root@MyUbuntuMysql8:~/backups# openssl aes-256-cbc -d -in backup.sql.enc -out
backup.sql
enter AES-256-CBC decryption password:
root@MyUbuntuMysql8:~/backups#

Dieser Code entschlüsselt die Sicherungsdatei backup.sql.enc mit dem AES-256-CBC-Algorithmus und gibt die entschlüsselte Datei in backup.sql aus.

Fazit

Sicherung und Wiederherstellung sind in jeder MySQL-Umgebung von entscheidender Bedeutung. Wenn du die Richtlinien in diesem Kapitel befolgst, kannst du sicherstellen, dass deine Daten geschützt sind und im Falle einer Katastrophe leicht wiederhergestellt werden können.

Get Hands-On MySQL-Verwaltung now with the O’Reilly learning platform.

O’Reilly members experience books, live events, courses curated by job role, and more from O’Reilly and nearly 200 top publishers.