Mysql
 sql >> Base de données >  >> RDS >> Mysql

Sauvegardes de bases de données logiques à l'aide de MySQL Shell

Mysqldump est un outil de sauvegarde logique populaire pour MySQL qui a été initialement écrit par Igor Romanenko.

Mysqldump effectue des sauvegardes logiques (ensemble d'instructions SQL). Par défaut, mysqldump ne vide pas les tables information_schema et ne prend jamais performance_schema. Mais le principal inconvénient de mysqldump est qu'il n'utilise qu'un seul thread lors de la sauvegarde et de la restauration. (Même votre serveur a 64 cœurs). Pour surmonter cet inconvénient, MySQL a introduit de nouveaux utilitaires sur le client Shell. Dans ce blog, je vais vous expliquer ces nouveaux utilitaires de sauvegarde.

Présentation de MySQL Shell 

Le shell MySQL est un client puissant et avancé et un éditeur de code pour le serveur MySQL. MySQL shell 8.0.21 inclut de nouveaux utilitaires passionnants pour créer un vidage logique et effectuer une restauration logique pour l'intégralité de l'instance de base de données, y compris les utilisateurs.

MySQL shell 8.0.22 incluait une sauvegarde logique de tables spécifiques et une restauration.

Utilitaires 

  • util.dumpInstance() - Vider une instance de base de données entière, y compris les utilisateurs
  • util.dumpSchemas() - Vider un ensemble de schémas
  • util.loadDump() - Charger un vidage dans une base de données cible
  • util.dumpTables() - Charge des tables et des vues spécifiques.

util.dumpInstance()

L'utilitaire dumpInstance() videra toutes les bases de données présentées dans le répertoire de données MySQL. Il exclura les schémas information_schema, mysql, ndbinfo, performance_schema et sys lors du vidage.

Syntaxe 

util.dumpInstance(outputUrl[, options]) 

Il sera vidé vers le système de fichiers local, outputUrl est une chaîne spécifiant le chemin vers un répertoire local où les fichiers de vidage doivent être placés. Vous pouvez spécifier le chemin absolu ou un chemin relatif au répertoire de travail courant.

Dans cet utilitaire, il existe une option de simulation pour inspecter les schémas et afficher les problèmes de compatibilité, puis exécutez le vidage avec les options de compatibilité appropriées appliquées pour supprimer les problèmes.

Option 

Regardons quelques options importantes pour cet utilitaire de vidage.

ocimds :[Vrai | Faux]

Lorsque cette option est définie sur true, elle vérifie que le dictionnaire de données, le dictionnaire d'index et les options de chiffrement dans les instructions CREATE TABLE sont commentés dans les fichiers DDL, pour s'assurer que toutes les tables sont situées dans le Répertoire de données MySQL et utilisez le chiffrement de schéma par défaut.

Et il vérifiera tous les moteurs de stockage dans les instructions CREATE TABLE autres qu'InnoDB, pour les octrois de privilèges inappropriés aux utilisateurs ou aux rôles, et pour d'autres problèmes de compatibilité.

Si une instruction SQL non conforme est trouvée, une exception est déclenchée et le vidage est interrompu.

Nous suggérons donc d'utiliser l'option dryRun pour répertorier tous les problèmes liés aux éléments du vidage avant le démarrage du processus de vidage. Utilisez l'option de compatibilité pour résoudre automatiquement les problèmes dans la sortie de vidage.

Remarque :Cette option ne prend en charge que l'utilitaire de vidage d'instance et l'utilitaire de vidage de schéma.

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

Nous avons donc une table myisam dans la base de données de mon panier. L'option de simulation génère clairement l'erreur.

Si vous souhaitez corriger ces erreurs automatiquement dans votre fichier de vidage, transmettez l'option de compatibilité comme argument dans votre commande.

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

Maintenant, la marche à vide est bonne et il n'y a pas d'exceptions. Exécutons la commande dump instance pour effectuer une sauvegarde d'instance.

Le répertoire cible doit être vide avant que l'exportation ait lieu. Si le répertoire n'existe pas encore dans son répertoire parent, l'utilitaire le crée.

Exemple 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

Ci-dessus, nous avons utilisé une option de compatibilité. Ainsi, lors du vidage, il convertira les tables myisam en innodb et les stockera dans un fichier.

Journaux 

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

Si vous utilisez mysqldump, il stockera la sortie dans un seul fichier. Mais ici, il génère plus de fichiers comme nous l'expliquerons ci-dessous.

Ce sont les fichiers disponibles dans le répertoire de sauvegarde.

[[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
  • Ce fichier @.json contient les détails du serveur et la liste des utilisateurs, les noms des bases de données et leurs jeux de caractères.
  • Ce fichier cart.json contient les noms de vue, SP, de fonction ainsi que la liste des tables.
  • Ces fichiers @.sql et @.post.sql contiennent les détails de la version du serveur MySQL.
  • Ce fichier @.users.sql contient une liste des utilisateurs de la base de données.
  • Ce fichier [email protected] contient une structure de table.
  • Ce fichier cart.sql contient une instruction de base de données.
  • Ce fichier [email protected] contient des noms de colonnes et des jeux de caractères.
  • Le fichier [email protected]@0.tsv.zst.idx est un fichier binaire. Il stocke les statistiques des index de table.
  • Le fichier [email protected]@0.tsv.zst est un fichier binaire qui stocke des données.
  • Ce fichier @.done.json contient l'heure de fin de la sauvegarde et la taille des fichiers de données en Ko.

util.dumpSchemas()

Il videra les schémas spécifiques que vous mentionnez dans les arguments de cet utilitaire.

Syntaxe 

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

Exemple 

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 

Si vous souhaitez vider des tables spécifiques, nous pouvons utiliser l'utilitaire dumpTables.

Pour les grandes tables, mysqldump prendra plus de temps. Utilisez l'utilitaire dumpTables pour réduire le temps.

Syntaxe 

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

Exemple 

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 

Utilitaire de chargement de vidage 

L'utilitaire de chargement de vidage fournit le streaming de données vers le stockage distant, le chargement parallèle de tables ou de morceaux de table, le suivi de l'état de progression, la fonction de reprise et de réinitialisation et l'option de chargement simultané pendant que le vidage est toujours en cours.

Remarque :L'utilitaire de chargement de vidage utilise l'instruction LOAD DATA LOCAL INFILE, nous devons donc activer ce paramètre local_infile globalement lors de l'importation.

L'utilitaire de chargement de vidage vérifie si la variable système sql_require_primary_key est définie sur ON et, si c'est le cas, renvoie une erreur s'il existe une table dans les fichiers de vidage sans clé primaire.

Syntaxe 

util.loadDump(url[, options])

Exemple 

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.

Par défaut, les index de texte intégral d'une table ne sont créés qu'après le chargement complet de la table, ce qui accélère l'importation.

Vous pouvez également choisir de désactiver la création d'index lors de l'importation et de créer les index par la suite.

L'utilitaire de chargement de vidage importe sur plusieurs threads pour maximiser le parallélisme. Si les fichiers de vidage ont été compressés par les utilitaires de vidage de MySQL Shell, l'utilitaire de chargement de vidage gère la décompression.

Vous pouvez sélectionner des tables ou des schémas individuels à importer ou à exclure de l'importation.

Vous pouvez choisir d'ignorer la journalisation binaire sur l'instance MySQL cible au cours de l'importation à l'aide d'une instruction SET sql_log_bin=0.

Conclusion

C'est l'un des utilitaires puissants de MySQL 8.0. Il est désormais possible de faire un dump depuis MySQL 5.6 et de charger ces dumps dans MySQL 5.7 ou 8.0. Mais le vidage des comptes d'utilisateurs n'est pas pris en charge lors du vidage à partir de MySQL 5.6. Dans mon prochain blog, nous comparerons la vitesse de sauvegarde/restauration de MySQLdump et de l'utilitaire shell.