Mysql
 sql >> Baza danych >  >> RDS >> Mysql

Logiczne kopie zapasowe baz danych przy użyciu powłoki MySQL

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.


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. UNIX_TIMESTAMP() Przykłady – MySQL

  2. MySQL Z klauzulą

  3. Nie znaleziono odpowiedniego sterownika dla 'jdbc:mysql://localhost:3306/mysql

  4. Jak zaimportować plik CSV do tabeli MySQL

  5. Jak pobrać obrazy z bazy danych MySQL i wyświetlić je w tagu html?