sql >> Databasteknik >  >> RDS >> Mysql

Logiska databassäkerhetskopieringar med MySQL-skal

Mysqldump är ett populärt logiskt säkerhetskopieringsverktyg för MySQL som ursprungligen skrevs av Igor Romanenko.

Mysqldump utför logiska säkerhetskopieringar (uppsättning SQL-satser). Som standard dumpar mysqldump inte informationsschema-tabeller och det tar aldrig prestanda_schema. Men den stora nackdelen med mysqldump är att den bara använder en tråd när den säkerhetskopierar och återställer. (Till och med din server har 64 kärnor). För att övervinna denna nackdel introducerade MySQL nya verktyg på Shell-klienten. I den här bloggen ska jag förklara dessa nya säkerhetskopieringsverktyg.

Översikt över MySQL Shell 

MySQL-skalet är en kraftfull och avancerad klient- och kodredigerare för MySQL-servern. MySQL-skal 8.0.21 innehåller några spännande nya verktyg för att skapa en logisk dump och göra en logisk återställning för hela databasinstansen, inklusive användare.

MySQL-skal 8.0.22 inkluderade en logisk säkerhetskopia av specifika tabeller och återställning.

Verktyg 

  • util.dumpInstance() – Dumpa en hel databasinstans, inklusive användare
  • util.dumpSchemas() - Dumpa en uppsättning scheman
  • util.loadDump() - Ladda en dump till en måldatabas
  • util.dumpTables() - Ladda specifika tabeller och vyer.

util.dumpInstance()

Verktyget dumpInstance() kommer att dumpa alla databaser som presenteras i MySQL-datakatalogen. Det kommer att utesluta informationsschemat, mysql, ndbinfo, performance_schema och sys-scheman medan du tar dumpningen.

Syntax 

util.dumpInstance(outputUrl[, options]) 

Den kommer att dumpa till det lokala filsystemet, outputUrl är en sträng som anger sökvägen till en lokal katalog där dumpfilerna ska placeras. Du kan ange den absoluta sökvägen eller en sökväg i förhållande till den aktuella arbetskatalogen.

I det här verktyget finns det ett torrkörningsalternativ för att inspektera scheman och se kompatibilitetsproblemen, och sedan köra dumpen med lämpliga kompatibilitetsalternativ för att ta bort problemen.

Alternativ 

Låt oss titta på några viktiga alternativ för denna dumputility.

ocimds :[True | Falskt]

När det här alternativet är inställt på sant kommer det att kontrollera att dataordboken, indexordboken och krypteringsalternativen i CREATE TABLE-satser kommenteras ut i DDL-filerna för att säkerställa att alla tabeller finns i MySQL-datakatalog och använd standardschemakrypteringen.

Och det kommer att kontrollera alla lagringsmotorer i CREATE TABLE-satser andra än InnoDB, för beviljande av olämpliga privilegier till användare eller roller, och för andra kompatibilitetsproblem.

Om en SQL-sats som inte överensstämmer hittas, görs ett undantag och dumpningen stoppas.

Så vi föreslår att du använder alternativet dryRun för att lista ut alla problem med objekten i dumpningen innan dumpningsprocessen startas. Använd kompatibilitetsalternativet för att automatiskt åtgärda problemen i dumpningen.

Obs! Det här alternativet har endast stöd för instansdumpningsverktyg och schemadumpningsverktyg.

Exempel 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-tabell i min kundvagnsdatabas. Torrkörningsalternativet ger uppenbarligen felet.

Om du vill åtgärda dessa fel automatiskt i din dumpfil, skicka in kompatibilitetsalternativet som ett argument i ditt kommando.

Exempel 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 är torrkörningen bra och det finns inga undantag. Låt oss köra kommandot dump instans för att ta en instanssäkerhetskopiering.

Målkatalogen måste vara tom innan exporten äger rum. Om katalogen ännu inte finns i sin överordnade katalog, skapar verktyget den.

Exempel 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

Ovan har vi använt ett kompatibilitetsalternativ. Så medan du tar dumpningen kommer den att konvertera myisam-tabeller till innodb och lagra dem i fil.

Loggar 

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

Om du använder mysqldump, kommer det att lagra utdata i en enda fil. Men här genererar den fler filer som vi kommer att förklara nedan.

Dessa är de tillgängliga filerna i säkerhetskopieringskatalogen.

[[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
  • Denna @.json-fil innehåller serverdetaljer och lista över användare, databasnamn och deras teckenuppsättningar.
  • Denna cart.json-fil innehåller view, SP, funktionsnamn tillsammans med listan över tabeller.
  • De här @.sql- och @.post.sql-filerna innehåller MySQL-serverversionsinformation.
  • Denna @.users.sql-fil innehåller en lista över databasanvändare.
  • Denna [email protected] innehåller tabellstruktur.
  • Den här  cart.sql-filen innehåller en databassats.
  • Denna [email protected] innehåller kolumnnamn och teckenuppsättningar.
  • [email protected]@0.tsv.zst.idx-filen är en binär fil. Den lagrar statistik över tabellindex.
  • Filen [email protected]@0.tsv.zst är en binär fil och den lagrar data.
  • Denna @.done.json-fil innehåller backupsluttid och datafilstorlekar i KB.

util.dumpSchemas()

Det kommer att dumpa de specifika scheman som du nämner i argumenten för det här verktyget.

Syntax 

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

Exempel 

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 

Om du vill dumpa specifika tabeller kan vi använda verktyget dumpTables.

För de större tabellerna kommer mysqldump att ta längre tid. Använd verktyget dumpTables för att minska tiden.

Syntax 

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

Exempel 

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 

Dumpladdningsverktyget tillhandahåller dataströmning till fjärrlagring, parallell laddning av tabeller eller tabellbitar, spårning av förloppstillstånd, möjlighet att återuppta och återställa, och möjligheten till samtidig laddning medan dumpningen fortfarande pågår.

Obs! Dumpladdningsverktyget använder satsen LOAD DATA LOCAL INFILE, så vi måste aktivera denna local_infile-parameter globalt under import.

Dumpladdningsverktyget kontrollerar om systemvariabeln sql_require_primary_key är inställd på ON, och om den är det returnerar det ett fel om det finns en tabell i dumpfilerna utan primärnyckel.

Syntax 

util.loadDump(url[, options])

Exempel 

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 skapas fulltextindex för en tabell först efter att tabellen är helt laddad, vilket påskyndar importen.

Du kan också välja att inaktivera skapande av index under importen och skapa indexen efteråt.

Dumplastningsverktyget importerar över flera trådar för att maximera parallelliteten. Om dumpfilerna komprimerades av MySQL Shells dumpverktyg, hanterar dumpningsverktyget dekomprimering.

Du kan välja enskilda tabeller eller scheman att importera eller utesluta från importen.

Du kan välja att hoppa över binär loggning på mål-MySQL-instansen under importens gång med hjälp av en SET sql_log_bin=0-sats.

Slutsats

Detta är ett av de kraftfulla verktygen i MySQL 8.0. Det är nu möjligt att dumpa från MySQL 5.6 och ladda dessa dumpar till MySQL 5.7 eller 8.0. Men dumpning av användarkonton stöds inte vid dumpning från MySQL 5.6. I min nästa blogg ska vi jämföra säkerhetskopierings-/återställningshastigheten för MySQLdump och skalverktyget.


  1. Hur återställer man en enda MySQL-tabell med mysqldump?

  2. Så här fixar du föråldrade oracle.sql.ArrayDescriptor, oracle.sql.STRUCT och oracle.sql.StructDescriptor

  3. Massuppdatering i C#

  4. SQL-uppdatering trigger endast när kolumnen ändras