MySQL продолжает падать: InnoDB: невозможно заблокировать ./ibdata1, ошибка: 11

43

У меня есть простой веб-сервер (Debian 6.0 x86, DirectAdmin с 1 ГБ памяти и 10 ГБ свободного места, mySQl версии 5.5.9), однако сервер mySQL продолжает падать, и мне нужно убить все процессы mySQL, чтобы иметь возможность перезапустить его опять таки.

/var/log/mysql-error.log выход:

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.

Я нашел тему на веб-сайте mySQL здесь, но нет никакого решения для этого.

Любые идеи кто-нибудь?

Devator
источник
И какая версия MySQL это?
Майкл Хэмптон
Я не понимаю - эта часть файла журнала говорит о проблеме с запуском MySQL, а не о причине ошибки. Лучше всего удалить источник проблемы.
Кшиштоф Ксёнжык,
@MichaelHampton Пост был отредактирован (mySQL версии 5.5.9 и увеличен журнал).
Деватор
1
Вы проверили, что mysqld не запущен перед его запуском? Как?
symcbean

Ответы:

32

другой подход из одного комментария в том же блоге:

это помогло мне:

lsof -i: 3306

Тогда убей его (номер процесса)

убить -9 ПРОЦЕСС

например, убить -9 13498

Затем попробуйте перезапустить MySQL снова.

через http://www.webhostingtalk.com/archive/index.php/t-1070293.html

Brigo
источник
1
service mysql restartуже не показывал запущенный процесс, но lsofнашел его. Убил его, service mysql startи теперь поток неудачных писем может прекратиться. Большое спасибо.
Дойл Льюис
28

с убунту 14.04. Я испытываю эту проблему, когда пытаюсь перезапустить через

/etc/init.d/mysql restart

Вместо этого попробуйте

service mysql restart 
Jens
источник
1
Спасибо, это помогло. Но почему?
тоже
@too, если у вас есть сценарий init.d старого образца и конфигурация upstart для задания, вы должны использовать его service job start, иначе, если вы запустите его с помощью скрипта init.d, Upstart не узнает об этом и может попытаться загрузить другой экземпляр. (По крайней мере, так обстоит дело со сценариями инициализации MySQL по умолчанию.)
wireman
@wireman: это объясняет, почему другие пакеты, включая узел (DNS-сервер), имеют схожие проблемы. Когда они решили провести его в жизнь? Я думаю, что /etc/init.d лучше, так как он позволяет завершение оболочки, таким образом освобождает пользователя от чрезмерной типизации. Прогресс до степени -1 :)
тоже
Завершение вкладки @too Bash настраивается. У Ubuntu нет ничего удобного, но кажется странным, что никто бы не подумал об serviceименах, заканчивающих табуляцию . Может быть, отправить запрос функции в Canonical через их трекер ошибок?
CVn
18

Наиболее распространенная причина этой проблемы - попытка запустить MySQL, когда он уже запущен.

Чтобы решить эту проблему, убейте все запущенные экземпляры MySQL, а затем перезапустите его, используя обычные сценарии запуска, например service mysql start.

Не пытайтесь запустить MySQL вручную при использовании дистрибутивных версий, если вы не готовы к серьезным последствиям.

Майкл Хэмптон
источник
however the mySQL server keeps crashing- Я не перезагружаю MySQL. Он просто вылетает сам, после чего мне, очевидно, нужно перезапустить его. ;-)
Devator
@MichaelHampton Можете ли вы дать немного больше информации о «мире зла» и «запустить MySQL вручную»? Спасибо)
Сергей Квашнин
11

Решение

сделать копию оригинальных файлов (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
источник
волшебно помог мне.
Нильс Петерсон
какой смысл в cp -a? я уже прочитал справочную страницу
Илья
2
Большое спасибо, это помогло. Но почему?
ДавиАрагао
У меня была эта проблема после неудачного перезапуска на БД, работающей в контейнере Docker. Я делаю обоснованное предположение о том, почему это работает, и что некоторые метаданные хранятся в файле. перемещение и копирование в исходное местоположение удаляет метаданные, определяющие, что они заблокированы. Операция -a поддерживает атрибуты файла, включая атрибуты, связанные с SELinux, но не метаданные, во время копирования.
JDL
2

Это помогло мне решить это:

Удалите все файлы ibdata и позвольте mysql создать их.

остановите mysql:

service mysql stop

перейдите в библиотеку mysql:

cd /var/lib/mysql/

Переместите куда-нибудь файлы innodb, если вам это нужно:

mv ib* /root/

начать MySQL:

service mysql start
Али Канер Онер
источник
Прокручивая полезные ответы, я подумал, что это, похоже, сработает, поскольку ошибка жалуется на невозможность заблокировать этот файл. После переезда mysql воссоздал их, но все еще жалуется ... сумасшедший!
Кайл Беркетт
1

Пришел сюда из поисковика той же повторяющейся ошибки, но с кодом ошибки 13 ( InnoDB: Unable to lock ./ibdata1, error: 13). Перепробовав множество решений в интернете, изобрел одно, которое помогло мне (apparmor!)

Добавьте эти строки в конфигурацию /etc/apparmor.d/usr.sbin.mysqld(и перезагрузите apparmor и mysql, конечно):

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

Основные различия между часто встречающимися решениями: два правила (для самого dir и для всех файлов внутри, обратите внимание на двойное **) и kопция, позволяющая mysql блокировать файлы.

Надеюсь, это поможет кому-то.

hlomzik
источник
Вы также можете добавить его в /etc/apparmor.d/local/usr.sbin.mysqld. Создайте файл, если он не существует. Для получения более подробной информации, пожалуйста, смотрите/etc/apparmor.d/local/README
knb
1

Проверьте место, чтобы убедиться, что это 100%

df -h

Как будто его полный он не будет создавать файл .sock.

RicardasSorryxas
источник
Ответ о неожиданном побочном эффекте, я категорически не согласен с тем, что это будет LQ.
Петер говорит восстановить Монику
0

Пожалуйста, проверьте, что у вас есть pid-fileпараметр в [mysql]разделе my.cnfфайла. Если его нет, то unable to lock ...ibdata1.. error:1произойдет.

Сэчин
источник
0

Просто, но быстрее, чем с "cp -a". И помогло, когда "cp -a" и все остальные не смогли.

  1. service mysql stop && pkill -f mysql

Избавьтесь от всех процессов MySQL

  1. vi /etc/mysql/my.cnf

Измените параметр datadir = / var / lib / mysql на datadir = / var / lib / mysql2 (или просто добавьте, если у вас его нет)

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

Переименуйте датадир в новое имя

  1. service mysql start

Приготовь свой бубен

WSR
источник
0

Если ни одно из других решений не работает, проблема, вероятно, связана с неправильной настройкой AppArmor.

Так что просто сделайте:

$ apt install apparmor-profiles

и затем перезапустите MySQL (обратите внимание, как быстро он будет перезагружен).

Я заметил, что отсутствует файл, связанный с AppArmor при выполнении:

$ systemctl status mysql.service

Поэтому я подумал, что что-то не так с конфигурацией AppArmor.

fevangelou
источник