Mysqldump er et populært logisk sikkerhedskopieringsværktøj til MySQL, som oprindeligt blev skrevet af Igor Romanenko.
Mysqldump udfører logiske sikkerhedskopier (sæt af SQL-sætninger). Som standard dumper mysqldump ikke informationsskematabeller, og det tager aldrig performance_schema. Men den største ulempe ved mysqldump er, at den kun bruger én tråd, mens den laver backup og gendannelse. (Selv din server har 64 kerner). For at overvinde denne ulempe introducerede MySQL nye værktøjer på Shell-klienten. I denne blog vil jeg forklare disse nye sikkerhedskopieringsværktøjer.
Oversigt over MySQL Shell
MySQL-skallen er en kraftfuld og avanceret klient- og kodeeditor til MySQL-serveren. MySQL shell 8.0.21 indeholder nogle spændende nye værktøjer til at skabe et logisk dump og foretage en logisk gendannelse for hele databaseinstansen, inklusive brugere.
MySQL shell 8.0.22 inkluderede en logisk backup af specifikke tabeller og gendannelse.
Hjælpeprogrammer
- util.dumpInstance() - Dump en hel databaseinstans, inklusive brugere
- util.dumpSchemas() - Dump et sæt skemaer
- util.loadDump() - Indlæs et dump i en måldatabase
- util.dumpTables() - Indlæs specifikke tabeller og visninger.
util.dumpInstance()
DumpInstance()-værktøjet vil dumpe alle de databaser, der er præsenteret i MySQL-databiblioteket. Det vil ekskludere informationsskema, mysql, ndbinfo, performance_schema og sys-skemaer, mens du tager dumpet.
Syntaks
util.dumpInstance(outputUrl[, options])
Den vil dumpe til det lokale filsystem, outputUrl er en streng, der angiver stien til en lokal mappe, hvor dumpfilerne skal placeres. Du kan angive den absolutte sti eller en sti i forhold til den aktuelle arbejdsmappe.
I dette værktøj er der en mulighed for tørkørsel til at inspicere skemaerne og se kompatibilitetsproblemerne, og derefter køre dumpet med de relevante kompatibilitetsindstillinger anvendt for at fjerne problemerne.
Valgmuligheder
Lad os se på nogle vigtige muligheder for denne dumputility.
ocimds :[True | Falsk]
Når denne indstilling er sat til sand, vil den kontrollere dataordbogen, indeksordbogen, og krypteringsindstillingerne i CREATE TABLE-sætningerne er kommenteret ud i DDL-filerne for at sikre, at alle tabeller er placeret i MySQL-datamappe og brug standardskemakryptering.
Og den vil kontrollere eventuelle lagermotorer i andre CREATE TABLE-sætninger end InnoDB for tildelinger af uegnede privilegier til brugere eller roller og for andre kompatibilitetsproblemer.
Hvis der findes en SQL-sætning, der ikke er i overensstemmelse, opstår der en undtagelse, og dumpet standses.
Så vi foreslår at bruge dryRun-indstillingen til at liste alle problemerne med emnerne i dumpen, før dumpingprocessen startes. Brug kompatibilitetsindstillingen til automatisk at løse problemerne i dump-outputtet.
Bemærk:Denne valgmulighed understøtter kun Instance dump utility og schema dump utility.
Eksempel 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)
Så vi har en myisam-tabel i min indkøbskurvdatabase. Tørløbsmuligheden giver tydeligvis fejlen.
Hvis du vil rette disse fejl automatisk i din dumpfil, skal du sende kompatibilitetsindstillingen som et argument i din kommando.
Eksempel 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 er tørløbet fint, og der er ingen undtagelser. Lad os køre kommandoen dump instans for at tage en instans backup.
Målbiblioteket skal være tomt, før eksporten finder sted. Hvis biblioteket endnu ikke findes i dets overordnede bibliotek, opretter værktøjet det.
Eksempel 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
Ovenfor har vi brugt en kompatibilitetsmulighed. Så mens du tager dumpet, vil den konvertere myisam-tabeller til innodb og gemme dem til fil.
logfiler
[[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 */;
Hvis du bruger mysqldump, vil det gemme outputtet i en enkelt fil. Men her genererer den flere filer, som vi vil forklare nedenfor.
Disse er de tilgængelige filer i backup-mappen.
[[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
- Denne @.json-fil indeholder serverdetaljer og liste over brugere, databasenavne og deres tegnsæt.
- Denne cart.json-fil indeholder view, SP, funktionsnavne sammen med listen over tabeller.
- Denne @.sql- og @.post.sql-filer indeholder MySQL-serverversionsoplysninger.
- Denne @.users.sql-fil indeholder en liste over databasebrugere.
- Denne [email protected] indeholder tabelstruktur.
- Denne cart.sql-fil indeholder en databasesætning.
- Denne [email protected] indeholder kolonnenavne og tegnsæt.
- [email protected]@0.tsv.zst.idx-filen er en binær fil. Den gemmer statistik over tabelindekser.
- filen [email protected]@0.tsv.zst er en binær fil, og den gemmer data.
- Denne @.done.json-fil indeholder backupsluttidspunkt og datafilstørrelser i KB.
util.dumpSchemas()
Det vil dumpe de specifikke skemaer, som du nævner i argumenterne for dette værktøj.
Syntaks
util.dumpSchemas(schemas, outputUrl[, options])
Eksempel
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
Hvis du vil dumpe specifikke tabeller, kan vi bruge dumpTables-værktøjet.
For de større tabeller vil mysqldump tage længere tid. Brug værktøjet dumpTables til at reducere tiden.
Syntaks
util.dumpTables(schema, tables, outputUrl[, options])
Eksempel
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 Utility
Dump-indlæsningsværktøjet giver datastreaming til fjernlager, parallel indlæsning af tabeller eller tabelstykker, statussporing, genoptagelse og nulstillingsfunktion og mulighed for samtidig indlæsning, mens dumpningen stadig finder sted.
Bemærk:Dump-indlæsningsværktøjet bruger LOAD DATA LOCAL INFILE-sætningen, så vi er nødt til at aktivere denne local_infile-parameter globalt under import.
Dump loading-værktøjet kontrollerer, om systemvariablen sql_require_primary_key er sat til ON, og hvis den er, returnerer den en fejl, hvis der er en tabel i dumpfilerne uden primærnøgle.
Syntaks
util.loadDump(url[, options])
Eksempel
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.
Som standard oprettes fuldtekstindekser for en tabel først, efter at tabellen er fuldstændig indlæst, hvilket fremskynder importen.
Du kan også vælge at deaktivere indeksoprettelse under importen og oprette indekserne bagefter.
Dumpingsværktøjet importerer på tværs af flere tråde for at maksimere paralleliteten. Hvis dumpfilerne blev komprimeret af MySQL Shells dump-værktøjer, håndterer dump-indlæsningsværktøjet dekomprimering.
Du kan vælge individuelle tabeller eller skemaer til at importere eller udelukke fra importen.
Du kan vælge at springe binær logning over på mål-MySQL-forekomsten i løbet af importen ved hjælp af en SET sql_log_bin=0-sætning.
Konklusion
Dette er et af de kraftfulde hjælpeprogrammer i MySQL 8.0. Det er nu muligt at dumpe fra MySQL 5.6 og indlæse disse dumps i MySQL 5.7 eller 8.0. Men dumping af brugerkonti understøttes ikke ved dumping fra MySQL 5.6. I min næste blog skal vi sammenligne backup/gendannelseshastigheden for MySQLdump og shell-værktøjet.