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.