sql >> Database >  >> RDS >> Mysql

Logische databaseback-ups met MySQL Shell

Mysqldump is een populaire logische back-uptool voor MySQL die oorspronkelijk is geschreven door Igor Romanenko.

Mysqldump maakt logische back-ups (set van SQL-statements). Standaard dumpt mysqldump geen information_schema-tabellen en neemt het nooit performance_schema. Maar het grootste nadeel van mysqldump is dat het slechts één thread gebruikt tijdens het maken van back-ups en herstel. (Zelfs uw server heeft 64 cores). Om dit nadeel te verhelpen, introduceerde MySQL nieuwe hulpprogramma's op de Shell-client. In deze blog ga ik deze nieuwe back-uphulpprogramma's uitleggen.

Overzicht van MySQL Shell 

De MySQL-shell is een krachtige en geavanceerde client- en code-editor voor de MySQL-server. MySQL-shell 8.0.21 bevat enkele opwindende nieuwe hulpprogramma's om een ​​logische dump te maken en een logisch herstel uit te voeren voor de hele database-instantie, inclusief gebruikers.

MySQL-shell 8.0.22 bevatte een logische back-up van specifieke tabellen en herstel.

Hulpprogramma's 

  • util.dumpInstance() - Dump een hele database-instantie, inclusief gebruikers
  • util.dumpSchemas() - Een reeks schema's dumpen
  • util.loadDump() - Laad een dump in een doeldatabase
  • util.dumpTables() - Laad specifieke tabellen en weergaven.

util.dumpInstance()

Het hulpprogramma dumpInstance() dumpt alle databases die worden weergegeven in de MySQL-gegevensmap. Het zal de schema's information_schema, mysql, ndbinfo, performance_schema en sys uitsluiten tijdens het dumpen.

Syntaxis 

util.dumpInstance(outputUrl[, options]) 

Het zal naar het lokale bestandssysteem worden gedumpt, outputUrl is een tekenreeks die het pad specificeert naar een lokale map waar de dumpbestanden moeten worden geplaatst. U kunt het absolute pad specificeren of een pad relatief aan de huidige werkdirectory.

In dit hulpprogramma is er een "dry run"-optie om de schema's te inspecteren en de compatibiliteitsproblemen te bekijken, en voer vervolgens de dump uit met de juiste compatibiliteitsopties toegepast om de problemen te verwijderen.

Opties 

Laten we eens kijken naar enkele belangrijke opties voor deze dumputility.

ocimds:[Waar | Onwaar]

Als deze optie is ingesteld op true, zal het controleren of de datadictionary, index dictionary en encryptie-opties in CREATE TABLE-statements commentaar bevatten in de DDL-bestanden, om ervoor te zorgen dat alle tabellen zich in de MySQL-gegevensmap en gebruik de standaardschemaversleuteling.

En het controleert alle storage-engines in CREATE TABLE-statements anders dan InnoDB, op toekenning van ongeschikte privileges aan gebruikers of rollen, en op andere compatibiliteitsproblemen.

Als er een niet-conforme SQL-instructie wordt gevonden, wordt er een uitzondering gemaakt en wordt de dump gestopt.

Daarom stellen we voor om de dryRun-optie te gebruiken om alle problemen met de items in de dump op te sommen voordat het dumpproces wordt gestart. Gebruik de compatibiliteitsoptie om de problemen in de dumpoutput automatisch op te lossen.

Opmerking:deze optie biedt alleen ondersteuning voor het hulpprogramma Instantiedump en het hulpprogramma voor schemadump.

Voorbeeld 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)

Dus we hebben een myisam-tabel in de database van mijn winkelwagentje. De optie drooglopen geeft duidelijk de fout.

Als u deze fouten automatisch in uw dumpbestand wilt herstellen, geeft u de compatibiliteitsoptie door als argument in uw opdracht.

Voorbeeld 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.

Nu is het drooglopen prima en zijn er geen uitzonderingen. Laten we de opdracht dump instance uitvoeren om een ​​instance-back-up te maken.

De doelmap moet leeg zijn voordat de export plaatsvindt. Als de map nog niet bestaat in de bovenliggende map, maakt het hulpprogramma deze aan.

Voorbeeld 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

Hierboven hebben we een compatibiliteitsoptie gebruikt. Dus terwijl het de dump neemt, zal het myisam-tabellen converteren naar innodb en ze opslaan in een bestand.

Logbestanden 

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

Als je mysqldump gebruikt, zal het de uitvoer in een enkel bestand opslaan. Maar hier genereert het meer bestanden, zoals we hieronder zullen uitleggen.

Dit zijn de beschikbare bestanden in de back-upmap.

[[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
  • Dit @.json-bestand bevat serverdetails en een lijst met gebruikers, databasenamen en hun tekensets.
  • Dit cart.json-bestand bevat weergave-, SP-, functienamen samen met de lijst met tabellen.
  • Deze @.sql- en @.post.sql-bestanden bevatten details over de MySQL-serverversie.
  • Dit @.users.sql-bestand bevat een lijst met databasegebruikers.
  • Dit [email protected] bevat een tabelstructuur.
  • Dit  cart.sql-bestand bevat een database-statement.
  • Dit [email protected] bevat kolomnamen en tekensets.
  • Het bestand [email protected]@0.tsv.zst.idx is een binair bestand. Het slaat tabelindexstatistieken op.
  • Het bestand [email protected]@0.tsv.zst is een binair bestand waarin gegevens worden opgeslagen.
  • Dit @.done.json-bestand bevat de eindtijd van de back-up en de grootte van gegevensbestanden in KB.

util.dumpSchemas()

Het zal de specifieke schema's die je noemt in de argumenten voor dit hulpprogramma dumpen.

Syntaxis 

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

Voorbeeld 

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 

Als u specifieke tabellen wilt dumpen, kunnen we het hulpprogramma dumpTables gebruiken.

Voor de grotere tabellen zal mysqldump meer tijd in beslag nemen. Gebruik het hulpprogramma dumpTables om de tijd te verkorten.

Syntaxis 

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

Voorbeeld 

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 

Dump Loading-hulpprogramma 

Het hulpprogramma voor het laden van dumps biedt gegevensstreaming naar externe opslag, parallel laden van tabellen of table-chunks, het volgen van de voortgangsstatus, hervatten en resetten, en de optie van gelijktijdig laden terwijl de dump nog plaatsvindt.

Opmerking:het hulpprogramma voor het laden van dumps gebruikt de instructie LOAD DATA LOCAL INFILE, dus we moeten deze parameter local_infile globaal inschakelen tijdens het importeren.

Het hulpprogramma voor het laden van dumps controleert of de systeemvariabele sql_require_primary_key is ingesteld op AAN, en als dat het geval is, wordt een fout geretourneerd als er een tabel in de dumpbestanden is zonder primaire sleutel.

Syntaxis 

util.loadDump(url[, options])

Voorbeeld 

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.

Standaard worden fulltext-indexen voor een tabel pas gemaakt nadat de tabel volledig is geladen, wat het importeren versnelt.

U kunt er ook voor kiezen om het maken van indexen tijdens het importeren uit te schakelen en daarna de indexen te maken.

Het hulpprogramma voor het laden van dumps importeert over meerdere threads om het parallellisme te maximaliseren. Als de dumpbestanden zijn gecomprimeerd door de dumphulpprogramma's van MySQL Shell, zorgt het hulpprogramma voor het laden van de dump voor decompressie.

U kunt afzonderlijke tabellen of schema's selecteren om te importeren of uit te sluiten van de import.

U kunt ervoor kiezen om binaire logboekregistratie op de MySQL-doelinstantie tijdens het importeren over te slaan met behulp van een SET sql_log_bin=0-instructie.

Conclusie

Dit is een van de krachtige hulpprogramma's in MySQL 8.0. Het is nu mogelijk om vanuit MySQL 5.6 te dumpen en deze dumps in MySQL 5.7 of 8.0 te laden. Maar het dumpen van gebruikersaccounts wordt niet ondersteund bij het dumpen vanuit MySQL 5.6. In mijn volgende blog zullen we de back-up-/herstelsnelheid van MySQLdump en shell-hulpprogramma vergelijken.


  1. Array in IN()-clausule orakel PLSQL

  2. Heeft mysql het equivalent van de analytische functies van Oracle?

  3. DBCC CLONEDATABASE en Query Store gebruiken voor testen

  4. Hybride clouddatabaseverkeer versleutelen