Mysqldump ist ein beliebtes logisches Backup-Tool für MySQL, das ursprünglich von Igor Romanenko geschrieben wurde.
Mysqldump führt logische Sicherungen durch (Satz von SQL-Anweisungen). Standardmäßig gibt mysqldump keine information_schema-Tabellen aus und nimmt niemals performance_schema. Aber der Hauptnachteil von mysqldump ist, dass es beim Sichern und Wiederherstellen nur einen Thread verwendet. (Auch Ihr Server hat 64 Kerne). Um diesen Nachteil zu überwinden, hat MySQL neue Dienstprogramme auf dem Shell-Client eingeführt. In diesem Blog werde ich diese neuen Sicherungsprogramme erläutern.
Überblick über die MySQL-Shell
Die MySQL-Shell ist ein leistungsstarker und fortschrittlicher Client und Code-Editor für MySQL-Server. MySQL Shell 8.0.21 enthält einige aufregende neue Dienstprogramme zum Erstellen eines logischen Speicherauszugs und zum Durchführen einer logischen Wiederherstellung für die gesamte Datenbankinstanz, einschließlich der Benutzer.
MySQL-Shell 8.0.22 enthielt eine logische Sicherung bestimmter Tabellen und eine Wiederherstellung.
Dienstprogramme
- util.dumpInstance() – Sichert eine komplette Datenbankinstanz, einschließlich Benutzern
- util.dumpSchemas() – Gibt einen Schemasatz aus
- util.loadDump() - Lade einen Dump in eine Zieldatenbank
- util.dumpTables() - Bestimmte Tabellen und Ansichten laden.
util.dumpInstance()
Das Dienstprogramm dumpInstance() sichert alle Datenbanken, die im MySQL-Datenverzeichnis vorhanden sind. Es schließt die Schemata information_schema, mysql, ndbinfo, performance_schema und sys aus, während der Speicherauszug erstellt wird.
Syntax
util.dumpInstance(outputUrl[, options])
Es wird in das lokale Dateisystem ausgegeben, outputUrl ist eine Zeichenfolge, die den Pfad zu einem lokalen Verzeichnis angibt, in dem die Dump-Dateien abgelegt werden sollen. Sie können den absoluten Pfad oder einen Pfad relativ zum aktuellen Arbeitsverzeichnis angeben.
In diesem Dienstprogramm gibt es eine Probelaufoption, um die Schemas zu untersuchen und die Kompatibilitätsprobleme anzuzeigen, dann den Dump mit den entsprechenden Kompatibilitätsoptionen auszuführen, die angewendet werden, um die Probleme zu beseitigen.
Optionen
Schauen wir uns einige wichtige Optionen für dieses Dump-Dienstprogramm an.
ocimds :[True | Falsch]
Wenn diese Option auf „true“ gesetzt ist, wird überprüft, ob das Datenwörterbuch, das Indexwörterbuch und die Verschlüsselungsoptionen in CREATE TABLE-Anweisungen in den DDL-Dateien auskommentiert sind, um sicherzustellen, dass sich alle Tabellen in der befinden MySQL-Datenverzeichnis und verwenden Sie die standardmäßige Schemaverschlüsselung.
Und es prüft alle Speicher-Engines in CREATE TABLE-Anweisungen außer InnoDB auf die Gewährung ungeeigneter Berechtigungen für Benutzer oder Rollen und auf andere Kompatibilitätsprobleme.
Wenn eine nicht konforme SQL-Anweisung gefunden wird, wird eine Ausnahme ausgelöst und der Speicherauszug angehalten.
Daher schlagen wir vor, die dryRun-Option zu verwenden, um alle Probleme mit den Elementen im Dump aufzulisten, bevor der Dump-Prozess gestartet wird. Verwenden Sie die Kompatibilitätsoption, um die Probleme in der Dump-Ausgabe automatisch zu beheben.
Hinweis:Diese Option unterstützt nur die Dienstprogramme Instanz-Dump und Schema-Dump.
Beispiel 1
MySQL localhost:3306 ssl cart JS > util.dumpInstance("/home/vagrant/production_backup", {ocimds: true,compatibility: ["strip_restricted_grants"]})
Acquiring global read lock
Global read lock acquired
All transactions have been started
Locking instance for backup
NOTE: Backup lock is not supported in MySQL 5.7 and DDL changes will not be blocked. The dump may fail with an error or not be completely consistent if schema changes are made while dumping.
Global read lock has been released
Checking for compatibility with MySQL Database Service 8.0.22
NOTE: MySQL Server 5.7 detected, please consider upgrading to 8.0 first. You can check for potential upgrade issues using util.checkForServerUpgrade().
NOTE: User 'backupuser'@'localhost' had restricted privileges (RELOAD, SUPER, CREATE TABLESPACE) removed
NOTE: User 'root'@'127.0.0.1' had restricted privileges (RELOAD, SHUTDOWN, FILE, SUPER, CREATE TABLESPACE) removed
NOTE: User 'root'@'::1' had restricted privileges (RELOAD, SHUTDOWN, FILE, SUPER, CREATE TABLESPACE) removed
NOTE: User 'root'@'localhost' had restricted privileges (RELOAD, SHUTDOWN, FILE, SUPER, CREATE TABLESPACE, PROXY) removed
ERROR: Table 'cart'.'sales' uses unsupported storage engine MyISAM (fix this with 'force_innodb' compatibility option)
Compatibility issues with MySQL Database Service 8.0.22 were found. Please use the 'compatibility' option to apply compatibility adaptations to the dumped DDL.
Util.dumpInstance: Compatibility issues were found (RuntimeError)
Wir haben also eine myisam-Tabelle in meiner Warenkorbdatenbank. Die Probelaufoption wirft den Fehler eindeutig aus.
Wenn Sie diese Fehler automatisch in Ihrer Dump-Datei beheben möchten, übergeben Sie die Kompatibilitätsoption als Argument in Ihrem Befehl.
Beispiel 2
MySQL localhost:3306 ssl cart JS > util.dumpInstance("/home/vagrant/production_backup", {dryRun: true ,ocimds: true,compatibility: ["strip_restricted_grants","force_innodb"]})
Acquiring global read lock
Global read lock acquired
All transactions have been started
Locking instance for backup
NOTE: Backup lock is not supported in MySQL 5.7 and DDL changes will not be blocked. The dump may fail with an error or not be completely consistent if schema changes are made while dumping.
Global read lock has been released
Checking for compatibility with MySQL Database Service 8.0.22
NOTE: MySQL Server 5.7 detected, please consider upgrading to 8.0 first. You can check for potential upgrade issues using util.checkForServerUpgrade().
NOTE: User 'backupuser'@'localhost' had restricted privileges (RELOAD, SUPER, CREATE TABLESPACE) removed
NOTE: User 'root'@'127.0.0.1' had restricted privileges (RELOAD, SHUTDOWN, FILE, SUPER, CREATE TABLESPACE) removed
NOTE: User 'root'@'::1' had restricted privileges (RELOAD, SHUTDOWN, FILE, SUPER, CREATE TABLESPACE) removed
NOTE: User 'root'@'localhost' had restricted privileges (RELOAD, SHUTDOWN, FILE, SUPER, CREATE TABLESPACE, PROXY) removed
NOTE: Table 'cart'.'sales' had unsupported engine MyISAM changed to InnoDB
Compatibility issues with MySQL Database Service 8.0.22 were found and repaired. Please review the changes made before loading them.
Writing global DDL files
Writing users DDL
Writing DDL for schema `cart`
Writing DDL for table `cart`.`salaries`
Writing DDL for table `cart`.`sales`
Writing DDL for table `cart`.`t1`
Preparing data dump for table `cart`.`salaries`
Data dump for table `cart`.`salaries` will be chunked using column `id`
Preparing data dump for table `cart`.`sales`
Data dump for table `cart`.`sales` will be chunked using column `id`
Preparing data dump for table `cart`.`t1`
NOTE: Could not select a column to be used as an index for table `cart`.`t1`. Chunking has been disabled for this table, data will be dumped to a single file.
Jetzt ist der Trockenlauf in Ordnung und es gibt keine Ausnahmen. Lassen Sie uns den Befehl dump instance ausführen, um eine Instanzsicherung zu erstellen.
Das Zielverzeichnis muss leer sein, bevor der Export stattfindet. Wenn das Verzeichnis noch nicht in seinem übergeordneten Verzeichnis existiert, erstellt das Dienstprogramm es.
Beispiel 3
MySQL localhost:3306 ssl cart JS > util.dumpInstance("/home/vagrant/production_backup", {compatibility: ["strip_restricted_grants","force_innodb"],threads : 12})
Acquiring global read lock
Global read lock acquired
All transactions have been started
Locking instance for backup
Global read lock has been released
Writing global DDL files
Writing users DDL
Writing DDL for schema `cart`
Writing DDL for view `cart`.`price`
Writing DDL for table `cart`.`dummy`
Writing DDL for table `cart`.`salaries`
Writing DDL for schema `sbtest`
Writing DDL for table `sbtest`.`sbtest1`
Writing DDL for table `sbtest`.`sbtest10`
.
.
.
1 thds dumping - 99% (624.55K rows / ~625.40K rows), 896.15K rows/s, 10.13 MB/s uncompressed, 3.73 MB/s compressed
Duration: 00:00:00s
Schemas dumped: 2
Tables dumped: 18
Uncompressed data size: 7.14 MB
Compressed data size: 2.79 MB
Compression ratio: 2.6
Rows written: 624550
Bytes written: 2.79 MB
Average uncompressed throughput: 7.14 MB/s
Average compressed throughput: 2.79 MB/s
Oben haben wir eine Kompatibilitätsoption verwendet. Beim Erstellen des Speicherauszugs werden also myisam-Tabellen in innodb konvertiert und in einer Datei gespeichert.
Protokolle
[[email protected] production_backup]$ cat [email protected]
-- MySQLShell dump 1.0.1 Distrib Ver 8.0.22 for Linux on x86_64 - for MySQL 8.0.22 (MySQL Community Server (GPL)), for Linux (x86_64)
--
-- Host: localhost Database: cart Table: sales
-- ------------------------------------------------------
-- Server version 5.7.32
--
-- Table structure for table `sales`
--
/*!40101 SET @saved_cs_client = @@character_set_client */;
/*!50503 SET character_set_client = utf8mb4 */;
CREATE TABLE IF NOT EXISTS `sales` (
`id` int(10) unsigned NOT NULL AUTO_INCREMENT,
`name` varchar(30) DEFAULT NULL,
`address` varchar(30) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;
/*!40101 SET character_set_client = @saved_cs_client */;
Wenn Sie mysqldump verwenden, speichert es die Ausgabe in einer einzigen Datei. Aber hier werden mehr Dateien generiert, wie wir weiter unten erklären werden.
Dies sind die verfügbaren Dateien im Backup-Verzeichnis.
[[email protected] production_backup]$ ls -lrth
total 52K
-rw-r-----. 1 vagrant vagrant 707 Nov 6 02:36 @.json
-rw-r-----. 1 vagrant vagrant 287 Nov 6 02:36 cart.json
-rw-r-----. 1 vagrant vagrant 240 Nov 6 02:36 @.sql
-rw-r-----. 1 vagrant vagrant 240 Nov 6 02:36 @.post.sql
-rw-r-----. 1 vagrant vagrant 2.6K Nov 6 02:36 @.users.sql
-rw-r-----. 1 vagrant vagrant 733 Nov 6 02:36 [email protected]
-rw-r-----. 1 vagrant vagrant 486 Nov 6 02:36 cart.sql
-rw-r-----. 1 vagrant vagrant 575 Nov 6 02:36 [email protected]
-rw-r-----. 1 vagrant vagrant 8 Nov 6 02:36 [email protected]@0.tsv.zst.idx
-rw-r-----. 1 vagrant vagrant 8 Nov 6 02:36 [email protected]@@1.tsv.zst.idx
-rw-r-----. 1 vagrant vagrant 47 Nov 6 02:36 [email protected]@0.tsv.zst
-rw-r-----. 1 vagrant vagrant 24 Nov 6 02:36 [email protected]@@1.tsv.zst
-rw-r-----. 1 vagrant vagrant 252 Nov 6 02:36 @.done.json
- Diese @.json-Datei enthält Serverdetails und eine Liste von Benutzern, Datenbanknamen und ihren Zeichensätzen.
- Diese cart.json-Datei enthält Ansichts-, SP- und Funktionsnamen zusammen mit der Liste der Tabellen.
- Diese @.sql- und @.post.sql-Dateien enthalten Versionsdetails des MySQL-Servers.
- Diese @.users.sql-Datei enthält eine Liste von Datenbankbenutzern.
- Diese [email protected] enthält eine Tabellenstruktur.
- Diese cart.sql-Datei enthält eine Datenbankanweisung.
- Diese [email protected] enthält Spaltennamen und Zeichensätze.
- Die Datei [email protected]@0.tsv.zst.idx ist eine Binärdatei. Es speichert Tabellenindizes-Statistiken.
- Die Datei [email protected]@0.tsv.zst ist eine Binärdatei und speichert Daten.
- Diese @.done.json-Datei enthält die Endzeit der Sicherung und Datendateigrößen in KB.
util.dumpSchemas()
Es wird die spezifischen Schemata ausgeben, die Sie in den Argumenten für dieses Dienstprogramm erwähnen.
Syntax
util.dumpSchemas(schemas, outputUrl[, options])
Beispiel
MySQL localhost:3306 ssl cart JS > util.dumpSchemas(["cart"], "/home/vagrant/production_backup",{compatibility: ["strip_restricted_grants","force_innodb"],threads :12})
Acquiring global read lock
Global read lock acquired
All transactions have been started
Locking instance for backup
NOTE: Backup lock is not supported in MySQL 5.7 and DDL changes will not be blocked. The dump may fail with an error or not be completely consistent if schema changes are made while dumping.
Global read lock has been released
Writing global DDL files
Writing DDL for table `cart`.`price_tag`
Writing DDL for schema `cart`
Writing DDL for table `cart`.`salaries`
Writing DDL for table `cart`.`sales`
NOTE: Table 'cart'.'sales' had unsupported engine MyISAM changed to InnoDB
Preparing data dump for table `cart`.`price_tag`
Data dump for table `cart`.`price_tag` will be chunked using column `id`
Data dump for table `cart`.`price_tag` will be written to 1 file
Preparing data dump for table `cart`.`salaries`
Data dump for table `cart`.`salaries` will be chunked using column `id`
Data dump for table `cart`.`salaries` will be written to 2 files
Preparing data dump for table `cart`.`sales`
Data dump for table `cart`.`sales` will be chunked using column `id`
Running data dump using 12 threads.
NOTE: Progress information uses estimated values and may not be accurate.
Data dump for table `cart`.`sales` will be written to 1 file
1 thds dumping - 150% (3 rows / ~2 rows), 0.00 rows/s, 0.00 B/s uncompressed, 0.00 B/s compressed
Duration: 00:00:00s
Schemas dumped: 1
Tables dumped: 3
Uncompressed data size: 53 bytes
Compressed data size: 0 bytes
Compression ratio: 53.0
Rows written: 3
Bytes written: 0 bytes
Average uncompressed throughput: 53.00 B/s
Average compressed throughput: 0.00 B/s
util.dumpTables
Wenn Sie bestimmte Tabellen ausgeben möchten, können wir das Dienstprogramm dumpTables verwenden.
Für größere Tabellen benötigt mysqldump mehr Zeit. Verwenden Sie das Dienstprogramm dumpTables, um die Zeit zu verkürzen.
Syntax
util.dumpTables(schema, tables, outputUrl[, options])
Beispiel
util.dumpTables("sbtest", [ "sbtest14", "sbtest16" ], "/home/vagrant/specific_table",{dryRun: true})
MySQL localhost:33060+ ssl sbtest JS > util.dumpTables("sbtest", [ "sbtest14", "sbtest16" ], "/home/vagrant/specific_table",{threads: 12})
Acquiring global read lock
Global read lock acquired
All transactions have been started
Locking instance for backup
Global read lock has been released
Writing global DDL files
Writing DDL for table `sbtest`.`sbtest16`
Writing DDL for table `sbtest`.`sbtest14`
Preparing data dump for table `sbtest`.`sbtest16`
Data dump for table `sbtest`.`sbtest16` will be chunked using column `id`
Preparing data dump for table `sbtest`.`sbtest14`
Data dump for table `sbtest`.`sbtest14` will be chunked using column `id`
Running data dump using 12 threads.
NOTE: Progress information uses estimated values and may not be accurate.
Data dump for table `sbtest`.`sbtest16` will be written to 1 file
Data dump for table `sbtest`.`sbtest14` will be written to 1 file
1 thds dumping - 99% (78.07K rows / ~78.08K rows), 0.00 rows/s, 0.00 B/s uncompressed, 0.00 B/s compressed
Duration: 00:00:00s
Schemas dumped: 1
Tables dumped: 2
Uncompressed data size: 892.39 KB
Compressed data size: 348.91 KB
Compression ratio: 2.6
Rows written: 78068
Bytes written: 348.91 KB
Average uncompressed throughput: 892.39 KB/s
Average compressed throughput: 348.91 KB/s
Dump Loading Utility
Das Dump-Loading-Utility bietet Daten-Streaming zum Remote-Speicher, paralleles Laden von Tabellen oder Tabellen-Chunks, Fortschrittsstatus-Verfolgung, Fortsetzen- und Zurücksetzen-Fähigkeit und die Option des gleichzeitigen Ladens, während der Dump noch stattfindet.
Hinweis:Das Dienstprogramm zum Laden von Dumps verwendet die LOAD DATA LOCAL INFILE-Anweisung, daher müssen wir diesen local_infile-Parameter während des Imports global aktivieren.
Das Dienstprogramm zum Laden von Dumps prüft, ob die Systemvariable sql_require_primary_key auf ON gesetzt ist, und wenn dies der Fall ist, gibt es einen Fehler zurück, wenn es in den Dump-Dateien eine Tabelle ohne Primärschlüssel gibt.
Syntax
util.loadDump(url[, options])
Beispiel
MySQL localhost:3306 ssl sbtest JS > util.loadDump("/home/vagrant/specific_table", {progressFile :"/home/vagrant/specific_table/log.json",threads :12})
Loading DDL and Data from '/home/vagrant/specific_table' using 12 threads.
Opening dump...
Target is MySQL 8.0.22. Dump was produced from MySQL 8.0.22
Checking for pre-existing objects...
Executing common preamble SQL
[Worker006] Executing DDL script for `sbtest`.`sbtest1`
[Worker004] Executing DDL script for `sbtest`.`sbtest12`
2 thds loading \ 100% (892.39 KB / 892.39 KB), 0.00 B/s, 0 / 2 tables done[Worker001] [email protected]@@0.tsv.zst: Records: 39034 Deleted: 0 Skipped: 0 Warnings: 0
[Worker005] [email protected]@@0.tsv.zst: Records: 39034 Deleted: 0 Skipped: 0 Warnings: 0
Executing common postamble SQL
2 chunks (78.07K rows, 892.39 KB) for 2 tables in 1 schemas were loaded in 1 sec (avg throughput 892.39 KB/s)
0 warnings were reported during the load.
Standardmäßig werden Volltextindizes für eine Tabelle erst erstellt, nachdem die Tabelle vollständig geladen wurde, was den Import beschleunigt.
Sie können die Indexerstellung auch während des Imports deaktivieren und die Indexe danach erstellen.
Das Dienstprogramm zum Laden von Dumps importiert über mehrere Threads, um die Parallelität zu maximieren. Wenn die Dump-Dateien von den Dump-Utilities von MySQL Shell komprimiert wurden, übernimmt das Dump-Loading-Utility die Dekomprimierung.
Sie können einzelne Tabellen oder Schemata auswählen, die importiert oder vom Import ausgeschlossen werden sollen.
Sie können die binäre Protokollierung auf der MySQL-Zielinstanz während des Imports überspringen, indem Sie eine Anweisung SET sql_log_bin=0 verwenden.
Fazit
Dies ist eines der leistungsstarken Dienstprogramme in MySQL 8.0. Es ist jetzt möglich, von MySQL 5.6 zu dumpen und diese Dumps in MySQL 5.7 oder 8.0 zu laden. Das Sichern von Benutzerkonten wird jedoch nicht unterstützt, wenn von MySQL 5.6 gesichert wird. In meinem nächsten Blog werden wir die Sicherungs-/Wiederherstellungsgeschwindigkeit von MySQLdump und dem Shell-Dienstprogramm vergleichen.