A maneira mais fácil de desligar o mysql quando isso é simplesmente executar
mysqladmin -uroot -p -h127.0.0.1 --protocol=tcp shutdown
Aqui está o porquê:
O arquivo de serviço mysql ( /etc/init.d/mysql
) depende da presença do arquivo de soquete. Historicamente falando, voltando ao MySQL 4.0, o arquivo de soquete às vezes desaparece inexplicavelmente. Isso dificulta o funcionamento de um padrão service mysql stop
.
Não basta dizer
mysqladmin -uroot -p -h127.0.0.1 shutdown
porque rota mysqld vontade um usuário entrando como root@127.0.0.1
para root@localhost
se TCP / IP não está habilitado explicitamente. Por padrão, o mysqld irá escolher o caminho de menor resistência e se conectar root@127.0.0.1
a root@localhost
via o arquivo socket. No entanto, se não houver arquivo de soquete, root@localhost
nunca se conectará.
Até a documentação do MySQL no mysqladmin diz o seguinte:
Se você executar o desligamento do mysqladmin ao conectar-se a um servidor local usando um arquivo de soquete Unix, o mysqladmin aguardará até que o arquivo de identificação do processo do servidor seja removido, para garantir que o servidor tenha parado corretamente.
É por isso que é essencial habilitar o TCP / IP:
mysqladmin -uroot -p -h127.0.0.1 --protocol=tcp shutdown
Em 30 de setembro de 2011, escrevi minha própria versão do mysqld_multi
chamado mysqlservice
(Veja minha postagem: Executando várias instâncias no mesmo host ). Ele serve como um mecanismo virtual para conectar-se ao mysqld a partir de diferentes portas. Você só precisa criar seus próprios my.cnf
parâmetros personalizados. Nesse script, emito encerramentos como este:
stop() {
${ECHO} -n $"Stopping ${PROGNAME}"
${MYSQLD_STOP}
ATTEMPTS=0
STOPPING_MYSQLD=1
MINUTES_TO_TRY=10
(( TICKS_TO_TRY = MINUTES_TO_TRY*240 ))
while [ ${STOPPING_MYSQLD} -eq 1 ]
do
${ECHO} -n "."
${SLEEP} 0.25
MYSQLD_HAS_BEEN_SHUTDOWN=`${TAIL} ${MYSQL_ERROR_LOG} | ${GREP} -c "Shutdown complete$"`
(( ATTEMPTS++ ))
if [ ${ATTEMPTS} -eq ${TICKS_TO_TRY} ] ; then STOPPING_MYSQLD=0 ; fi
if [ ${MYSQLD_HAS_BEEN_SHUTDOWN} -eq 1 ] ; then STOPPING_MYSQLD=2 ; fi
done
${ECHO}
if [ ${STOPPING_MYSQLD} -eq 2 ]
then
${ECHO} "Stopped ${PROGNAME}"
else
${TAIL} -30 ${MYSQL_ERROR_LOG}
fi
}
Mas o que é isso ${MYSQLD_STOP}
?
MYSQL_CONN="-uroot -p<rootpassword> -P${MYSQLD_PORT} -h127.0.0.1 --protocol=tcp"
MYSQLD_STOP="${MYSQLADMIN} ${MYSQL_CONN} shutdown"
Observe que eu uso 127.0.0.1
e uma porta explícita. Dessa forma, não estou confiando em um arquivo de soquete.
Eu sempre usei mysqladmin --protocol=tcp shtudown
como a alternativa adequada para desligamentos do mysql se service mysql stop
travar. Fazendo kill -9
em mysqld
e mysqld_safe
deve ser o último dos últimos dos últimos resorts. (Sim, eu disse três vezes).
Muitas vezes, o mysqld excluiu o mysql.sock sem aviso. Outras pessoas também tiveram esse problema ao longo dos anos:
EPÍLOGO
O segredo é exatamente como afirmei: Conecte-se ao mysql usando o mysqladmin via TCP / IP ( --protocol=tcp
) e emita-o shutdown
. Isso tem que funcionar porque o privilégio de encerramento é mysql.user
para o objetivo exclusivo de encerramentos autenticados. Isso salvou meu dia de trabalho algumas vezes quando pude emitir um desligamento remoto da minha máquina Windows ao desligar o mysqld em um servidor Linux.
ATUALIZAÇÃO 06-03-2013 22:48 EST
Se você está preocupado com o que está acontecendo durante o desligamento, existe uma maneira de manipular o tempo de desligamento e a maneira como os dados são liberados para o disco, especialmente se você tiver muitos dados do InnoDB no Buffer Pool
SUGESTÃO # 1
Se você tiver muitas páginas sujas, poderá reduzir o innodb_max_dirty_pages_pct para 0:
SET GLOBAL innodb_max_dirty_pages_pct = 0;
Defina isso de 15 a 30 minutos antes do desligamento. Isso dará ao mysqld a menor quantidade possível de páginas sujas para gravar no disco.
SUGESTÃO # 2
Por padrão, innodb_fast_shutdown é 1. Existem três valores para esta opção
- 0: O InnoDB faz um desligamento lento, uma limpeza completa e um buffer de inserção mesclados antes de desligar.
- 1: O InnoDB ignora essas operações no desligamento, um processo conhecido como desligamento rápido.
- 2: O InnoDB limpa seus logs e desliga, como se o MySQL tivesse travado; nenhuma transação confirmada é perdida, mas a operação de recuperação de falhas leva a próxima inicialização a demorar mais tempo.
A documentação ainda diz o seguinte:
O desligamento lento pode levar minutos ou até horas em casos extremos em que quantidades substanciais de dados ainda são armazenadas em buffer. Use a técnica de desligamento lento antes de atualizar ou fazer o downgrade entre as principais versões do MySQL, para que todos os arquivos de dados sejam totalmente preparados, caso o processo de atualização atualize o formato do arquivo.
Use innodb_fast_shutdown = 2 em situações de emergência ou solução de problemas, para obter o encerramento mais rápido possível se os dados estiverem em risco de corrupção.
Os padrões para innodb_max_dirty_pages_pct e innodb_fast_shutdown devem estar bem na maioria dos casos.
tmpwatch
exclui, juntamente com tudo o mais/tmp
que possui um atime mais antigo que o limite configurado.