sql >> Databáze >  >> RDS >> Mysql

Logické zálohy databáze pomocí MySQL Shell

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.


  1. Jak získat to nejlepší z protokolů PostgreSQL

  2. Překlenutí mezery v Azure:Spravované instance

  3. SQL Server:Databáze se zasekla ve stavu Obnovování

  4. Export výsledků dotazu Mysql do excelu?