Mysql
 sql >> Datenbank >  >> RDS >> Mysql

Sicherungen logischer Datenbanken mit MySQL Shell

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.