Mysqldump to popularne logiczne narzędzie do tworzenia kopii zapasowych dla MySQL, które zostało pierwotnie napisane przez Igora Romanenko.
Mysqldump wykonuje logiczne kopie zapasowe (zestaw instrukcji SQL). Domyślnie mysqldump nie zrzuca tabel information_schema i nigdy nie pobiera performance_schema. Ale główną wadą mysqldump jest to, że używa tylko jednego wątku podczas tworzenia kopii zapasowej i przywracania. (Nawet twój serwer ma 64 rdzenie). Aby przezwyciężyć tę wadę, MySQL wprowadził nowe narzędzia na kliencie Shell. W tym blogu wyjaśnię te nowe narzędzia do tworzenia kopii zapasowych.
Przegląd powłoki MySQL
Powłoka MySQL to potężny i zaawansowany edytor klienta i kodu dla serwera MySQL. Powłoka MySQL 8.0.21 zawiera kilka ekscytujących nowych narzędzi do tworzenia logicznego zrzutu i logicznego przywracania całej instancji bazy danych, w tym użytkowników.
Powłoka MySQL 8.0.22 zawierała logiczną kopię zapasową określonych tabel i przywracanie.
Narzędzia
- util.dumpInstance() — Zrzuć całą instancję bazy danych, w tym użytkowników
- util.dumpSchemas() — Zrzuć zestaw schematów
- util.loadDump() — Załaduj zrzut do docelowej bazy danych
- util.dumpTables() — Załaduj określone tabele i widoki.
util.dumpInstance()
Narzędzie dumpInstance() zrzuci wszystkie bazy danych, które są prezentowane w katalogu danych MySQL. Wyklucza schematy information_schema, mysql, ndbinfo, performance_schema i sys podczas wykonywania zrzutu.
Składnia
util.dumpInstance(outputUrl[, options])
Zrzuci do lokalnego systemu plików, outputUrl to łańcuch określający ścieżkę do lokalnego katalogu, w którym mają zostać umieszczone pliki zrzutu. Możesz określić ścieżkę bezwzględną lub ścieżkę względną do bieżącego katalogu roboczego.
W tym narzędziu dostępna jest opcja uruchomienia na sucho, aby sprawdzić schematy i wyświetlić problemy ze zgodnością, a następnie uruchomić zrzut z odpowiednimi opcjami zgodności zastosowanymi w celu usunięcia problemów.
Opcje
Przyjrzyjmy się kilku ważnym opcjom tego dupututility.
ocimds :[Prawda | Fałsz]
Gdy ta opcja jest ustawiona na true, sprawdzi, czy słownik danych, słownik indeksu i opcje szyfrowania instrukcji CREATE TABLE są zakomentowane w plikach DDL, aby upewnić się, że wszystkie tabele znajdują się w Katalog danych MySQL i użyj domyślnego szyfrowania schematu.
I sprawdzi wszystkie silniki pamięci masowej w instrukcjach CREATE TABLE innych niż InnoDB, pod kątem przyznania nieodpowiednich uprawnień użytkownikom lub rolom oraz pod kątem innych problemów ze zgodnością.
Jeśli zostanie znaleziona jakakolwiek niezgodna instrukcja SQL, zgłaszany jest wyjątek i zrzut jest zatrzymywany.
Dlatego sugerujemy skorzystanie z opcji dryRun, aby wypisać wszystkie problemy z przedmiotami ze zrzutu przed rozpoczęciem procesu zrzutu. Użyj opcji zgodności, aby automatycznie naprawić problemy w danych wyjściowych zrzutu.
Uwaga:ta opcja obsługuje tylko narzędzie zrzutu instancji i narzędzie zrzutu schematu.
Przykład 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)
Więc mamy tabelę myisam w mojej bazie danych koszyka. Opcja pracy na sucho wyraźnie zgłasza błąd.
Jeśli chcesz automatycznie naprawić te błędy w pliku zrzutu, przekaż opcję zgodności jako argument w poleceniu.
Przykład 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.
Teraz przebieg próbny jest w porządku i nie ma wyjątków. Uruchommy polecenie dump instancji, aby wykonać kopię zapasową instancji.
Katalog docelowy musi być pusty przed rozpoczęciem eksportu. Jeśli katalog nie istnieje jeszcze w swoim katalogu nadrzędnym, narzędzie go utworzy.
Przykład 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
Powyżej zastosowaliśmy opcję kompatybilności. Więc podczas robienia zrzutu, przekonwertuje on tabele myisam na innodb i zapisze je w pliku.
Dzienniki
[[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 */;
Jeżeli używasz mysqldump, dane wyjściowe będą przechowywane w jednym pliku. Ale tutaj generuje więcej plików, jak wyjaśnimy poniżej.
To są dostępne pliki w katalogu kopii zapasowej.
[[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
- Ten plik @.json zawiera szczegóły serwera i listę użytkowników, nazwy baz danych i ich zestawy znaków.
- Ten plik cart.json zawiera nazwy widoków, SP, funkcji wraz z listą tabel.
- Pliki @.sql i @.post.sql zawierają szczegóły wersji serwera MySQL.
- Ten plik @.users.sql zawiera listę użytkowników bazy danych.
- Ten plik [email protected] zawiera strukturę tabeli.
- Ten plik cart.sql zawiera wyciąg z bazy danych.
- Ten plik [email protected] zawiera nazwy kolumn i zestawy znaków.
- Plik [email protected]@0.tsv.zst.idx jest plikiem binarnym. Przechowuje statystyki indeksów tabel.
- Plik [email protected]@0.tsv.zst jest plikiem binarnym i przechowuje dane.
- Ten plik @.done.json zawiera czas zakończenia kopii zapasowej i rozmiary plików danych w KB.
util.dumpSchemas()
Zrzuci określone schematy wymienione w argumentach tego narzędzia.
Składnia
util.dumpSchemas(schemas, outputUrl[, options])
Przykład
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
Jeśli chcesz zrzucić określone tabele, możemy użyć narzędzia dumpTables.
W przypadku większych tabel mysqldump zajmie więcej czasu. Użyj narzędzia dumpTables, aby skrócić czas.
Składnia
util.dumpTables(schema, tables, outputUrl[, options])
Przykład
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
Narzędzie wczytywania zrzutu
Narzędzie do ładowania zrzutów zapewnia przesyłanie strumieniowe danych do pamięci zdalnej, równoległe ładowanie tabel lub fragmentów tabel, śledzenie postępu, możliwość wznawiania i resetowania oraz opcję współbieżnego ładowania, gdy zrzut jest nadal wykonywany.
Uwaga:narzędzie do ładowania zrzutów używa instrukcji LOAD DATA LOCAL INFILE, dlatego podczas importowania musimy włączyć ten parametr local_infile globalnie.
Narzędzie do ładowania zrzutu sprawdza, czy zmienna systemowa sql_require_primary_key jest ustawiona na ON, a jeśli tak, zwraca błąd, jeśli w plikach zrzutu znajduje się tabela bez klucza podstawowego.
Składnia
util.loadDump(url[, options])
Przykład
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.
Domyślnie indeksy pełnotekstowe dla tabeli są tworzone dopiero po całkowitym załadowaniu tabeli, co przyspiesza import.
Możesz także wyłączyć tworzenie indeksów podczas importu i tworzyć indeksy później.
Narzędzie do ładowania zrzutu importuje dane w wielu wątkach, aby zmaksymalizować równoległość. Jeśli pliki zrzutu zostały skompresowane przez narzędzia zrzutu MySQL Shell, narzędzie do ładowania zrzutu obsługuje dekompresję.
Możesz wybrać poszczególne tabele lub schematy do zaimportowania lub wykluczenia z importu.
Możesz pominąć logowanie binarne w docelowej instancji MySQL podczas importu za pomocą instrukcji SET sql_log_bin=0.
Wnioski
Jest to jedno z potężnych narzędzi w MySQL 8.0. Teraz można wykonać zrzut z MySQL 5.6 i załadować te zrzuty do MySQL 5.7 lub 8.0. Ale zrzucanie kont użytkowników nie jest obsługiwane podczas zrzucania z MySQL 5.6. W następnym blogu porównamy szybkość tworzenia kopii zapasowych/przywracania MySQLdump i narzędzia powłoki.