Qual é a maneira mais rápida para despejar & carregar um banco de dados MySQL InnoDB usando mysqldump?

StackOverflow https://stackoverflow.com/questions/131085

  •  02-07-2019
  •  | 
  •  

Pergunta

Eu gostaria de criar uma cópia de um banco de dados com cerca de 40 tabelas InnoDB e em torno de 1,5 GB de dados com mysqldump e MySQL 5.1.

O que são os melhores parâmetros (ou seja: --single-transaction)? Que irá resultar no despejo mais rápido e carga dos dados

, bem como, ao carregar os dados para o segundo banco de dados, que é mais rápida a:

1) canalizar os resultados diretamente para a segunda instância do servidor MySQL e utilizar a opção --compress

ou

2) carregá-lo a partir de um arquivo de texto (ou seja: mysql

Foi útil?

Solução

Tubo-lo diretamente para outra instância, para evitar a sobrecarga de disco. Não se preocupe com --compress a menos que você está rodando sobre uma rede lenta, uma vez em uma LAN rápida ou auto-retorno da rede aérea não importa.

Outras dicas

RAPIDAMENTE despejo um banco de dados desativado:

Usando a opção "-t" com resultados mysqldump em lotes de arquivos .sql e .txt no diretório especificado. Esta é ~ 50% mais rápido para despejar grandes mesas que um único arquivo .sql com instruções INSERT (leva 1/3 menos tempo relógio de parede).

Além disso, há um enorme benefício ao restaurar se você pode carregar várias tabelas em paralelo, e saturar múltiplos núcleos. Em uma caixa de 8-core, isso poderia ser tanto quanto uma diferença de 8X em tempo relógio de parede para restaurar o despejo, em cima das melhorias de eficiência fornecidos pelo "-T". Porque "-T" faz com que cada tabela para ser armazenado em um arquivo separado, colocá-los em paralelo é mais fácil do que a divisão distante um ficheiro.sql maciça.

Tomar as estratégias acima para seu extremo lógico, pode-se criar um script para despejar um banco de dados amplamente em paralelo. Bem, isso é exatamente o que o Maakit mk-paralela-dump (ver http: // www .maatkit.org / doc / MK-paralelo-dump.html ) e MK-paralelo restaurar-ferramentas são; scripts perl que fazem várias chamadas para o programa mysqldump subjacente. No entanto, quando eu tentei usá-los, tive problemas para obter a restauração seja concluída sem erros de chaves duplicadas que não ocorreram com lixeiras de baunilha, de modo a manter em mente que sua milhagem pode variar.

Dumping dados de um banco LIVE (w / o interrupção do serviço):

O interruptor --single transação é muito útil para tomar um despejo de um banco de dados ao vivo sem ter que imobilizar-lo ou tomar um despejo de um banco de dados escravo sem ter que slaving parada.

Infelizmente, -T não é compatível com --single transação, para que você só tem uma.

Normalmente, tendo o despejo é muito mais rápido do que restaurá-lo. Ainda há espaço para uma ferramenta que tomar o arquivo de despejo monolítica de entrada e quebra-lo em vários pedaços para ser carregado em paralelo. Para meu conhecimento, essa ferramenta ainda não existe.


Transferir o despejo na rede geralmente é uma vitória

Para ouvir para um dump de entrada em uma corrida host:

nc -l 7878 > mysql-dump.sql

Em seguida, em seu host DB, execute

mysqldump $OPTS | nc myhost.mydomain.com 7878

Isso reduz contenção para os eixos de disco no mestre de escrever o despejo no disco ligeiramente acelerar o seu despejo (assumindo que a rede é rápido o suficiente para manter-se, uma suposição bastante segura para dois hosts no mesmo datacenter). Além disso, se você está construindo um novo escravo, isso poupa a etapa de ter que transferir o arquivo de despejo depois que ele for concluído.

Advertências - obviamente, você precisa de ter o suficiente largura de banda para não abrandar as coisas insuportavelmente, e se as quebras de sessão TCP, você tem que começar tudo de novo, mas para a maioria despeja isso não é uma grande preocupação

.

Por último, gostaria de esclarecer um ponto de confusão comum.

Apesar de quantas vezes você vê essas bandeiras em exemplos mysqldump e tutoriais, eles são supérfluas, porque eles são ativadas por padrão:

  • --opt
  • --add-drop-table
  • --add-locks
  • --create-options
  • --disable-keys
  • --extended-insert
  • --lock-tables
  • --quick
  • --set-charset.

A partir http://dev.mysql.com/doc/refman /5.1/en/mysqldump.html :

O uso de --opt é o mesmo que especificar-drop-table --add, --add-locks, --create-opções,-chaves --disable, --extended-insert, --lock-tables , --quick, e --set-conjunto de caracteres. Todas as opções que --opt defende também estão por padrão porque --opt é ativado por padrão.

desses comportamentos "--quick" é um dos mais importantes (pula cache todo o conjunto de resultados no mysqld antes de transmitir a primeira linha), e pode ser com "mysql" (que não liga --quick em por padrão) para s dramaticamenteacelerar as consultas que retornam um grande conjunto de resultados (por exemplo, de dumping todas as linhas de uma grande mesa).

Eu acho que vai ser muito mais rápido e poupar espaço em disco, se você tentou de replicação de banco de dados em vez de usar mysqldump. Pessoalmente eu uso SQLyog empresa para o meu muito trabalho pesado, mas há também um número de outras ferramentas que pode fornecer os mesmos serviços. a menos que você gostaria de usar somente mysqldump.

Para InnoDB, --order-by-primário --extended-insert é geralmente a melhor combinação. Se a sua após a última gota de desempenho e caixa de destino tem muitos núcleos de CPU, você pode querer dividir o dumpfile resultante e fazer inserções paralelos em muitos tópicos, até innodb_thread_concurrency / 2.

Além disso, ajustar o innodb_buffer_pool_size no alvo ao máximo que você pode pagar, e aumentar innodb_log_file_size a 128 ou 256 MB (cuidado com isso, você precisa remover os antigos arquivos de log antes de reiniciar o daemon mysql caso contrário não irá reiniciar)

Use ferramenta mk-paralela-dump de Maatkit.

Pelo menos isso provavelmente seria mais rápido. Eu confio mysqldump mais.

Com que freqüência você está fazendo isso? É realmente um problema de desempenho do aplicativo? Talvez você deve projetar uma maneira de fazer isso que não precisa despejar os dados inteiros (replicação?)

Por outro lado, 1.5G é um pequeno banco de dados bastante por isso provavelmente não será um grande problema.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top