MySQL ulega awarii: InnoDB: Nie można zablokować ./ibdata1, błąd: 11

43

Mam prosty serwer WWW (Debian 6.0 x86, DirectAdmin z 1 GB pamięci i wciąż 10 GB wolnego miejsca, mySQl wersja 5.5.9), jednak serwer mySQL ciągle się zawiesza i muszę zabić wszystkie procesy mySQL, aby móc go zrestartować jeszcze raz.

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

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.

Znalazłem tutaj temat na stronie mySQL , jednak nie ma na to rozwiązania.

Jakieś pomysły?

Devator
źródło
A która to wersja MySQL?
Michael Hampton
Nie rozumiem - ta część pliku dziennika mówi o problemie z uruchomieniem MySQL, a nie o przyczynie błędu. Najlepiej jest usunąć źródło problemu.
Krzysztof Księżyk
@MichaelHampton Post został edytowany (mySQL wersja 5.5.9 i zwiększył dziennik).
Devator,
1
Czy sprawdziłeś, że nie było uruchomionego mysqld przed jego uruchomieniem? W jaki sposób?
symcbean

Odpowiedzi:

32

inne podejście z jednego komentarza na tym samym blogu:

pomogło mi to:

lsof -i: 3306

Następnie zabij to (numer procesu)

zabij -9 PROCES

np. zabij -9 13498

Następnie spróbuj ponownie uruchomić MySQL ponownie.

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

Brigo
źródło
1
service mysql restartnie pokazywał już uruchomionego procesu, ale lsofgo znalazł. Zabiłem go, service mysql starta teraz powódź procesu nieudanych e-maili może zatrzymać. Wielkie dzięki.
Doyle Lewis,
28

z Ubuntu 14.04. Ten problem występuje podczas próby ponownego uruchomienia za pośrednictwem

/etc/init.d/mysql restart

Zamiast tego spróbuj

service mysql restart 
Jens
źródło
1
Dzięki, pomogło. Ale dlaczego?
też
@too, jeśli masz zarówno stary skrypt init.d, jak i konfigurację upstart dla zadania, musisz użyć service job start, w przeciwnym razie, jeśli uruchomisz go za pomocą skryptu init.d, Upstart nie będzie o nim wiedział i może spróbować uruchomić inną instancję. (Przynajmniej tak jest w przypadku domyślnych skryptów inicjujących MySQL.)
wireman
@wireman: wyjaśnia, dlaczego inne pakiety, w tym węzeł (serwer DNS), mają podobne problemy. Kiedy zdecydowali się go egzekwować? Myślę, że /etc/init.d jest lepszy, ponieważ pozwala na uzupełnianie powłoki, a tym samym uwalnia użytkownika od nadmiernego pisania. Przejdź do potęgi -1 :)
także
Wypełnienie zakładki @too Bash można dostosować. Nie mam pod ręką nic Ubuntu, ale wydaje się dziwne, że nikt nie pomyślałby o servicenazwach uzupełniających tabulatory . Może przesłać prośbę o funkcję do Canonical za pomocą narzędzia do śledzenia błędów?
CVn
18

Najczęstszą przyczyną tego problemu jest próba uruchomienia MySQL, gdy jest już uruchomiony.

Aby rozwiązać ten problem, zabij wszystkie działające instancje MySQL, a następnie uruchom go ponownie przy użyciu normalnych skryptów startowych, np service mysql start.

Nie próbuj uruchamiać MySQL ręcznie, gdy używasz wersji z pakietami dystrybucyjnymi, chyba że jesteś przygotowany na świat bólu.

Michael Hampton
źródło
however the mySQL server keeps crashing- Nie uruchamiam ponownie MySQL. Po prostu ulega awarii, po czym oczywiście muszę go ponownie uruchomić. ;-)
Devator
@MichaelHampton, czy możesz podać trochę więcej informacji na temat „świata bólu” i „ręcznie uruchomić MySQL”? Dzięki)
Serge Kvashnin,
11

Rozwiązanie

wykonaj kopię oryginalnych plików (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
źródło
magicznie mi pomógł.
nils petersohn
jaki jest sens cp -a? Przeczytałem już stronę podręcznika man
Ilja
2
Wielkie dzięki, pomogło. Ale dlaczego?
DaviAragao
Miałem ten problem po nieudanym ponownym uruchomieniu na db uruchomionym w kontenerze dokera. Zgaduję, dlaczego to działa, i dlatego, że niektóre metadane są przechowywane w pliku. przeniesienie go i skopiowanie do oryginalnej lokalizacji powoduje usunięcie metadanych określających, że jest on zablokowany. operacja -a zachowuje atrybuty pliku, w tym atrybuty związane z SELinux, ale nie metadane, podczas kopiowania.
JDL
2

Pomogło mi to rozwiązać:

Usuń wszystkie pliki ibdata i pozwól mysql je utworzyć.

zatrzymaj mysql:

service mysql stop

przejdź do biblioteki mysql:

cd /var/lib/mysql/

przenieś gdzieś pliki innodb na wypadek, gdyby były potrzebne:

mv ib* /root/

uruchom mysql:

service mysql start
Ali Caner Öner
źródło
Przewijanie pomocnych odpowiedzi Pomyślałem, że to na pewno będzie działać, ponieważ błąd narzeka na niemożność zablokowania tego pliku. Po przeprowadzce mysql je odtworzył, ale nadal narzeka ... szalony!
Kyle Burkett,
1

Przyszedł tutaj z googlingu tego samego powtarzającego się błędu, ale z kodem błędu 13 ( InnoDB: Unable to lock ./ibdata1, error: 13). Po wypróbowaniu wielu rozwiązań w Internecie wymyśliłem takie, które mi pomogło (apparmor!)

Dodaj te wiersze do konfiguracji /etc/apparmor.d/usr.sbin.mysqld(i ponownie załaduj apparmor i mysql, oczywiście):

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

Główne różnice między często rozwiązaniami: dwie reguły (dla samego katalogu i dla wszystkich plików w środku, zwróć uwagę na podwójne **) i kopcja pozwalająca mysqlowi blokować pliki.

Mam nadzieję, że komuś to pomoże.

hlomzik
źródło
Możesz także dodać go do /etc/apparmor.d/local/usr.sbin.mysqld. Utwórz plik, jeśli nie istnieje. Aby uzyskać więcej informacji, zobacz/etc/apparmor.d/local/README
knb
1

Sprawdź miejsce, aby upewnić się, że jest w 100%

df -h

Jak gdyby był pełny, nie utworzy pliku .sock.

RicardasSorryxas
źródło
Odpowiedź dotyczy zaskakującego efektu ubocznego, zdecydowanie nie zgadzam się, że byłby to LQ.
Peter mówi, że przywróć Monikę
0

Sprawdź, czy masz pid-fileparametr w [mysql]sekcji my.cnfpliku. Jeśli nie jest obecny, unable to lock ...ibdata1.. error:1nastąpi.

Sachin
źródło
0

Proste, ale szybsze niż w przypadku „cp -a”. I pomógł, gdy „cp -a” i wszystko inne nie mogło.

  1. service mysql stop && pkill -f mysql

Pozbądź się wszystkich procesów mysql

  1. vi /etc/mysql/my.cnf

Zmień parametr datadir = / var / lib / mysql na datadir = / var / lib / mysql2 (lub po prostu dodaj, jeśli nie masz)

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

Zmień nazwę datadir na nową nazwę

  1. service mysql start

Przygotuj tamburyn

WSR
źródło
0

Jeśli żadne z pozostałych rozwiązań nie działa, problem prawdopodobnie wynika z błędnej konfiguracji AppArmor.

Więc po prostu zrób:

$ apt install apparmor-profiles

a następnie uruchom ponownie MySQL (zauważ, jak szybko się zrestartuje).

Zauważyłem brakujący plik związany z AppArmor podczas wykonywania:

$ systemctl status mysql.service

Dlatego pomyślałem, że coś jest nie tak z konfiguracją AppArmor.

fevangelou
źródło