Pergunta

Eu tenho uma tabela MyISAM em execução na produção em MySQL, e fazendo alguns testes, descobrimos que podemos tremendamente acelerar uma consulta pela adição de um determinado índice composto. Por enquanto, tudo bem. No entanto, eu não sou realmente sobre a melhor maneira de adicionar este índice em um ambiente de produção sem bloquear a tabela por um longo tempo (é 27GBs de dados tem, por isso, não tanto, mas faz exame de um tempo).

Você tem alguma dica? Se esta era uma configuração mais sofisticada, é claro que teríamos uma réplica ao vivo de todos os dados em outra máquina, e nós poderíamos mudar com segurança. Infelizmente, nós não estamos lá ainda, e eu gostaria de acelerar esta consulta o mais rápido possível (que está causando grandes dores de cabeça do cliente). Existe alguma maneira simples para replicar os dados e, em seguida, fazer um truque de swap-out? Alguns outros truques que eu estou ausente?

UPDATE: Reading sobre "Operações de Índice Online" no SQL Server faz-me muito ciumento http://msdn.microsoft.com/en-us/library/ms191261.aspx :)

Obrigado!

Foi útil?

Solução

Você pode usar a replicação para obter o tempo de inatividade da ordem de alguns minutos, em vez das horas pode demorar para criar um índice na tabela.

para configurar o escravo, consulte http: //dev.mysql.com/doc/refman/5.0/en/replication-howto-existingdata.html

uma recomendação que eu posso fazer para ajudar a acelerar o processo é no passo 2 seguir o "Criando um instantâneo de dados utilizando matérias Arquivos de Dados" método. mas em vez de copiar sobre o fio para o escravo, copie para um local diferente no master. e trazer o mestre de volta o mais rápido na cópia é feita e você fez as alterações necessárias no arquivo de configuração (set server-id e permitiu que o log binário). isso irá minimizar o tempo de inatividade para apenas um minuto ou dois. uma vez que o servidor está de volta, você pode copiar os arquivos copiados para a caixa de escravo.

Uma vez que você tem o escravo instalado e funcionando e você tem verified tudo está replicando corretamente , você pode pausar o escravo. criar o índice na pomada. quando a criação do índice estiver completa, retomar o escravo. este vai apanhar o escravo até o mestre. no master, use a tabela alinhada com READ LOCK. verificar o status escravo para certificar-se da posição log no mestre eo jogo escravo. se o fizerem, encerre o escravo e copiar os arquivos para que a tabela de volta para o mestre.

Outras dicas

Eu estou com Randy. Nós estivemos em uma situação semelhante, e há duas maneiras em MySQL para realizar algo como isto:

  1. Derrubar o servidor enquanto ele é executado. Isto é o que você provavelmente vai fazer. É simples, é fácil, ele funciona. Hora de fazer? Talvez meia hora / 45 minutos, dependendo da largura de banda de disco. Veja abaixo.

  2. Faça uma nova tabela com o novo índice, copiar todos os dados sobre, pause o servidor exclua a primeira tabela, alterar o novo para o antigo nome, inicie o servidor. Tempo de inatividade? 10 minutos, talvez, mas realmente complicado.

Opção duas obras, e poupa o tempo de inatividade de criar o índice (se ele leva um longo tempo). Mas é preciso mais espaço, é mais complicado (desde que você tem que lidar com os novos registros inseridos fora da mesa principal, e ele provavelmente irá bloquear MyISAM ao copiar os dados para fora. Excluindo uma tabela vai demorar algum tempo, alterando a tabela para o novo nome vai demorar algum tempo. é realmente muito complicado. Se você tinha uma mesa de 2TB isso pode ser útil, mas para 27G é provavelmente um exagero.

Você tem um segundo servidor que está perto nas especificações para o seu servidor de produção? Carregar o seu backup mais recente e fazer o índice lá, assim que você sabe sobre quanto tempo vai demorar para adicionar. Em seguida, planejar o tempo de inatividade.

InnoDB é melhor sobre muitas coisas, mas novos índices ainda bloquear a tabela. Essas habilidades que MSSQL (e eu acho PostgreSQL) tem que fazer esse tipo de coisas sem bloqueio seria ótimo.

Encontre o seu janela de baixo uso e tomar o seu aplicativo offline durante a construção do índice. Desde que você não tem replicação ou um de vários mestres ou qualquer outra coisa, você só vai ter que morder a bala em um presente. Vê-lo em 1h. : -)

Não há muito que pode fazer com um servidor aqui.

Se você copiar a tabela e fazer uma seco prazo, pelo menos você vai saber quanto tempo isso vai levar, sem bloquear a tabela ao vivo, para que possa agendar algum tempo de manutenção se necessário, ou tomar uma decisão se você puder basta apertar o botão os usuários e deixar pendurado por um par de minutos:)

Ou programá-lo para um tempo de silêncio ...

at 04:00 /usr/bin/mysql -uXXX -pXXX -e 'alter table mytable add key(col1, col2)'
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top