Eu gostaria de reiniciar o mysql graciosamente como httpd onde os threads são servidos antes da reinicialização. Eu não gostaria de quebra de consultas.
relate perguntas
-
Existem ferramentas de benchmarking do MySQL? [fechado]
-
Onde posso encontrar o log lento do mysql?
-
Como posso otimizar um mysqldump de um banco de dados grande?
-
Quando é o momento certo para usar o MariaDB em vez do MySQL e por quê?
-
Como um grupo pode rastrear alterações no esquema do banco de dados?
Qualquer sequência de desligamento "solicitada" no MySQL (abreviação de
kill -9
) é um pouco graciosa , uma vez que as transações em andamento (em tabelas transacionais) são revertidas, mas aqui estão algumas maneiras de fazer uma reinicialização o mais limpa possível.Observação: se você estiver desligando o servidor para uma atualização, não use esse processo; em vez disso, siga o processo detalhado nesta resposta .
Caso contrário, se você estiver apenas reiniciando um servidor íntegro para poder alterar uma variável global somente leitura ou algo semelhante, aqui está um caminho simples:
Primeiro, habilite
innodb_fast_shutdown
se ainda não estiver. Isso não está diretamente relacionado à graça do desligamento, mas deve trazer seu servidor de volta mais rapidamente.Em seguida, instrua o servidor a fechar todas as tabelas abertas assim que nenhuma consulta em execução estiver fazendo referência a elas. Esta etapa também não tem nada a ver com o desligamento normal, mas fará com que a etapa subsequente seja mais rápida:
A
FLUSH TABLES
instrução (com aLOCAL
palavra-chave opcional, que evita uma liberação desnecessária, mas inofensiva de quaisquer escravos) será bloqueada e seu prompt não retornará até que todas as tabelas possam ser fechadas. Depois que cada tabela for "limpa" (fechada), se uma consulta fizer referência subsequente à tabela, ela será reaberta automaticamente, mas tudo bem. O que estamos conseguindo com esta etapa é dar menos trabalho para a etapa final:Essa instrução libera todas as tabelas (daí a vantagem de eliminar algumas delas de maneira menos perturbadora com a etapa anterior) e adquire um bloqueio somente leitura global (em todo o servidor).
Você não pode ter um bloqueio de leitura global até que todas as consultas de "gravação" em execução (ou seja, praticamente tudo, exceto
SELECT
) sejam concluídas. A emissão da solicitação de bloqueio permitirá que as consultas existentes sejam concluídas, mas não permitirá que novas sejam iniciadas.Seu prompt não retorna até que você mantenha esse bloqueio global, portanto, todas as consultas que estão em andamento quando você solicita o bloqueio podem ser concluídas e você sabe que elas terminaram, porque você recebe o prompt de volta. Quaisquer consultas subsequentes que tentarem escrever qualquer coisa em qualquer tabela irão parar, sem alterar nenhum dado, esperando indefinidamente pelo bloqueio, até que...
UNLOCK TABLES;
)Resista à tentação de fechar isso.
Este prompt do console ocioso é o que está mantendo o bloqueio global para você. Perca isso, perca o cadeado.
De outra janela do console, reinicie o MySQL da maneira que você faria normalmente, seja com scripts de inicialização (por exemplo, sua variante local de
service mysql.server restart
) ou commysqladmin shutdown
seguido de uma reinicialização manual.Resumindo, algumas das melhores práticas que devem ser consideradas antes de encerrar o MySQL são:
mysql> STOP SLAVE;
.mysql> SET GLOBAL innodb_max_dirty_pages_pct = 0;
.mysql> SHOW PROCESSLIST;
, mate-asmysql> kill thread_id;
ou espere até que terminem.mysql> SET GLOBAL innodb_buffer_pool_dump_at_shutdown = ON;
e recarregue-o na inicialização# vi /etc/my.cnf innodb_buffer_pool_load_at_startup = ON
para aquecer o buffer pool.Então, depois de confirmar os pontos anteriores, você pode reiniciar o MySQL com segurança
shell$ service mysql restart
Para mais detalhes, veja meu post Verifique isso antes de desligar o MySQL!