Eu instalei o mysql e o servidor via yum no meu servidor 64 bits do CentOS 5. Ele começa bem, mas quando eu tento pará-lo, ele pára e então eu tenho que "Ctrl-C". Então eu corro um "status do serviço mysqld" e ele mostra:
mysqld dead but subsys locked
Eu corro ps aux e o mysql não está em lugar nenhum. Iniciando o mysqld novamente via "service mysqld start" funciona bem. A tentativa de pará-lo cria o mesmo problema.
Eu percebi que /var/lock/subsys/mysqld
ainda existe. Ao executar o mysqld, eu verifiquei o /var/run/mysqld/mysqld.pid
e ele correspondeu com o pid do serviço em execução.
Eu tentei reinstalar o mysql e excluir todos os arquivos e configurações, mas sem sucesso.
O que fazer?
EDITAR:
Eu adicionei algumas instruções echo no arquivo /etc/init.d/mysqld, particularmente na função stop:
stop(){
if [ ! -f "$mypidfile" ]; then
# not running; per LSB standards this is "ok"
action $"Stopping $prog: " /bin/true
return 0
fi
echo "beginning stop sequence"
MYSQLPID='cat "$mypidfile"'
if [ -n "$MYSQLPID" ]; then
/bin/kill "$MYSQLPID" >/dev/null 2>&1
echo "killing pid $MYSQLPID"
ret=$?
if [ $ret -eq 0 ]; then
echo "return code $ret after kill attempt"
TIMEOUT="$STOPTIMEOUT"
echo "timeout is set to $STOPTIMEOUT"
while [ $TIMEOUT -gt 0 ]; do
/bin/kill -0 "$MYSQLPID" >/dev/null 2>&1 || break
sleep 1
let TIMEOUT=${TIMEOUT}-1
echo "timeout is now $TIMEOUT"
done
if [ $TIMEOUT -eq 0 ]; then
echo "Timeout error occurred trying to stop MySQL Daemon."
ret=1
action $"Stopping $prog: " /bin/false
else
echo "attempting to del lockfile: $lockfile"
rm -f $lockfile
rm -f "$socketfile"
action $"Stopping $prog: " /bin/true
fi
else
action $"Stopping $prog: " /bin/false
fi
else
# failed to read pidfile, probably insufficient permissions
action $"Stopping $prog: " /bin/false
ret=4
fi
return $ret
}
Este é o resultado que recebo quando tento parar o serviço:
[root@server]# service mysqld stop
beginning stop sequence
killing pid 9145
return code 0 after kill attempt
timeout is set to 60
timeout is now 59
timeout is now 58
timeout is now 57
timeout is now 56
timeout is now 55
timeout is now 54
timeout is now 53
timeout is now 52
timeout is now 51
timeout is now 50
timeout is now 49
Ao olhar para o código, parece-me que ele nunca sairá desse loop while e não será capaz de excluir o arquivo de bloqueio. Estou interpretando isso errado? Eu verifiquei o mesmo arquivo no meu outro servidor e ele usa o mesmo código. Estou perplexo.
EDITAR :
Na parte do loop while
/bin/kill -0 "$MYSQLPID" >/dev/null 2>&1 || break
Por algum motivo, não está reconhecendo o código de retorno. Quando o serviço mysqld stop é chamado, o processo já foi eliminado, mas não tem certeza porque não está permitindo que o loop seja interrompido.
EDITAR :
Testes adicionais mostram algum comportamento estranho entre chamar /bin/kill
e apenas chamar kill
, eles aparentemente retornam códigos diferentes, por que ??????:
[root@server]# /bin/kill 25200
kill 25200: No such process
[user@server]# echo ${?}
0
[root@server]# kill 25200
-bash: kill: (25200) - No such process
[root@server]# echo ${?}
1
EDIT : Eu fiz logon como usuário não-root e tentei executar "kill" e "/ bin / kill" com resultados surpreendentes:
[notroot@server ~]$ kill -0 23232
-bash: kill: (23232) - No such process
[notroot@server ~]$ echo $?
1
[notroot@server ~]$ /bin/kill -0 23232
kill 23232: No such process
(No info could be read for "-p": geteuid()=501 but you should be root.)
[notroot@server ~]$ echo $?
0
O erro "Nenhuma informação pôde ser lida" não aparece em meus outros servidores ao executar kill e bin / kill como um usuário não root.
EDIT : Adicionado o registro descrito por quanta e também verificado o log do mysql:
Depois de iniciar e parar, o log do mysql mostra isso:
110918 00:11:28 mysqld_safe Starting mysqld daemon with databases from /var/lib/mysql
110918 0:11:28 [Note] Plugin 'FEDERATED' is disabled.
110918 0:11:28 InnoDB: Initializing buffer pool, size = 16.0M
110918 0:11:28 InnoDB: Completed initialization of buffer pool
110918 0:11:29 InnoDB: Started; log sequence number 0 44233
110918 0:11:29 [Warning] 'user' entry 'root@server' ignored in --skip-name-resolve mode.
110918 0:11:29 [Warning] 'user' entry '@server' ignored in --skip-name-resolve mode.
110918 0:11:29 [Note] Event Scheduler: Loaded 0 events
110918 0:11:29 [Note] /usr/libexec/mysqld: ready for connections.
Version: '5.1.58-ius' socket: '/var/lib/mysql/mysql.sock' port: 3306 Distributed by The IUS Community Project
110918 0:11:34 [Note] /usr/libexec/mysqld: Normal shutdown
110918 0:11:34 [Note] Event Scheduler: Purging the queue. 0 events
110918 0:11:34 InnoDB: Starting shutdown...
110918 0:11:39 InnoDB: Shutdown completed; log sequence number 0 44233
110918 0:11:39 [Note] /usr/libexec/mysqld: Shutdown complete
110918 00:11:39 mysqld_safe mysqld from pid file /var/run/mysqld/mysqld.pid ended
Em seguida, no tmp / mysql.log:
kill 23080: No such process
kill 23080: No such process
kill 23080: No such process
kill 23080: No such process
kill 23080: No such process
kill 23080: No such process
kill 23080: No such process
kill 23080: No such process
kill 23080: No such process
kill 23080: No such process
Parei o processo de parada no meio do caminho para não ter que esperar pelo tempo limite. Parece que o processo foi morto. O problema, eu acho, ainda está com os diferentes códigos de retorno de "kill"
e "/bin/kill"