Como posso acelerar uma restauração do MySQL a partir de um arquivo de despejo?


28

Estou restaurando um banco de dados de 30 GB de um arquivo mysqldump para um banco de dados vazio em um novo servidor. Ao executar o SQL a partir do arquivo de despejo, a restauração é iniciada muito rapidamente e começa a ficar cada vez mais lenta. Agora, as inserções individuais estão demorando mais de 15 segundos. As tabelas são principalmente MyISAM com um pequeno InnoDB. O servidor não possui outras conexões ativas. SHOW PROCESSLIST;mostra apenas a inserção da restauração (e a própria lista de processos da mostra).

Alguém tem alguma idéia do que poderia estar causando a desaceleração dramática?

Existem variáveis ​​do MySQL que posso alterar para acelerar a restauração enquanto ela está progredindo?


Editado para corrigir os tipos de tabela
Dave Forgac

Respostas:


26

Uma coisa que pode estar retardando o processo é o key_buffer_size , que é o tamanho do buffer usado para blocos de índice. Ajuste isso para pelo menos 30% da sua RAM ou o processo de re-indexação provavelmente será muito lento.

Para referência, se você estivesse usando o InnoDB e chaves estrangeiras, também poderia desativar as verificações de chave estrangeira e reativá-la no final (usando SET FOREIGN_KEY_CHECKS=0e SET FOREIGN_KEY_CHECKS=1).


11
Eu encontrei duas coisas: o key_buffer_size foi definido como 8 MB e havia uma tabela do InnoDB no mix com chaves estrangeiras. Aumentou o key_buffer_size para 1 GB e desativou temporariamente as verificações de chave estrangeira. A restauração terminou em 5 minutos. Obrigado!
Dave Forgac

Uau! Fico feliz que ajudou :) #
2813 Marco Ramos

2
Acabei de perceber que digitei '5' minutos. Tenho certeza de que era mais como 50 minutos, mas ainda muito mais razoável ;-)
Dave Forgac

5
key_buffer_size é para MYISAM.
Fernando Fabreti 03/04

@FernandoFabreti - que é um ponto importante para muitos leitores, mas o OP tenha especificado que tinha principalmente MyISAM
mc0e

22

Este link mostra o que se pode fazer para acelerar o processo de restauração.

http://dev.mysql.com/doc/refman/5.5/en/optimizing-innodb-bulk-data-loading.html

Pode-se colocar os comandos no topo do arquivo de despejo

SET @OLD_AUTOCOMMIT=@@AUTOCOMMIT, AUTOCOMMIT = 0;
SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS = 0;
SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS = 0;

E coloque essas instruções no final do arquivo de despejo

SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS;
SET UNIQUE_CHECKS=@OLD_UNIQUE_CHECKS;
SET AUTOCOMMIT = @OLD_AUTOCOMMIT;
COMMIT;

Isso funcionou para mim. Restauração feliz :-)


8
Isso ajudou bastante. Em vez de editar o arquivo, eu criei pre.sql e post.sql dos trechos acima e usou isso para restaurar o db:cat pre.sql dump.sql post.sql | mysql ...
Jason R. Coombs

1

A única razão pela qual posso imaginar por que a restauração diminuiria gradualmente é a indexação. Investigue a desativação da indexação até o final e deixe fazer todo o lote de uma só vez.


1

Se você tiver a cópia física do arquivo de despejo (o diretório DB), poderá copiá-lo para o novo servidor se o novo servidor tiver a mesma versão do MySQL e funcionar corretamente. Isso funciona bem com o MyISAM e, para mim, acho melhor do que restaurar os dados com base no arquivo lógico de despejo SQL.


0

se você tiver várias tabelas, é provável que você se beneficie do mk-parallel-restore .


Agora isso foi descontinuado e deve ser usado apenas para restaurar dados de teste, não para restaurar backups reais.
svandragt

0

Isso fará:

mysql --init-command = "SET SESSION FOREIGN_KEY_CHECKS = 0; SET UNIQUE_CHECKS = 0;" -u raiz -p <Backup_Database.mysql


-1

Eu sugeri você,

  1. Verifique suas tabelas: Possui gatilhos? Limpar todos os gatilhos
  2. SET: AUTOCOMMIT=0, UNIQUE_CHECKS=0, FOREIGN_KEY_CHECKS=0( e não se esqueça de reverter isso muda )
  3. USE LINHA DE COMANDO COMO mysql -u root -pPasss requests < mydb.sql
  4. Verifique o tamanho do arquivo do banco de dados

Boa sorte

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.