Mysql
 sql >> база данни >  >> RDS >> Mysql

Архивиране на логически бази данни с помощта на MySQL Shell

Mysqldump е популярен инструмент за логично архивиране на MySQL, който първоначално е написан от Игор Романенко.

Mysqldump извършва логически архиви (набор от SQL оператори). По подразбиране mysqldump не изхвърля таблици information_schema и никога не приема performance_schema. Но основният недостатък на mysqldump е, че той използва само една нишка, докато прави архивиране и възстановяване. (Дори вашият сървър има 64 ядра). За да преодолее този недостатък, MySQL въведе нови помощни програми на клиента Shell. В този блог ще обясня тези нови помощни програми за архивиране.

Общ преглед на MySQL Shell 

Обвивката на MySQL е мощен и усъвършенстван клиент и редактор на код за MySQL сървър. MySQL shell 8.0.21 включва някои вълнуващи нови помощни програми за създаване на логическо сметище и извършване на логическо възстановяване за целия екземпляр на базата данни, включително потребителите.

MySQL shell 8.0.22 включва логическо архивиране на конкретни таблици и възстановяване.

Помощни програми 

  • util.dumpInstance() - Изхвърля цял екземпляр на база данни, включително потребители
  • util.dumpSchemas() - Изхвърляне на набор от схеми
  • util.loadDump() - Зареждане на дъмп в целева база данни
  • util.dumpTables() – Зареждане на конкретни таблици и изгледи.

util.dumpInstance()

Помощната програма dumpInstance() ще изхвърли всички бази данни, които са представени в директорията с данни на MySQL. Той ще изключи схемите  information_schema, mysql, ndbinfo, performance_schema и sys, докато взема дъмп.

Синтаксис 

util.dumpInstance(outputUrl[, options]) 

Ще се изхвърли в локалната файлова система, outputUrl е низ, указващ пътя към локална директория, където да се поставят дъмп файловете. Можете да зададете абсолютен път или път спрямо текущата работна директория.

В тази помощна програма има опция за сухо изпълнение, за да проверите схемите и да прегледате проблемите със съвместимостта, след което да стартирате дъмпа с приложимите подходящи опции за съвместимост, за да премахнете проблемите.

Опции 

Нека разгледаме някои важни опции за тази глупост.

ocimds :[Вярно | False]

Когато тази опция е зададена на true, тя ще провери, че речникът на данните, индексният речник и опциите за криптиране в операторите CREATE TABLE са коментирани в DDL файловете, за да се гарантира, че всички таблици се намират в MySQL директория с данни и използвайте криптирането на схемата по подразбиране.

И ще проверява всички механизми за съхранение в изрази CREATE TABLE, различни от InnoDB, за предоставяне на неподходящи привилегии на потребители или роли и за други проблеми със съвместимостта.

Ако бъде намерен несъответстващ SQL израз, се създава изключение и изхвърлянето се спира.

Затова предлагаме да използвате опцията dryRun, за да изброите всички проблеми с елементите в дъмпа, преди да започне процеса на изхвърляне. Използвайте опцията за съвместимост, за да коригирате автоматично проблемите в изхода за дъмп.

Забележка:Тази опция поддържа само помощна програма за изхвърляне на екземпляри и помощна програма за изхвърляне на схема.

Пример 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)

Така че имаме таблица myisam в моята база данни за количките. Опцията за сухо изпълнение ясно показва грешката.

Ако искате да коригирате тези грешки автоматично във вашия дъмп файл, предайте опцията за съвместимост като аргумент във вашата команда.

Пример 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.

Сега сухият режим е наред и няма изключения. Нека изпълним командата dump instance, за да направим резервно копие на екземпляра.

Целевата директория трябва да е празна, преди да се извърши експортирането. Ако директорията все още не съществува в нейната родителска директория, помощната програма я създава.

Пример 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

По-горе използвахме опция за съвместимост. Така че докато взема дъмп, той ще преобразува myisam таблици в innodb и ще ги съхрани във файл.

Регистри 

[[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 */;

Ако използвате mysqldump, той ще съхранява изхода в един файл. Но тук той генерира повече файлове, както ще обясним по-долу.

Това са наличните файлове в резервната директория.

[[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
  • Този @.json файл съдържа подробности за сървъра и списък с потребители, имена на бази данни и техните набори от знаци.
  • Този файл cart.json съдържа изглед, SP, имена на функции заедно със списъка с таблици.
  • Тези @.sql и @.post.sql файлове съдържат подробности за версията на MySQL сървъра.
  • Този @.users.sql файл съдържа списък с потребители на базата данни.
  • Този файл [email protected] съдържа структура на таблицата.
  • Този  cart.sql файл съдържа изявление за база данни.
  • Този файл [email protected] съдържа имена на колони и набори от знаци.
  • Файлът [email protected]@0.tsv.zst.idx е двоичен файл. Той съхранява статистика за индексите на таблици.
  • Файлът  [email protected]@0.tsv.zst е двоичен файл и съхранява данни.
  • Този файл @.done.json съдържа краен час на архивиране и размери на файлове с данни в KB.

util.dumpSchemas()

Тя ще изхвърли конкретните схеми, които споменавате в аргументите за тази помощна програма.

Синтаксис 

​util.dumpSchemas(schemas, outputUrl[, options])

Пример 

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 

Ако искате да изхвърлите конкретни таблици, можем да използваме помощната програма dumpTables.

За по-големите таблици mysqldump ще отнеме повече време. Използвайте помощната програма dumpTables, за да намалите времето.

Синтаксис 

util.dumpTables(schema, tables, outputUrl[, options])

Пример 

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 

Помощна програма за зареждане на изхвърляне 

Помощната програма за зареждане на дъмп осигурява поточно предаване на данни към отдалечено хранилище, паралелно зареждане на таблици или парчета таблици, проследяване на състоянието на напредъка, възможност за възобновяване и нулиране и опция за едновременно зареждане, докато дъмпът все още се извършва.

Забележка:Помощната програма за зареждане на дъмп използва израза LOAD DATA LOCAL INFILE, така че трябва да активираме този параметър local_infile глобално, докато импортираме.

Помощната програма за зареждане на dump проверява дали системната променлива sql_require_primary_key е зададена на ON и ако е, връща грешка, ако има таблица в дъмп файловете без първичен ключ.

Синтаксис 

util.loadDump(url[, options])

Пример 

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.

По подразбиране пълнотекстовите индекси за таблица се създават само след като таблицата е напълно заредена, което ускорява импортирането.

Можете също да изберете да деактивирате създаването на индекси по време на импортирането и да създадете индексите след това.

Помощната програма за зареждане на дъмп импортира в множество нишки, за да увеличи максимално паралелизма. Ако дъмп файловете са били компресирани от помощните програми за дъмп на MySQL Shell, помощната програма за зареждане на дъмп обработва декомпресията.

Можете да изберете отделни таблици или схеми, които да импортирате или да изключите от импортирането.

Можете да изберете да пропуснете двоично регистриране на целевия MySQL екземпляр по време на импортирането, като използвате оператор SET sql_log_bin=0.

Заключение

Това е една от мощните помощни програми в MySQL 8.0. Вече е възможно да се изхвърлят от MySQL 5.6 и да се заредят тези дъмпове в MySQL 5.7 или 8.0. Но изхвърлянето на потребителски акаунти не се поддържа при изхвърляне от MySQL 5.6. В следващия ми блог ще сравним скоростта на архивиране/възстановяване на MySQLdump и помощната програма за shell.


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Създаване на уеб приложение от нулата с помощта на Python Flask и MySQL:Част 2

  2. Запазване на прекъсвания на редове от TextArea при писане в MySQL

  3. Времето за изчакване на фиксиране на заключване е превишено; опитайте да рестартирате транзакцията за „заседнала Mysql таблица?

  4. Как да създавате и използвате MySQL изгледи

  5. Разбиране на HAProxy статистиката за MySQL и PostgreSQL