atualmente estou migrando um banco de dados DB2 para MySQL, usando a ferramenta SQL WORKBENCH
Ele basicamente seleciona do DB2 e insere no DB2.
Funciona bem, mas nas tabelas com colunas longblob ou longtext (para armazenar xml ou imagens) leva muito tempo. (cerca de 40 horas para uma tabela de 10 milhões de linhas).
Fatos:
Servidor: 2CPU CORES e 8GB de RAM SO: Linux RHEL 6.5
Servidor MySQL 5.6.13
As tabelas são InnoDB.
O servidor MySQL e a ferramenta de migração estão no mesmo computador, portanto não há sobrecarga de rede.
As tabelas no MySQL possuem CHAVES PRIMÁRIAS, mas nenhum outro índice.
Desativei o log binário para a inserção massiva.
Eu configurei a ferramenta de migração para fazer uma inserção em lote de 10
linhas e confirmar cada inserção (10 linhas).
Duas perguntas aqui:
- Quais são os valores recomendados para o tamanho do batch insert, considerando o tamanho das colunas (longtext, longblob)?
- Existe algum ajuste recomendado no my.cnf para melhorar o desempenho da inserção?
Aqui está o conteúdo do arquivo my.cnf:
[mysqld]
open_files_limit=2048
table_open_cache=1024
query_cache_type=1
query_cache_size=64M
tmp_table_size=32M
thread_cache_size=9
default-storage-engine=INNODB
back_log=80
flush_time=0
join_buffer_size=1M
max_allowed_packet=1G
max_connect_errors=100
sort_buffer_size=256K
table_definition_cache=1400
binlog_row_event_max_size=8K
log-bin
log_bin_trust_function_creators=1
#INNODB
innodb_additional_mem_pool_size=8M
innodb_flush_log_at_trx_commit=1
innodb_data_file_path = ibdata1:5G:autoextend
innodb_log_buffer_size=16M
innodb_buffer_pool_size=6144M
innodb_log_file_size=1GB
innodb_thread_concurrency=3
innodb_autoextend_increment=64
innodb_concurrency_tickets=5000
innodb_old_blocks_time=1000
innodb_open_files=300
innodb_stats_on_metadata=0
innodb_file_per_table=1
innodb_checksum_algorithm=0
Arquitetura InnoDB (de Percona CTO Vadim Tkachenko)
Apr 20, 2011
: MySQL apresenta erro "Sem memória" ao inserir um arquivo grande. De onde vem essa limitação de tamanho de arquivo?Apr 27, 2011
: Alterado max_allowed_packet e ainda recebendo o erro 'Pacote muito grande'Aug 01, 2011
: Como max_allowed_packet afeta o backup e a restauração de um banco de dados?Alterações propostas
DE UMA CHANCE !!!
As ideias de Roland são boas. Também
query_cache
; é sobrecarga não utilizada. (_type=0
,_size=0
)log-bin
(não adianta escrever um binlog; se algo travar muito, comece de novo)innodb_flush_log_at_trx_commit=2
-- para diminuir a frequência de gravação no log de transaçõesinnodb_file_per_table = ON
-- diante de vocêCREATE
a(s) mesa(s). (Você vai me agradecer muito mais tarde.)Novamente, essas configurações não são necessariamente "certas" para produção.