Mysqldump é uma ferramenta de backup lógico popular para MySQL que foi originalmente escrita por Igor Romanenko.
Mysqldump executa backups lógicos (conjunto de instruções SQL). Por padrão, mysqldump não despeja tabelas information_schema e nunca leva performance_schema. Mas a principal desvantagem do mysqldump é que ele usa apenas um thread ao fazer backup e restauração. (Mesmo seu servidor tem 64 núcleos). Para superar essa desvantagem, o MySQL introduziu novos utilitários no cliente Shell. Neste blog vou explicar esses novos utilitários de backup.
Visão geral do MySQL Shell
O shell do MySQL é um cliente e editor de código poderoso e avançado para o servidor MySQL. O shell do MySQL 8.0.21 inclui alguns novos utilitários interessantes para criar um dump lógico e fazer uma restauração lógica para toda a instância do banco de dados, incluindo usuários.
O shell do MySQL 8.0.22 incluiu um backup lógico de tabelas específicas e restauração.
Utilitários
- util.dumpInstance() - Despeja uma instância de banco de dados inteira, incluindo usuários
- util.dumpSchemas() - Despeja um conjunto de esquemas
- util.loadDump() - Carrega um dump em um banco de dados de destino
- util.dumpTables() - Carrega tabelas e visualizações específicas.
util.dumpInstance()
O utilitário dumpInstance() irá despejar todos os bancos de dados que são apresentados no diretório de dados do MySQL. Ele excluirá os esquemas information_schema, mysql, ndbinfo, performance_schema e sys ao fazer o dump.
Sintaxe
util.dumpInstance(outputUrl[, options])
Ele irá despejar no sistema de arquivos local, outputUrl é uma string que especifica o caminho para um diretório local onde os arquivos de despejo devem ser colocados. Você pode especificar o caminho absoluto ou um caminho relativo ao diretório de trabalho atual.
Neste utilitário, há uma opção de simulação para inspecionar os esquemas e visualizar os problemas de compatibilidade e, em seguida, executar o dump com as opções de compatibilidade apropriadas aplicadas para remover os problemas.
Opções
Vejamos algumas opções importantes para esse utilitário de despejo.
ocimds :[Verdadeiro | Falso]
Quando esta opção é definida como verdadeira, ela verifica se o dicionário de dados, o dicionário de índice e as opções de criptografia nas instruções CREATE TABLE são comentadas nos arquivos DDL, para garantir que todas as tabelas estejam localizadas no diretório de dados MySQL e use a criptografia de esquema padrão.
E ele verificará quaisquer mecanismos de armazenamento em instruções CREATE TABLE diferentes do InnoDB, para concessões de privilégios inadequados para usuários ou funções e para outros problemas de compatibilidade.
Se qualquer instrução SQL não conforme for encontrada, uma exceção será gerada e o dump será interrompido.
Portanto, sugerimos usar a opção dryRun para listar todos os problemas com os itens no despejo antes que o processo de despejo seja iniciado. Use a opção de compatibilidade para corrigir automaticamente os problemas na saída de despejo.
Observação:esta opção só tem suporte para utilitário de despejo de instância e utilitário de despejo de esquema.
Exemplo 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)
Portanto, temos uma tabela myisam no banco de dados do meu carrinho. A opção de simulação claramente gera o erro.
Se você deseja corrigir esses erros automaticamente em seu arquivo de despejo, passe a opção de compatibilidade como um argumento em seu comando.
Exemplo 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.
Agora o teste está bom e não há exceções. Vamos executar o comando dump instance para fazer um backup de instância.
O diretório de destino deve estar vazio antes que a exportação ocorra. Se o diretório ainda não existir em seu diretório pai, o utilitário o criará.
Exemplo 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
Acima, usamos uma opção de compatibilidade. Então, ao fazer o dump, ele converterá as tabelas myisam em innodb e as armazenará em arquivo.
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 */;
Se você estiver usando mysqldump, ele armazenará a saída em um único arquivo. Mas aqui ele gera mais arquivos como explicaremos a seguir.
Esses são os arquivos disponíveis no diretório de backup.
[[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 arquivo @.json contém detalhes do servidor e lista de usuários, nomes de banco de dados e seus conjuntos de caracteres.
- Este arquivo cart.json contém nomes de funções de visualização, SP, juntamente com a lista de tabelas.
- Estes arquivos @.sql e @.post.sql contêm detalhes da versão do servidor MySQL.
- Este arquivo @.users.sql contém uma lista de usuários do banco de dados.
- Este arquivo [email protected] contém a estrutura da tabela.
- Este arquivo cart.sql contém uma instrução de banco de dados.
- Este arquivo [email protected] contém nomes de colunas e conjuntos de caracteres.
- O arquivo [email protected]@0.tsv.zst.idx é um arquivo binário. Ele armazena estatísticas de índices de tabela.
- O arquivo [email protected]@0.tsv.zst é um arquivo binário e armazena dados.
- Este arquivo @.done.json contém o horário de término do backup e os tamanhos dos arquivos de dados em KB.
util.dumpSchemas()
Ele despejará os esquemas específicos que você menciona nos argumentos para este utilitário.
Sintaxe
util.dumpSchemas(schemas, outputUrl[, options])
Exemplo
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
Se você quiser despejar tabelas específicas, podemos usar o utilitário dumpTables.
Para tabelas maiores, mysqldump levará mais tempo. Use o utilitário dumpTables para reduzir o tempo.
Sintaxe
util.dumpTables(schema, tables, outputUrl[, options])
Exemplo
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
Utilitário de carregamento de despejo
O utilitário de carregamento de despejo fornece fluxo de dados para armazenamento remoto, carregamento paralelo de tabelas ou blocos de tabela, rastreamento de estado de progresso, capacidade de retomar e redefinir e a opção de carregamento simultâneo enquanto o despejo ainda está ocorrendo.
Observação:o utilitário de carregamento de despejo usa a instrução LOAD DATA LOCAL INFILE, portanto, precisamos habilitar esse parâmetro local_infile globalmente durante a importação.
O utilitário de carregamento de dump verifica se a variável de sistema sql_require_primary_key está definida como ON e, se estiver, retorna um erro se houver uma tabela nos arquivos de dump sem chave primária.
Sintaxe
util.loadDump(url[, options])
Exemplo
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.
Por padrão, os índices de texto completo de uma tabela são criados somente depois que a tabela é totalmente carregada, o que acelera a importação.
Você também pode optar por desabilitar a criação de índice durante a importação e criar os índices posteriormente.
O utilitário de carregamento de despejo importa em vários encadeamentos para maximizar o paralelismo. Se os arquivos de despejo foram compactados pelos utilitários de despejo do MySQL Shell, o utilitário de carregamento de despejo trata da descompressão.
Você pode selecionar tabelas ou esquemas individuais para importar ou excluir da importação.
Você pode optar por ignorar o log binário na instância MySQL de destino durante o curso da importação usando uma instrução SET sql_log_bin=0.
Conclusão
Este é um dos utilitários poderosos no MySQL 8.0. Agora é possível fazer dump do MySQL 5.6 e carregar esses dumps no MySQL 5.7 ou 8.0. Mas o despejo de contas de usuário não é suportado ao despejar do MySQL 5.6. No meu próximo blog, vamos comparar a velocidade de backup/restauração do MySQLdump e do utilitário shell.