sql >> Base de Datos >  >> RDS >> Mysql

Copias de seguridad de bases de datos lógicas mediante MySQL Shell

Mysqldump es una popular herramienta de copia de seguridad lógica para MySQL que fue escrita originalmente por Igor Romanenko.

Mysqldump realiza copias de seguridad lógicas (conjunto de sentencias SQL). Por defecto, mysqldump no volca tablas de esquema_información y nunca toma esquema_rendimiento. Pero el principal inconveniente de mysqldump es que utiliza solo un subproceso mientras realiza la copia de seguridad y la restauración. (Incluso su servidor tiene 64 núcleos). Para superar este inconveniente, MySQL introdujo nuevas utilidades en el cliente Shell. En este blog voy a explicar estas nuevas utilidades de copia de seguridad.

Descripción general de MySQL Shell 

El shell MySQL es un potente y avanzado cliente y editor de código para el servidor MySQL. MySQL shell 8.0.21 incluye algunas utilidades nuevas e interesantes para crear un volcado lógico y realizar una restauración lógica para toda la instancia de la base de datos, incluidos los usuarios.

MySQL shell 8.0.22 incluía una copia de seguridad lógica de tablas específicas y restauración.

Utilidades 

  • util.dumpInstance() - Vuelca una instancia de base de datos completa, incluidos los usuarios
  • util.dumpSchemas() - Vuelca un conjunto de esquemas
  • util.loadDump() - Carga un volcado en una base de datos de destino
  • util.dumpTables() - Carga tablas y vistas específicas.

util.dumpInstance()

La utilidad dumpInstance() volcará todas las bases de datos que se presentan en el directorio de datos de MySQL. Excluirá los esquemas information_schema, mysql, ndbinfo, performance_schema y sys mientras realiza el volcado.

Sintaxis 

util.dumpInstance(outputUrl[, options]) 

Volcará al sistema de archivos local, outputUrl es una cadena que especifica la ruta a un directorio local donde se colocarán los archivos de volcado. Puede especificar la ruta absoluta o una ruta relativa al directorio de trabajo actual.

En esta utilidad, hay una opción de ejecución en seco para inspeccionar los esquemas y ver los problemas de compatibilidad, luego ejecutar el volcado con las opciones de compatibilidad apropiadas aplicadas para eliminar los problemas.

Opciones 

Veamos algunas opciones importantes para esta utilidad de volcado.

ocimds:[Verdadero | falso]

Cuando esta opción se establece en verdadero, verificará que el diccionario de datos, el diccionario de índice y las opciones de cifrado en las declaraciones CREATE TABLE estén comentadas en los archivos DDL, para asegurarse de que todas las tablas estén ubicadas en el directorio de datos MySQL y utilice el cifrado de esquema predeterminado.

Y verificará cualquier motor de almacenamiento en declaraciones CREATE TABLE que no sea InnoDB, para otorgar privilegios inadecuados a usuarios o roles, y para otros problemas de compatibilidad.

Si se encuentra alguna instrucción SQL no conforme, se genera una excepción y se detiene el volcado.

Por lo tanto, sugerimos usar la opción dryRun para enumerar todos los problemas con los elementos en el volcado antes de que se inicie el proceso de volcado. Use la opción de compatibilidad para corregir automáticamente los problemas en la salida del volcado.

Nota:esta opción solo es compatible con la utilidad de volcado de instancia y la utilidad de volcado de esquema.

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

Así que tenemos una tabla myisam en la base de datos de mi carrito. La opción de ejecución en seco arroja claramente el error.

Si desea corregir estos errores automáticamente en su archivo de volcado, pase la opción de compatibilidad como argumento en su comando.

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

Ahora el simulacro está bien y no hay excepciones. Ejecutemos el comando de instancia de volcado para realizar una copia de seguridad de la instancia.

El directorio de destino debe estar vacío antes de que se realice la exportación. Si el directorio aún no existe en su directorio principal, la utilidad lo crea.

Ejemplo 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

Arriba hemos usado una opción de compatibilidad. Entonces, mientras realiza el volcado, convertirá las tablas myisam en innodb y las almacenará en un archivo.

Registros 

[[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 está utilizando mysqldump, almacenará la salida en un solo archivo. Pero aquí genera más archivos como explicaremos a continuación.

Estos son los archivos disponibles en el directorio de copia de seguridad.

[[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
  • Este archivo @.json contiene detalles del servidor y una lista de usuarios, nombres de bases de datos y sus conjuntos de caracteres.
  • Este archivo cart.json contiene vistas, SP, nombres de funciones junto con la lista de tablas.
  • Estos archivos @.sql y @.post.sql contienen detalles de la versión del servidor MySQL.
  • Este archivo @.users.sql contiene una lista de usuarios de la base de datos.
  • Este archivo [email protected] contiene una estructura de tabla.
  • Este  archivo cart.sql contiene una declaración de base de datos.
  • Este archivo [email protected] contiene nombres de columnas y conjuntos de caracteres.
  • El archivo [email protected]@0.tsv.zst.idx es un archivo binario. Almacena estadísticas de índices de tablas.
  • El archivo [email protected]@0.tsv.zst es un archivo binario y almacena datos.
  • Este archivo @.done.json contiene la hora de finalización de la copia de seguridad y el tamaño de los archivos de datos en KB.

util.dumpSchemas()

Volcará los esquemas específicos que mencionas en los argumentos de esta utilidad.

Sintaxis 

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

Ejemplo 

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 desea volcar tablas específicas, podemos usar la utilidad dumpTables.

Para las tablas más grandes, mysqldump llevará más tiempo. Use la utilidad dumpTables para reducir el tiempo.

Sintaxis 

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

Ejemplo 

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 

Utilidad de carga de volcado 

La utilidad de carga de volcado proporciona transmisión de datos a almacenamiento remoto, carga paralela de tablas o fragmentos de tablas, seguimiento del estado de progreso, capacidad de reanudar y restablecer, y la opción de carga simultánea mientras se realiza el volcado.

Nota:La utilidad de carga de volcado usa la declaración LOAD DATA LOCAL INFILE, por lo que debemos habilitar este parámetro local_infile globalmente durante la importación.

La utilidad de carga de volcado comprueba si la variable del sistema sql_require_primary_key está activada y, si lo está, devuelve un error si hay una tabla en los archivos de volcado sin clave principal.

Sintaxis 

util.loadDump(url[, options])

Ejemplo 

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.

De forma predeterminada, los índices de texto completo para una tabla se crean solo después de que la tabla se haya cargado por completo, lo que acelera la importación.

También puede optar por deshabilitar la creación de índices durante la importación y crear los índices después.

La utilidad de carga de volcado importa a través de múltiples subprocesos para maximizar el paralelismo. Si los archivos de volcado fueron comprimidos por las utilidades de volcado de MySQL Shell, la utilidad de carga de volcado maneja la descompresión.

Puede seleccionar tablas o esquemas individuales para importar o excluir de la importación.

Puede optar por omitir el registro binario en la instancia de MySQL de destino durante el curso de la importación mediante una instrucción SET sql_log_bin=0.

Conclusión

Esta es una de las poderosas utilidades de MySQL 8.0. Ahora es posible volcar desde MySQL 5.6 y cargar estos volcados en MySQL 5.7 u 8.0. Pero no se admite el volcado de cuentas de usuario cuando se volca desde MySQL 5.6. En mi próximo blog, compararemos la velocidad de respaldo/restauración de MySQLdump y la utilidad de shell.