Die Migration von einer Oracle-Datenbank zu Open Source kann eine Reihe von Vorteilen bringen. Die niedrigeren Betriebskosten sind verlockend und zwingen viele Unternehmen zur Migration. Gleichzeitig müssen DevOps, SysOps oder DBAs strenge SLAs einhalten, um Geschäftsanforderungen zu erfüllen.
Eines der wichtigsten Anliegen bei der Planung der Datenmigration zu einer anderen Datenbank, insbesondere zu Open Source, ist die Vermeidung von Datenverlusten. Es ist nicht allzu weit hergeholt, dass jemand versehentlich einen Teil der Datenbank gelöscht, jemand vergessen hat, eine WHERE-Klausel in eine DELETE-Abfrage aufzunehmen oder versehentlich DROP TABLE auszuführen. Die Frage ist, wie man sich von solchen Situationen erholt.
Solche Dinge können und werden passieren, es ist unvermeidlich, aber die Auswirkungen können katastrophal sein. Wie jemand sagte:„Es ist alles Spaß und Spiel, bis das Backup fehlschlägt“. Das wertvollste Gut darf nicht kompromittiert werden. Punkt.
Die Angst vor dem Unbekannten ist natürlich, wenn Sie mit neuen Technologien nicht vertraut sind. Tatsächlich können das Wissen über Oracle-Datenbanklösungen, die Zuverlässigkeit und die großartigen Funktionen, die Oracle Recovery Manager (RMAN) bietet, Sie oder Ihr Team davon abhalten, auf ein neues Datenbanksystem zu migrieren. Wir verwenden gerne Dinge, die wir kennen, also warum migrieren, wenn unsere aktuelle Lösung funktioniert? Wer weiß, wie viele Projekte auf Eis gelegt wurden, weil das Team oder der Einzelne nicht von der neuen Technologie überzeugt war?
Logische Sicherungen (exp/imp, expdp/impdb)
Laut MySQL-Dokumentation ist ein logisches Backup „ein Backup, das die Tabellenstruktur und Daten reproduziert, ohne die eigentlichen Datendateien zu kopieren“. Diese Definition kann sowohl auf die MySQL- als auch auf die Oracle-Welt zutreffen. Dasselbe gilt für „warum“ und „wann“ Sie das logische Backup verwenden werden.
Logische Sicherungen sind eine gute Option, wenn wir wissen, welche Daten geändert werden, sodass Sie nur den Teil sichern können, den Sie benötigen. Es vereinfacht die potenzielle Wiederherstellung in Bezug auf Zeit und Komplexität. Es ist auch sehr nützlich, wenn wir einen Teil eines kleinen/mittleren Datensatzes verschieben und auf ein anderes System zurückkopieren müssen (häufig auf einer anderen Datenbankversion). Oracle verwendet Export-Dienstprogramme wie exp und expdp, um Datenbankdaten zu lesen und sie dann auf Betriebssystemebene in eine Datei zu exportieren. Anschließend können Sie die Daten mit den Importdienstprogrammen imp oder impdp wieder in eine Datenbank importieren.
Die Oracle Export Utilities bieten uns viele Optionen, um auszuwählen, welche Daten exportiert werden müssen. Sie werden definitiv nicht die gleiche Anzahl an Features mit mysql finden, aber die meisten Bedürfnisse werden abgedeckt und der Rest kann mit zusätzlichem Scripting oder externen Tools erledigt werden (siehe mydumper).
MySQL wird mit einem Paket von Tools geliefert, die sehr grundlegende Funktionen bieten. Dies sind mysqldump, mysqlpump (die moderne Version von mysqldump mit nativer Unterstützung für Parallelisierung) und der MySQL-Client, der zum Extrahieren von Daten in eine Flatfile verwendet werden kann.
Nachfolgend finden Sie einige Beispiele für deren Verwendung:
Nur Datenbankstruktur sichern
mysqldump --no-data -h localhost -u root -ppassword mydatabase > mydatabase_backup.sql
Sicherungstabellenstruktur
mysqldump --no-data --single- transaction -h localhost -u root -ppassword mydatabase table1 table2 > mydatabase_backup.sql
Bestimmte Zeilen sichern
mysqldump -h localhost --single- transaction -u root -ppassword mydatabase table_name --where="date_created='2019-05-07'" > table_with_specific_rows_dump.sql
Importieren der Tabelle
mysql -u username -p -D dbname < tableName.sql
Der obige Befehl stoppt den Ladevorgang, wenn ein Fehler auftritt.
Wenn Sie Daten direkt vom MySQL-Client laden, werden die Fehler ignoriert und der Client fährt fort
mysql> source tableName.sql
Um die Ausgabe zu protokollieren, müssen Sie
verwendenmysql> tee import_tableName.log
Unter den folgenden Links finden Sie alle Flaggen erklärt:
- https://dev.mysql.com/doc/refman/8.0/en/mysqldump.html
- https://dev.mysql.com/doc/refman/8.0/en/mysqlimport.html
- https://dev.mysql.com/doc/refman/8.0/en/mysql.html
Wenn Sie die logische Sicherung über verschiedene Datenbankversionen hinweg verwenden möchten, stellen Sie sicher, dass Sie die richtige Sortierung eingerichtet haben. Die folgende Anweisung kann verwendet werden, um den Standardzeichensatz und die Sortierung für eine bestimmte Datenbank zu überprüfen:
USE mydatabase;
SELECT @@character_set_database, @@collation_database;
Eine andere Möglichkeit, die Systemvariable collation_database abzurufen, ist die Verwendung von SHOW VARIABLES.
SHOW VARIABLES LIKE 'collation%';
Aufgrund der Einschränkungen des mysql-Dumps müssen wir die Ausgabe oft ändern. Ein Beispiel für eine solche Modifikation kann die Notwendigkeit sein, einige Zeilen zu entfernen. Glücklicherweise haben wir die Flexibilität, die Ausgabe vor der Wiederherstellung mit Standard-Textwerkzeugen anzuzeigen und zu ändern. Tools wie awk, grep, sed können Ihr Freund werden. Unten ist ein einfaches Beispiel, wie man die dritte Zeile aus der Dump-Datei entfernt.
sed -i '1,3d' file.txt
Die Möglichkeiten sind endlos. Dies ist etwas, das wir bei Oracle nicht finden werden, da Daten im Binärformat geschrieben werden.
Es gibt ein paar Dinge, die Sie beachten müssen, wenn Sie logisches MySQL ausführen. Eine der Haupteinschränkungen ist die reine Unterstützung der Parallelität und der Objektsperre.
Überlegungen zur logischen Sicherung
Wenn eine solche Sicherung ausgeführt wird, werden die folgenden Schritte ausgeführt.
- LOCK TABLE-Tabelle.
- ZEIGE CREATE TABLE-Tabelle.
- SELECT * FROM table INTO OUTFILE temporäre Datei.
- Schreiben Sie den Inhalt der temporären Datei an das Ende der Dump-Datei.
- TABELLEN ENTSPERREN
Standardmäßig enthält mysqldump keine Routinen und Ereignisse in seiner Ausgabe – Sie müssen die Flags --routines und --events explizit setzen.
Ein weiterer wichtiger Aspekt ist eine Engine, die Sie zum Speichern Ihrer Daten verwenden. Hoffentlich verwenden heutzutage die meisten Produktionssysteme eine ACID-konforme Engine namens InnoDB. Die ältere Engine MyISAM musste alle Tabellen sperren, um Konsistenz zu gewährleisten. An diesem Punkt wurde FLUSH TABLES WITH READ LOCK ausgeführt. Leider ist dies die einzige Möglichkeit, einen konsistenten Snapshot der MyISAM-Tabellen zu gewährleisten, während der MySQL-Server läuft. Dadurch wird der MySQL-Server schreibgeschützt, bis UNLOCK TABLES ausgeführt wird.
Für Tabellen auf der InnoDB-Speicher-Engine wird empfohlen, die Option --single-transaction zu verwenden. MySQL erzeugt dann einen Checkpoint, der es dem Dump erlaubt, alle Daten vor dem Checkpoint zu erfassen, während eingehende Änderungen empfangen werden.
Die Option --single-transaction von mysqldump führt kein FLUSH TABLES WITH READ LOCK aus. Es bewirkt, dass mysqldump eine REPEATABLE READ-Transaktion für alle zu sichernden Tabellen einrichtet.
Ein mysqldump-Backup ist viel langsamer als die Oracle-Tools exp, expdp. Mysqldump ist ein Single-Thread-Tool und das ist sein größter Nachteil – die Leistung ist für kleine Datenbanken in Ordnung, wird aber schnell inakzeptabel, wenn der Datensatz auf mehrere zehn Gigabyte anwächst.
- STARTEN SIE TRANSAKTION MIT KONSISTENTEM SNAPSHOT.
- Für jedes Datenbankschema und jede Tabelle führt ein Dump die folgenden Schritte aus:
- ZEIGE CREATE TABLE-Tabelle.
- SELECT * FROM table INTO OUTFILE temporäre Datei.
- Schreiben Sie den Inhalt der temporären Datei an das Ende der Dump-Datei.
- VERPFLICHTEN.
Physische Backups (RMAN)
Glücklicherweise können die meisten Einschränkungen des logischen Backups mit dem Percona Xtrabackup-Tool gelöst werden. Percona XtraBackup ist die beliebteste Open-Source-Hot-Backup-Software für MySQL/MariaDB, die nicht blockierende Backups für InnoDB- und XtraDB-Datenbanken durchführt. Es fällt in die Kategorie der physischen Backups, die aus exakten Kopien des MySQL-Datenverzeichnisses und darunter befindlicher Dateien besteht.
Es ist die gleiche Kategorie von Tools wie Oracle RMAN. RMAN ist Bestandteil der Datenbanksoftware, XtraBackup muss separat heruntergeladen werden. Xtrabackup ist als RPM- und Deb-Paket verfügbar und unterstützt nur Linux-Plattformen. Die Installation ist sehr einfach:
$ wget https://www.percona.com/downloads/XtraBackup/Percona-XtraBackup-8.0.4/binary/redhat/7/x86_64/percona-XtraBackup-80-8.0.4-1.el7.x86_64.rpm
$ yum localinstall percona-XtraBackup-80-8.0.4-1.el7.x86_64.rpm
XtraBackup sperrt Ihre Datenbank während des Sicherungsvorgangs nicht. Bei großen Datenbanken (100+ GB) bietet es im Vergleich zu mysqldump eine viel bessere Wiederherstellungszeit. Der Wiederherstellungsprozess umfasst das Vorbereiten von MySQL-Daten aus den Sicherungsdateien, bevor sie durch das aktuelle Datenverzeichnis auf dem Zielknoten ersetzt oder ausgetauscht werden.
Percona XtraBackup funktioniert, indem es sich beim Start die Protokollsequenznummer (LSN) merkt und die Datendateien dann an einen anderen Ort kopiert. Das Kopieren von Daten dauert einige Zeit, und wenn sich die Dateien ändern, spiegeln sie den Zustand der Datenbank zu unterschiedlichen Zeitpunkten wider. Gleichzeitig führt XtraBackup einen Hintergrundprozess aus, der die Transaktionsprotokolldateien (auch Redo-Log-Dateien genannt) im Auge behält und Änderungen daraus kopiert. Dies muss kontinuierlich erfolgen, da die Transaktionsprotokolle im Round-Robin-Verfahren geschrieben werden und nach einer Weile wiederverwendet werden können. XtraBackup benötigt die Transaktionsprotokollaufzeichnungen für jede Änderung an den Datendateien seit Beginn der Ausführung.
Wenn XtraBackup installiert ist, können Sie endlich Ihre ersten physischen Backups durchführen.
xtrabackup --user=root --password=PASSWORD --backup --target-dir=/u01/backups/
Eine weitere nützliche Option, die MySQL-Administratoren verwenden, ist das Streamen von Backups auf einen anderen Server. Ein solcher Stream kann mit dem xbstream-Tool durchgeführt werden, wie im folgenden Beispiel:
Starten Sie einen Listener auf dem externen Server auf dem bevorzugten Port (in diesem Beispiel 1984)
nc -l 1984 | pigz -cd - | pv | xbstream -x -C /u01/backups
Backup ausführen und auf einen externen Host übertragen
innobackupex --user=root --password=PASSWORD --stream=xbstream /var/tmp | pigz | pv | nc external_host.com 1984
Wie Sie vielleicht bemerken, ist der Wiederherstellungsprozess in zwei Hauptschritte unterteilt (ähnlich wie bei Oracle). Die Schritte sind wiederhergestellt (zurück kopieren) und Wiederherstellung (Protokoll anwenden).
XtraBackup --copy-back --target-dir=/var/lib/data
innobackupex --apply-log --use-memory=[values in MB or GB] /var/lib/data
Der Unterschied besteht darin, dass wir die Wiederherstellung nur bis zu dem Zeitpunkt durchführen können, an dem die Sicherung erstellt wurde. Um Änderungen nach der Sicherung anzuwenden, müssen wir dies manuell tun.
Point-in-Time-Wiederherstellung (RMAN-Wiederherstellung)
In Oracle führt RMAN alle Schritte aus, wenn wir die Wiederherstellung der Datenbank durchführen. Dies kann entweder nach SCN oder Zeit oder basierend auf dem Sicherungsdatensatz erfolgen.
RMAN> run
{
allocate channel dev1 type disk;
set until time "to_date('2019-05-07:00:00:00', 'yyyy-mm-dd:hh24:mi:ss')";
restore database;
recover database; }
In mysql benötigen wir ein weiteres Tool zum Extrahieren von Daten aus Binärprotokollen (ähnlich den Archivprotokollen von Oracle):mysqlbinlog. mysqlbinlog kann die Binärlogs lesen und in Dateien umwandeln. Was wir tun müssen, ist
Das grundlegende Verfahren wäre
- Vollständige Sicherung wiederherstellen
- Inkrementelle Backups wiederherstellen
- Um die Start- und Endzeiten für die Wiederherstellung zu identifizieren (das könnte das Ende der Sicherung und die Positionsnummer vor dem leider gelöschten Tisch sein).
- Konvertieren Sie die erforderlichen Binglogs in SQL und wenden Sie neu erstellte SQL-Dateien in der richtigen Reihenfolge an - stellen Sie sicher, dass Sie einen einzigen mysqlbinlog-Befehl ausführen.
> mysqlbinlog binlog.000001 binlog.000002 | mysql -u root -p
Backups verschlüsseln (Oracle Wallet)
Percona XtraBackup kann verwendet werden, um lokale oder Streaming-Backups mit der xbstream-Option zu verschlüsseln oder zu entschlüsseln, um den Backups eine weitere Schutzebene hinzuzufügen. Sowohl die Option --encrypt-key als auch die Option --encryptkey-file können verwendet werden, um den Verschlüsselungsschlüssel anzugeben. Verschlüsselungsschlüssel können mit Befehlen wie
generiert werden$ openssl rand -base64 24
$ bWuYY6FxIPp3Vg5EDWAxoXlmEFqxUqz1
Dieser Wert kann dann als Verschlüsselungsschlüssel verwendet werden. Beispiel für den innobackupex-Befehl mit dem --encrypt-key:
$ innobackupex --encrypt=AES256 --encrypt-key=”bWuYY6FxIPp3Vg5EDWAxoXlmEFqxUqz1” /storage/backups/encrypted
Verwenden Sie zum Entschlüsseln einfach die Option --decrypt mit dem entsprechenden --encrypt-key:
$ innobackupex --decrypt=AES256 --encrypt-key=”bWuYY6FxIPp3Vg5EDWAxoXlmEFqxUqz1”
/storage/backups/encrypted/2019-05-08_11-10-09/
Sicherungsrichtlinien
Weder in MySQL/MariaDB noch in Perconas Tool gibt es eine eingebaute Backup-Policy-Funktionalität. Wenn Sie Ihre logischen oder physischen MySQL-Backups verwalten möchten, können Sie dafür ClusterControl verwenden.
ClusterControl ist das allumfassende Open-Source-Datenbankverwaltungssystem für Benutzer mit gemischten Umgebungen. Es bietet erweiterte Sicherungsverwaltungsfunktionen für MySQL oder MariaDB.
Mit ClusterControl können Sie:
- Sicherungsrichtlinien erstellen
- Überwachen Sie Backup-Status, Ausführungen und Server ohne Backups
- Führen Sie Backups und Wiederherstellungen durch (einschließlich einer Point-in-Time-Wiederherstellung)
- Aufbewahrung von Backups steuern
- Speichern Sie Backups im Cloud-Speicher
- Sicherungen validieren (vollständiger Test mit der Wiederherstellung auf dem Standalone-Server)
- Backups verschlüsseln
- Backups komprimieren
- Und viele andere
Speichern Sie Backups in der Cloud
Unternehmen haben in der Vergangenheit Tape-Backup-Lösungen eingesetzt, um
Daten vor Ausfällen zu schützen. Das Aufkommen von Public Cloud Computing hat jedoch auch neue Modelle mit geringeren Gesamtbetriebskosten als bisher möglich gemacht. Es macht keinen geschäftlichen Sinn, die Kosten einer DR-Lösung von deren Design zu trennen, daher müssen Organisationen das richtige Schutzniveau zu möglichst geringen Kosten implementieren.
Die Cloud hat die Datensicherungsbranche verändert. Aufgrund des erschwinglichen Preises haben kleinere Unternehmen eine Offsite-Lösung, die alle ihre Daten sichert (und ja, stellen Sie sicher, dass sie verschlüsselt sind). Sowohl Oracle als auch MySQL bieten keine integrierten Cloud-Speicherlösungen an. Stattdessen können Sie die von Cloud-Anbietern bereitgestellten Tools verwenden. Ein Beispiel hierfür könnte s3 sein.
aws s3 cp severalnines.sql s3://severalnine-sbucket/mysql_backups
Schlussfolgerung
Es gibt eine Reihe von Möglichkeiten, Ihre Datenbank zu sichern, aber es ist wichtig, die geschäftlichen Anforderungen zu prüfen, bevor Sie sich für eine Sicherungsstrategie entscheiden. Wie Sie sehen können, gibt es viele Ähnlichkeiten zwischen MySQL- und Oracle-Backups, die Ihnen hoffentlich Ihre SLAs erfüllen können.
Stellen Sie immer sicher, dass Sie diese Befehle üben. Nicht nur, wenn Sie neu in der Technologie sind, sondern auch, wenn DBMS unbrauchbar wird, damit Sie wissen, was zu tun ist.
Wenn Sie mehr über MySQL erfahren möchten, lesen Sie bitte unser Whitepaper The DevOps Guide to Database Backups for MySQL and MariaDB.