Mysqldump je oblíbený logický zálohovací nástroj pro MySQL, který původně napsal Igor Romanenko.
Mysqldump provádí logické zálohy (sada SQL příkazů). Ve výchozím nastavení mysqldump nevypisuje tabulky information_schema a nikdy nebere performance_schema. Ale hlavní nevýhodou mysqldump je, že při zálohování a obnově používá pouze jedno vlákno. (I váš server má 64 jader). K překonání tohoto nedostatku zavedlo MySQL nové nástroje na klientovi Shell. V tomto blogu vysvětlím tyto nové nástroje pro zálohování.
Přehled prostředí MySQL
MySQL shell je výkonný a pokročilý klient a editor kódu pro server MySQL. MySQL shell 8.0.21 obsahuje některé vzrušující nové nástroje pro vytvoření logického výpisu a provedení logické obnovy pro celou instanci databáze, včetně uživatelů.
MySQL shell 8.0.22 obsahoval logické zálohování konkrétních tabulek a obnovu.
Nástroje
- util.dumpInstance() – Vypíše celou instanci databáze včetně uživatelů
- util.dumpSchemas() – Vypíše sadu schémat
- util.loadDump() – Načte výpis do cílové databáze
- util.dumpTables() – Načtení konkrétních tabulek a zobrazení.
util.dumpInstance()
Obslužný program dumpInstance() vypíše výpis všech databází, které jsou uvedeny v datovém adresáři MySQL. Při vytváření výpisu vyloučí schéma information_schema, mysql, ndbinfo, performance_schema a sys.
Syntaxe
util.dumpInstance(outputUrl[, options])
Vypíše výpis do místního souborového systému, outputUrl je řetězec určující cestu k místnímu adresáři, kam mají být soubory výpisu umístěny. Můžete zadat absolutní cestu nebo relativní cestu k aktuálnímu pracovnímu adresáři.
V tomto nástroji existuje možnost suchého spuštění, která umožňuje zkontrolovat schémata a zobrazit problémy s kompatibilitou a poté spustit výpis s příslušnými možnostmi kompatibility aplikovanými k odstranění problémů.
Možnosti
Podívejme se na některé důležité možnosti pro tento dumputility.
ocimds :[Pravda | False]
Pokud je tato možnost nastavena na hodnotu true, zkontroluje se, že datový slovník, slovník indexů a možnosti šifrování v příkazech CREATE TABLE jsou zakomentovány v souborech DDL, aby bylo zajištěno, že všechny tabulky jsou umístěny v MySQL datový adresář a použijte výchozí schéma šifrování.
A zkontroluje všechny úložné motory v příkazech CREATE TABLE jiné než InnoDB, zda nejsou udělena nevhodná oprávnění uživatelům nebo rolím a zda nemají jiné problémy s kompatibilitou.
Pokud je nalezen jakýkoli nevyhovující příkaz SQL, je vyvolána výjimka a výpis je zastaven.
Proto navrhujeme použít možnost dryRun k vypsání všech problémů s položkami ve výpisu před zahájením procesu ukládání. Pomocí možnosti kompatibility automaticky opravíte problémy ve výstupu výpisu.
Poznámka:Tato možnost podporuje pouze obslužný program výpisu instance a výpisu schématu.
Příklad 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)
Takže v mé databázi košíku máme tabulku myisam. Možnost suchého běhu jasně vyvolá chybu.
Pokud chcete tyto chyby v souboru výpisu automaticky opravit, předejte v příkazu jako argument možnost kompatibility.
Příklad 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.
Teď je běh na sucho v pořádku a neexistují žádné výjimky. Spusťte příkaz dump instance pro vytvoření zálohy instance.
Před exportem musí být cílový adresář prázdný. Pokud adresář ještě neexistuje ve svém nadřazeném adresáři, obslužný program jej vytvoří.
Příklad 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
Výše jsme použili možnost kompatibility. Při vytváření výpisu tedy převede tabulky myisam na innodb a uloží je do souboru.
Protokoly
[[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 */;
Pokud používáte mysqldump, uloží výstup do jednoho souboru. Ale zde generuje více souborů, jak vysvětlíme níže.
Toto jsou dostupné soubory v záložním adresáři.
[[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
- Tento soubor @.json obsahuje podrobnosti o serveru a seznam uživatelů, názvy databází a jejich znakové sady.
- Tento soubor cart.json obsahuje zobrazení, SP, názvy funkcí spolu se seznamem tabulek.
- Tyto soubory @.sql a @.post.sql obsahují podrobnosti o verzi serveru MySQL.
- Tento soubor @.users.sql obsahuje seznam uživatelů databáze.
- Tento soubor [email protected] obsahuje strukturu tabulky.
- Tento soubor cart.sql obsahuje výpis databáze.
- Tento soubor [email protected] obsahuje názvy sloupců a znakové sady.
- Soubor [email protected]@0.tsv.zst.idx je binární soubor. Ukládá statistiky indexů tabulek.
- Soubor [email protected]@0.tsv.zst je binární soubor a ukládá data.
- Tento soubor @.done.json obsahuje čas ukončení zálohy a velikost datových souborů v kB.
util.dumpSchemas()
Vypíše konkrétní schémata, která uvádíte v argumentech pro tento nástroj.
Syntaxe
util.dumpSchemas(schemas, outputUrl[, options])
Příklad
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
Pokud chcete vypsat konkrétní tabulky, můžeme použít nástroj dumpTables.
U větších tabulek zabere mysqldump více času. Ke zkrácení času použijte nástroj dumpTables.
Syntaxe
util.dumpTables(schema, tables, outputUrl[, options])
Příklad
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
Nástroj pro načítání výpisů
Obslužný program pro načítání výpisu poskytuje streamování dat do vzdáleného úložiště, paralelní načítání tabulek nebo bloků tabulek, sledování stavu průběhu, schopnost obnovení a resetování a možnost souběžného načítání, zatímco výpis stále probíhá.
Poznámka:Nástroj pro načítání výpisu používá příkaz LOAD DATA LOCAL INFILE, takže tento parametr local_infile musíme při importu povolit globálně.
Obslužný program pro načítání výpisu zkontroluje, zda je systémová proměnná sql_require_primary_key nastavena na hodnotu ON, a pokud ano, vrátí chybu, pokud se v souborech výpisu nachází tabulka bez primárního klíče.
Syntaxe
util.loadDump(url[, options])
Příklad
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.
Ve výchozím nastavení se fulltextové indexy pro tabulku vytvářejí až po úplném načtení tabulky, což urychluje import.
Můžete se také rozhodnout zakázat vytváření indexu během importu a vytvořit indexy až poté.
Obslužný program načítání výpisu importuje přes více vláken, aby se maximalizoval paralelismus. Pokud byly soubory výpisu zkomprimovány pomocí nástrojů pro výpis stavu MySQL Shell, nástroj pro načítání výpisu se postará o dekompresi.
Můžete vybrat jednotlivé tabulky nebo schémata k importu nebo k vyloučení z importu.
Můžete se rozhodnout přeskočit binární protokolování na cílové instanci MySQL během importu pomocí příkazu SET sql_log_bin=0.
Závěr
Toto je jeden z výkonných nástrojů v MySQL 8.0. Nyní je možné provést výpis z MySQL 5.6 a načíst tyto výpisy do MySQL 5.7 nebo 8.0. Ale dumping uživatelských účtů není podporován při dumpingu z MySQL 5.6. V mém příštím blogu porovnáme rychlost zálohování/obnovy MySQLdump a shell utility.