База не запускается после переноса каталога данных
Перенос каталога данных базы требует изменений в трёх местах: в настройках базы, в профиле защиты и в описании службы. Правка только настроек даёт отказ доступа, который легко принять за проблему с правами файлов.
Вероятные причины
По порядку: сверху то, что встречается чаще.
-
Профиль защиты разрешает только прежний путь
Профиль перечисляет пути, доступные службе. Новый каталог в него не входит, и доступ отклоняется.
-
Права и владелец нового каталога не те
После копирования владельцем остаётся root, а служба работает от своего пользователя.
-
Служба не зависит от монтирования нового раздела
Если данные на отдельном разделе, база может стартовать раньше его монтирования.
Диагностика
Команды идут в том порядке, в котором их стоит выполнять: каждая следующая проверяет то, что осталось после предыдущей.
Сообщения базы при попытке запуска.
journalctl -u mysql -n 30 --no-pager 2>/dev/nullОтказы профиля защиты.
journalctl -k -b --no-pager | grep -i 'apparmor="DENIED"' | tailВладелец нового каталога и пользователь службы.
sudo ls -ld /srv/mysql && systemctl show mysql -p UserРешение
Решение своё для каждой причины. Сначала определите, какая из них ваша, — иначе правки наложатся друг на друга.
- Почему происходит
- Профиль перечисляет пути, доступные службе. Новый каталог в него не входит, и доступ отклоняется.
- Как проверить
-
Посмотрите отказы профиля и его правила.
journalctl -k -b --no-pager | grep -i 'apparmor="DENIED"' | grep -i mysql | tail -3 sudo grep -rn "/var/lib/mysql" /etc/apparmor.d/ 2>/dev/null | head
- Как исправить
- Добавьте новый путь в профиль и перезагрузите его. Отключать профиль ради переноса не стоит: он защищает базу от доступа через другие службы.
- Почему происходит
- После копирования владельцем остаётся root, а служба работает от своего пользователя.
- Как проверить
-
Посмотрите владельца нового каталога.
sudo ls -ld /srv/mysql 2>/dev/null systemctl show mysql -p User 2>/dev/null; id mysql
- Как исправить
- Передайте каталог пользователю базы с сохранением прав внутри. Копировать надо с сохранением атрибутов, иначе права внутри тоже потеряются.
- Почему происходит
- Если данные на отдельном разделе, база может стартовать раньше его монтирования.
- Как проверить
-
Посмотрите зависимости службы и точку монтирования.
systemctl show mysql -p RequiresMountsFor -p After 2>/dev/null findmnt -T /srv/mysql -o TARGET,SOURCE 2>/dev/null
- Как исправить
-
Объявите зависимость от пути данных в описании службы. Иначе после перезагрузки база иногда будет стартовать на пустом каталоге.
[Unit] RequiresMountsFor=/srv/mysql
Пример вывода
Профиль защиты не разрешает новый путь. Пример показательный: он собран на тестовой машине специально для этой страницы, а не взят из чужого журнала.
kernel: audit: apparmor="DENIED" operation="open" profile="/usr/sbin/mysqld" name="/srv/mysql/ibdata1" pid=11900 comm="mysqld" requested_mask="rwc" denied_mask="rwc"
mysqld[11900]: [ERROR] [MY-012574] [InnoDB] Unable to lock /srv/mysql/ibdata1 error: 13
systemd[1]: mysql.service: Main process exited, code=exited, status=1/FAILURE
Связанные ошибки
- AppArmor: apparmor="DENIED" в журнале ядра Профиль AppArmor запретил операцию: как прочитать запись, найти профиль и поправить его правильно.
- MySQL: Can't open the mysql.plugin table и повреждение системных таблиц MySQL не запускается: недоступны или повреждены системные таблицы. Права на каталог данных, версия схемы, восстановление.
- Служба запускается раньше монтирования своих данных Служба стартует и не находит файлов: зависимость от точки монтирования не объявлена.
- База временных рядов не запускается после обновления Обновление сменило пользователя или расположение данных: служба не может открыть свой каталог.
- Caddy не занимает порты 80 и 443 без прав Служба падает при открытии слушателя: нет возможности занимать привилегированные порты.
- Configuration file is marked executable Предупреждение о правах: unit-файл помечен исполняемым. Откуда берётся и почему это стоит исправить.
- Configuration file is marked world-inaccessible Предупреждение о правах на unit-файл: служба работает, но файл недоступен для чтения другим.
- Interactive authentication required при управлении службой systemctl требует аутентификации: обращение от непривилегированного пользователя через polkit. Как разрешить точечно.
Где встречается чаще всего
Источники
-
apparmor(7)
Профили защиты и разрешённые пути. -
Воспроизведено на тестовой машине, systemd 255 (Ubuntu 24.04)
Воспроизведено переносом каталога данных без правки профиля защиты.