X

MySQL 5.7: Could not create unix socket lock file /var/run/mysqld/mysqld.sock.lock

После обновления MySQL с версии 5,6 на версию 5,7 столкнулся с тем, что MySQL перестала запускаться. В логе была вот такая ошибка: [ERROR] Could not create unix socket lock file /var/run/mysqld/mysqld.sock.lock..

Вот так выглядит ошибка в /var/log/mysql/error.log

...
2019-11-25T13:16:23.046481Z 0 [ERROR] Could not create unix socket lock file /var/run/mysqld/mysqld.sock.lock.
2019-11-25T13:16:23.046485Z 0 [ERROR] Unable to setup unix socket lock file.
2019-11-25T13:16:23.046488Z 0 [ERROR] Aborting
...

Первым делом я проверил, что указанная папка существует и у нее правильный пользователь (mysql) и есть права на запись

$ ls -al /var/run/ | grep mysqld
drwxr-xr-x  2 mysql               mysql                100 Nov 25 15:32 mysqld

в моем случае все было в порядке.

Я погуглил и наткнулся на напоминание, что для убунту надо этот файл добавить в apparmor, это я и сделал

$ sudo mcedit /etc/apparmor.d/usr.sbin.mysqld
...
/var/run/mysqld/mysqld.sock.lock rwk,

и перезапускаем apparmor и mysql

sudo systemctl restart apparmor
sudo systemctl restart mysql

К сожалению, на этом приключения не закончились, по прежнему была та же ошибка в логе mysql. Тогда я погуглил по ключевику "apparmor mysql" и нашел подсказку - смотреть в syslog. Заглянул туда и увидел ошибку чтения других файлов

$ tail -n25 /var/log/syslog

Nov 25 15:23:46 homenet100 kernel: [ 1846.381432] audit: type=1400 audit(1574688226.849:1941): apparmor="DENIED" operation="open" 
    profile="/usr/sbin/mysqld" name="/etc/ssl/openssl.cnf" pid=23017 comm="mysqld" requested_mask="r" denied_mask="r" fsuid=121 ouid=0

Nov 25 15:30:24 homenet100 kernel: [ 2243.768247] audit: type=1400 audit(1574688624.268:2443): apparmor="DENIED" operation="open" 
    profile="/usr/sbin/mysqld" name="/sys/devices/system/node/node0/meminfo" pid=27189 comm="mysqld" requested_

Nov 25 15:31:52 homenet100 kernel: [ 2332.345777] audit: type=1400 audit(1574688712.852:2523): apparmor="DENIED" operation="mknod" 
    profile="/usr/sbin/mysqld" name="/run/mysqld/mysqld.sock.lock" pid=28076 comm="mysqld" requested_mask="c"

в атрибуте name мы видим к каким файлам mysql пытается получить доступ. Вносим их так же в apparmor

$ mcedit /etc/apparmor.d/usr.sbin.mysqld
...
/etc/ssl/openssl.cnf r,
/run/mysqld/mysqld.sock.lock rwk,
/sys/devices/system/node/** r,
...

и рестартуем

sudo systemctl restart apparmor
sudo systemctl restart mysql

после этого mysql успешно запустился.

Т.е. алгоритм решения тут такой:

  1. Пробуем запустить mysql и получаем ошибку
  2. Проверяем существование папки и права на нее
  3. Проверяем не закончилось ли место на диске
  4. Смотрим в /var/log/mysql/error.log и видим ошибку записи
  5. Смотрим в /var/log/syslog и добавляем в /etc/apparmor.d/usr.sbin.mysqld те пути, куда не хватает доступа
  6. Перезапускаем apparmor
  7. Пробуем запустить MySQL, повторяем пункты 4-7.

-- [добавлено] --

В конфиге apparmor-а, после пути указывается флаг доступа, вот возможные варианты

  • r - read - permission to read data
  • w - write - permission to create, delete, write to a file and extend it
  • a - append - permission to create, and extend a file. The append permission is limited that it only gives permission for applications to open a file with O_APPEND, it can not be used to enforce a generic file write is append only. If an application only has the append permission in the profile and it tries to write to the file even if it is an appending write, the write will be failed.
  • l - link - permission to link to a file (combined with /** to determine if permissions apply to subtree)
  • k - lock - permission to lock a file, is combined with write perm to determine if it has permission to take exclusive lock
  • m - memory map executable - permission to memory map a file executable
  • x - executable - determines if a file is executable, allow forms of the rule must be accompanied by x qualifiers. When specified as part of an allow rule it must be accompanied by qualifiers.

Более подробно вот тут: https://gitlab.com/apparmor/apparmor/wikis/AppArmor_Core_Policy_Reference

Категории: MySQL