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?

Dave Forgac
fonte
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).

Marco Ramos
fonte
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 :-)

Alfaiate de Dharmesh
fonte
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.

John Gardeniers
fonte
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.

usef_ksa
fonte
0

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

pQd
fonte
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

Matiss
fonte
-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

Ferhat KOÇER
fonte