Nós temos um servidor de banco de dados que estava executando o MySQL 5.0 no Debian etch (!), e decidimos que era hora de atualizar. Agora ele está rodando o 5.1 no Debian squeeze.
Este servidor de banco de dados tem cerca de 1,2 TB de dados MyISAM em uma matriz RAID SATA e 2 GB de RAM. Normalmente, a velocidade não é um fator para as consultas que este servidor executa, é principalmente o material de fundo.
Na atualização, o pacote Debian executou um script de manutenção para atualizar as tabelas, mas está demorando muito tempo para atualizar cada tabela. Por muito tempo, quero dizer que está levando cerca de 18 horas por mesa, e fazer o lote levará algo como 6 semanas na velocidade atual. Este é um grande problema.
Eu tentei aumentar o key_buffer global para 512MB, o que parece estar de acordo com as recomendações, sem efeito.
O problema parece ser que ele está usando o método "Reparar com keycache", que é muito mais lento que o método de classificação:
mysql> show processlist;
+-----+------------------+----------------------------------+------------------+---------+-------+----------------------+--------------------------------------------------------------------------+
| Id | User | Host | db | Command | Time | State | Info |
+-----+------------------+----------------------------------+------------------+---------+-------+----------------------+--------------------------------------------------------------------------+
| 5 | debian-sys-maint | localhost | xxxxxxxxxxxxxxxx | Query | 45146 | Repair with keycache | REPAIR TABLE 'xxxxxxxxxxxxxxxx'.'xxxxxxxxxxxxxxxxxxxx'
Outras tabelas estão inacessíveis devido à necessidade de atualização:
mysql> check table xxxxxxxxxxxxxxxxxxxx fast quick;
+---------------------------------------+-------+----------+---------------------------------------------------------------------------------------------------+
| Table | Op | Msg_type | Msg_text |
+---------------------------------------+-------+----------+---------------------------------------------------------------------------------------------------+
| xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx | check | error | Table upgrade required. Please do "REPAIR TABLE 'xxxxxxxxxxxxxxxxxxxx'" or dump/reload to fix it! |
+---------------------------------------+-------+----------+---------------------------------------------------------------------------------------------------+
1 row in set (1.09 sec)
A questão principal é: como posso atualizar essas tabelas e obter os dados on-line mais rapidamente?
Questões secundárias seriam:
- O uso do myisamchk com algo como "
myisamchk --sort-recover --analyze --sort_buffer_size=256M --key_buffer=256M --read_buffer=2M --write_buffer=2M tablename
" atualiza a tabela (ou seja, não usa o método keycache)?
- Posso matar com segurança o script debian e atualizar as tabelas com um método mais eficiente?
- O servidor foi inicialmente iniciado com um key_buffer_size de apenas 16M. Eu já corrigi isso definindo a variável global, mas é possível que a sessão do script debian ainda esteja usando algum valor menor? Se sim, posso alterá-lo?