sql >> Database teknologi >  >> RDS >> Mysql

Logiske databasesikkerhedskopier ved hjælp af MySQL Shell

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.


  1. Sådan udskiftes MySQL med Percona på Plesk CentOS 7

  2. Advarsel:mysqli_connect():(HY000/1045):Adgang nægtet for brugeren 'brugernavn'@'localhost' (ved hjælp af adgangskode:JA)

  3. Sådan fungerer UUID_SHORT() i MariaDB

  4. phpMyAdmin på MySQL 8.0