O MySQL continua travando: InnoDB: Não foi possível bloquear ./ibdata1, erro: 11

43

Eu tenho um servidor web simples (Debian 6.0 x86, DirectAdmin com 1 GB de memória e ainda 10 GB de espaço livre, mySQl versão 5.5.9), no entanto, o servidor mySQL continua travando e preciso interromper todos os processos mySQL para poder reiniciá-lo novamente.

/var/log/mysql-error.log resultado:

130210 21:04:26 InnoDB: Using Linux native AIO
130210 21:04:34 InnoDB: Initializing buffer pool, size = 128.0M
130210 21:05:42 InnoDB: Completed initialization of buffer pool
130210 21:05:48 InnoDB: Initializing buffer pool, size = 128.0M
130210 21:06:22 InnoDB: Initializing buffer pool, size = 128.0M
130210 21:06:27 mysqld_safe mysqld from pid file /usr/local/mysql/data/website.pid ended
130210 21:06:29 mysqld_safe mysqld from pid file /usr/local/mysql/data/website.pid ended
130210 21:07:22 InnoDB: Completed initialization of buffer pool
130210 21:07:51 mysqld_safe mysqld from pid file /usr/local/mysql/data/website.pid ended
130210 21:08:33 InnoDB: Completed initialization of buffer pool
130210 21:12:03 [Note] Plugin 'FEDERATED' is disabled.
130210 21:12:47 InnoDB: The InnoDB memory heap is disabled
130210 21:12:47 InnoDB: Mutexes and rw_locks use InnoDB's own implementation
130210 21:12:47 InnoDB: Compressed tables use zlib 1.2.3
130210 21:12:47 InnoDB: Using Linux native AIO
130210 21:13:11 InnoDB: highest supported file format is Barracuda.
130210 21:13:23 InnoDB: Initializing buffer pool, size = 128.0M
InnoDB: The log sequence number in ibdata files does not match
InnoDB: the log sequence number in the ib_logfiles!
130210 21:14:05  InnoDB: Database was not shut down normally!
InnoDB: Starting crash recovery.
InnoDB: Unable to lock ./ibdata1, error: 11
InnoDB: Check that you do not already have another mysqld process
InnoDB: using the same InnoDB data or log files.
InnoDB: Unable to lock ./ibdata1, error: 11
InnoDB: Check that you do not already have another mysqld process
InnoDB: using the same InnoDB data or log files.
InnoDB: Unable to lock ./ibdata1, error: 11
InnoDB: Check that you do not already have another mysqld process
InnoDB: using the same InnoDB data or log files.
130210 21:17:53  InnoDB: Unable to open the first data file
InnoDB: Error in opening ./ibdata1
130210 21:17:53  InnoDB: Operating system error number 11 in a file operation.

Encontrei um tópico no site mySQL aqui, mas não há solução para isso.

Alguma idéia para alguém?

Devator
fonte
E qual versão do MySQL é essa?
Michael Hampton
Eu não entendo - esta parte do arquivo de log fala sobre o problema com o MySQL start e não sobre a causa do erro. A melhor coisa é remover a fonte do problema.
Krzysztof Księżyk
@MichaelHampton A postagem foi editada (mySQL versão 5.5.9 e aumentou o log).
Devator
1
Você verificou se não havia mysqld em execução antes de iniciá-lo? Quão?
symcbean

Respostas:

32

outra abordagem de um comentário no mesmo blog:

isso me ajudou:

lsof -i: 3306

Então mate (o número do processo)

kill -9 PROCESS

por exemplo, matar -9 13498

Em seguida, tente reiniciar o MySQL novamente.

via http://www.webhostingtalk.com/archive/index.php/t-1070293.html

Brigo
fonte
1
service mysql restartjá não estava mostrando nenhum processo em execução, mas o lsofencontrou. Matou service mysql start, e agora o fluxo de e-mails com falha no processo pode parar. Muito Obrigado.
Doyle Lewis
28

com o ubuntu 14.04. Estou com esse problema ao tentar reiniciar via

/etc/init.d/mysql restart

Em vez disso, tente

service mysql restart 
Jens
fonte
1
Obrigado, ajudou. Mas por que?
também
@too, se você possui um script init.d à moda antiga e uma configuração inicial para um trabalho, é necessário usá-lo service job start; caso contrário, se você o iniciar com o script init.d, o Upstart não saberá sobre isso e poderá tentar para inicializar outra instância. (Pelo menos é o caso com padrão do MySQL o init scripts.)
wireman
@ wireman: isso explica por que outros pacotes, incluindo o nó (servidor DNS), têm problemas semelhantes. Quando eles decidiram aplicá-lo? Eu acho que o /etc/init.d é superior, pois permite a conclusão do shell, aliviando o usuário da digitação excessiva. Progresso para o poder de -1 :)
também
A conclusão da guia @too Bash é personalizável. Não tem nada à mão com o Ubuntu, mas parece estranho que ninguém tenha pensado em servicenomes de preenchimento de guias . Talvez envie uma solicitação de recurso para a Canonical através do rastreador de erros?
a CVn
18

A causa mais comum desse problema é tentar iniciar o MySQL quando ele já estiver em execução.

Para resolvê-lo, elimine todas as instâncias em execução do MySQL e reinicie-o usando seus scripts de inicialização normais, por exemplo service mysql start.

Não tente iniciar o MySQL manualmente ao usar versões em pacotes de distribuição, a menos que esteja preparado para um mundo de mágoas.

Michael Hampton
fonte
however the mySQL server keeps crashing- Eu não reinicio o mySQL. Ele apenas trava, depois do que eu preciso reiniciar obviamente. ;-)
Devator
@MichaelHampton, você pode dar um pouco mais de informação sobre 'world of hurt' e 'iniciar o MySQL manualmente'? Obrigado)
Serge Kvashnin
11

Solução

faça uma cópia dos arquivos originais (ibdata1, ib_logfile0, ib_logfile1 ...).

mv ibdata1 ibdata1.bak 
cp -a ibdata1.bak ibdata1

http://cglreport.zhenhua.info/2008/08/mysql-error-unable-to-lock-ibdata1.html

Brigo
fonte
magicamente me ajudou.
Nils petersohn
página do homem que é o ponto de cp -a, eu já leu?
Ilja
2
Muito obrigado, ajudou. Mas por que?
DaviAragao
Eu tive esse problema após uma falha na reinicialização em um banco de dados em execução em um contêiner de docker. Estou tentando adivinhar por que isso funciona e é que alguns metadados são armazenados no arquivo. movê-lo e copiá-lo para o local original remove os metadados que determinam que ele está bloqueado. a operação -a mantém os atributos do arquivo, incluindo atributos relacionados ao SELinux, mas não os metadados, durante a cópia.
JDL
2

Isso me ajudou a resolvê-lo:

Exclua todos os arquivos ibdata e deixe o mysql criá-los.

pare o mysql:

service mysql stop

vá para a biblioteca mysql:

cd /var/lib/mysql/

mova os arquivos innodb para algum lugar, caso você precise:

mv ib* /root/

inicie o mysql:

service mysql start
Ali Caner Öner
fonte
Percorrendo as respostas úteis, pensei que certamente funcionaria, pois o erro está se queixando de não conseguir bloquear esse arquivo. Após a mudança, o mysql os recriou, mas ainda está reclamando ... louco!
Kyle Burkett
1

Veio aqui pesquisando o mesmo erro de repetição, mas com o código de erro 13 ( InnoDB: Unable to lock ./ibdata1, error: 13). Depois de tentar muitas soluções pela internet, inventei uma que me ajudou (apparmor!)

Adicione estas linhas à configuração /etc/apparmor.d/usr.sbin.mysqld(e recarregue o apparmor e o mysql, é claro):

/path/to/mysql/data/ r,
/path/to/mysql/data/** rwk,

As principais diferenças entre as soluções frequentemente: duas regras (para o próprio diretório e para todos os arquivos dentro, observe o dobro **) e a kopção para permitir que o mysql bloqueie arquivos.

Espero que isso ajude alguém.

hlomzik
fonte
Você também pode adicioná-lo a /etc/apparmor.d/local/usr.sbin.mysqld. Crie o arquivo se ele não existir. Para mais detalhes, consulte/etc/apparmor.d/local/README
KNB
1

Verifique o espaço para garantir que seja 100%

df -h

Como se estivesse cheio, ele não criará um arquivo .sock.

RicardasSorryxas
fonte
A resposta é sobre um efeito colateral surpreendente, eu discordo totalmente que seria LQ.
peterh diz restabelecer Monica
0

Por favor, verifique se você possui pid-fileparâmetro na [mysql]seção do my.cnfarquivo. Se não estiver presente, unable to lock ...ibdata1.. error:1ocorrerá.

Sachin
fonte
0

Simples, mas mais rápido do que o caminho com "cp -a". E ajudou quando "cp -a" e tudo o mais não podia.

  1. service mysql stop && pkill -f mysql

Livre-se de todos os processos mysql

  1. vi /etc/mysql/my.cnf

Altere o parâmetro datadir = / var / lib / mysql para datadir = / var / lib / mysql2 (ou apenas adicione se você não tiver)

  1. mv /var/lib/mysql /var/lib/mysql2

Renomeie o datadir para um novo nome

  1. service mysql start

Prepare seu pandeiro

WSR
fonte
0

Se nenhuma das outras soluções funcionar, o problema provavelmente decorre da configuração incorreta do AppArmor.

Então faça:

$ apt install apparmor-profiles

e depois reinicie o MySQL (observe o quão rápido ele será reiniciado).

Percebi um arquivo ausente relacionado ao AppArmor ao fazer:

$ systemctl status mysql.service

Por isso, achei que havia algo errado com a configuração do AppArmor.

fevangelou
fonte