Importação lenta de banco de dados MySQL com mysqldump e USE .. SOURCE

8

Eu tenho cerca de 12 tabelas no MySQL innoDB, uma delas possui 11 milhões de registros.

Eu usei este comando para fazer backup de coisas:

mysqldump -u [USERNAME] -p [DBNAME] | gzip > [/path_to_file/DBNAME].sql.gz

E este comando para importar coisas no novo servidor:

USE [DBNAME];
SOURCE [/path_to_file/DBNAME].sql;

Aqui está a dor pela qual estou aflito (o tempo está aumentando a cada consulta!):

insira a descrição da imagem aqui

O que posso fazer para acelerar as coisas? Há algo de errado com o meu comando mysqldump?

Kirk Ouimet
fonte

Respostas:

5

Para seu comando dump , você pode usar o seguinte

mysqldump --single-transaction --extended-insert -u [USERNAME] -p [DBNAME] | gzip > [/path_to_file/DBNAME].sql.gz

Pastilhas estendidas são melhores.

http://dev.mysql.com/doc/refman/5.1/en/mysqldump.html#option_mysqldump_single-transaction A opção Transação única é melhor para descartar tabelas do InnoDB.

No seu arquivo my.cnf , faça as seguintes alterações temporariamente

http://dev.mysql.com/doc/refman/5.0/en/innodb-parameters.html#sysvar_innodb_doublewrite

innodb_doublewrite = 0

e também

http://dev.mysql.com/doc/refman/5.0/en/innodb-parameters.html#sysvar_innodb_flush_log_at_trx_commit

innodb_flush_log_at_trx_commit = 2

Reinicie o MySQL e remova essas opções após a importação e reinicie o MySQL novamente.

Tabelas de memória

Se o banco de dados inteiro puder caber na memória, você poderá alterar o ENGINE = InnoDB para ENGINE = MEMORY no arquivo sql de despejo para todas as tabelas ou apenas as tabelas que demoram mais para importar, importe o arquivo de despejo de volta para o banco de dados e depois mude o mecanismo de volta para innodb.

ALTER TABLE name_of_table ENGINE = InnoDB;

comando mysqlimport

http://linux.die.net/man/1/mysqlimport

Eu usei o mysqlimport para importar dados armazenados em backup usando a opção de formato de guia no mysqldump. Provou ser mais rápido do que importar através do comando mysql.

Despejar o banco de dados usando mysqldump

mysqldump --tab = / algum_diretório / -u [USERNAME] -p [DBNAME] [TABLENAME]

Importe os dados para o seu banco de dados.

mysqlimport -u [USERNAME] -p [DBNAME] /some_directory/tablename.sql

Craig Efrein
fonte
5

O carregamento em massa do InnoDB pode ser muito assustador se você não tiver o InnoDB ajustado corretamente.

Aqui estão as configurações com as quais você precisa se preocupar:

Até metade do buffer pool pode ser usado para inserções em massa. Isso empurra os dados em cache. Durante a recarga de um mysqldump nas tabelas do InnoDB, o Buffer Pool se torna uma zona de guerra aberta entre os dados recém-carregados do InnoDB e muda para índices secundários. À luz disso, aumentar innodb_buffer_pool_sizee innodb_log_file_sizeé vital e imperativo.

Além disso, verifique se eles estão ativados. Um mysqldump deve ter essas variáveis ​​definidas como 0.

UNIQUE_CHECKS=0;
FOREIGN_KEY_CHECKS=0;

Você pode verificar isso com um simples head -20no arquivo mysqldump.

Há mais um aspecto de importação: innodb_change_buffering

De acordo com a documentação do MySQL , você pode ditar o que é armazenado em buffer durante qualquer operação DML. Para obter esclarecimentos completos sobre isso, consulte Controlando o InnoDB Change Buffering .

Eu recomendo as seguintes configurações:

[mysqld]
innodb_buffer_pool_size=2G
innodb_log_file_size=512M
innodb_read_io_threads=64
innodb_write_io_threads=64
innodb_io_capacity=5000
innodb_thread_concurrency=0
RolandoMySQLDBA
fonte