PostgreSQL: data directory has invalid permissions
PostgreSQL отказывается стартовать, если права на каталог данных шире, чем 0700 (или 0750 в версиях 11 и новее). Это защита от чужого доступа к базе, и обходить её не нужно — нужно вернуть правильные права и владельца.
Вероятные причины
По порядку: сверху то, что встречается чаще.
-
Права на каталог данных расширены
Обычно это следствие попытки «дать доступ»: команда с правами 0755 или 0777 ломает запуск кластера.
-
Каталог принадлежит root после восстановления из копии
Распаковка архива под root оставляет файлы с владельцем root. Кластер работает от postgres и доступа не получает.
-
Каталог данных на файловой системе без поддержки прав
На сетевых и внешних файловых системах права могут не сохраняться, и требование PostgreSQL выполнить невозможно.
Диагностика
Команды идут в том порядке, в котором их стоит выполнять: каждая следующая проверяет то, что осталось после предыдущей.
Сообщение о правах приходит от самого сервера и попадает в его журнал.
sudo tail -30 /var/log/postgresql/postgresql-16-main.logПрава и владелец каталога данных.
sudo ls -ld /var/lib/postgresql/16/mainСостояние всех кластеров машины с версиями и портами.
pg_lsclustersРешение
Решение своё для каждой причины. Сначала определите, какая из них ваша, — иначе правки наложатся друг на друга.
- Почему происходит
- Обычно это следствие попытки «дать доступ»: команда с правами 0755 или 0777 ломает запуск кластера.
- Как проверить
-
Посмотрите права и владельца каталога.
sudo ls -ld /var/lib/postgresql/16/main
- Как исправить
-
Верните права 0700 и владельца postgres.
sudo chown -R postgres:postgres /var/lib/postgresql/16/main && sudo chmod 700 /var/lib/postgresql/16/main
- Почему происходит
- Распаковка архива под root оставляет файлы с владельцем root. Кластер работает от postgres и доступа не получает.
- Как проверить
-
Посмотрите владельца файлов внутри каталога.
sudo ls -la /var/lib/postgresql/16/main | head
- Как исправить
-
Смените владельца рекурсивно и запустите кластер. Распаковывать копии лучше сразу от пользователя postgres.
sudo chown -R postgres:postgres /var/lib/postgresql/16/main
- Почему происходит
- На сетевых и внешних файловых системах права могут не сохраняться, и требование PostgreSQL выполнить невозможно.
- Как проверить
-
Посмотрите тип файловой системы под каталогом данных.
findmnt -T /var/lib/postgresql -o TARGET,FSTYPE,OPTIONS
- Как исправить
- Перенесите каталог данных на локальную файловую систему. Для баз это верно и по другим причинам: сетевые хранилища плохо совместимы с гарантиями записи.
Пример вывода
Права на каталог данных расширены до 0755. Пример показательный: он собран на тестовой машине специально для этой страницы, а не взят из чужого журнала.
× postgresql@16-main.service - PostgreSQL Cluster 16-main
Active: failed (Result: protocol) since Mon 2026-09-15 09:12:41 MSK; 3s ago
postgres[4210]: FATAL: data directory "/var/lib/postgresql/16/main" has invalid permissions
postgres[4210]: DETAIL: Permissions should be u=rwx (0700) or u=rwx,g=rx (0750).
systemd[1]: postgresql@16-main.service: Failed with result 'protocol'.
Связанные ошибки
- Permission denied в журнале службы Отказ в доступе у службы systemd: права на файл, каталоги по пути, пользователь службы, параметры изоляции, SELinux и AppArmor.
- status=217/USER в systemd Код 217/USER означает, что systemd не смог определить или сменить пользователя из User=. Разбор причин: пользователя нет, имя недопустимо, конфликт с DynamicUser.
- PostgreSQL: could not bind IPv4 address Кластер PostgreSQL не занимает порт: адрес занят другим экземпляром или остался файл сокета. Разбор.
- MySQL: Can't open the mysql.plugin table и повреждение системных таблиц MySQL не запускается: недоступны или повреждены системные таблицы. Права на каталог данных, версия схемы, восстановление.
- nginx 403 Forbidden и Permission denied на файлы сайта nginx отдаёт 403: нет прав на файлы сайта, закрыт каталог по пути, мешает SELinux или AppArmor, нет индексного файла.
- postgresql.service активен, а кластер не работает Обёртка postgresql.service — пустой oneshot. Почему её состояние ничего не говорит о кластере и что смотреть.
- sshd: отказ аутентификации из-за прав на файлы Вход по ключу не работает: слишком широкие права на домашний каталог или authorized_keys. Разбор через журнал sshd.
- status=200/CHDIR в systemd Код 200/CHDIR означает, что systemd не смог перейти в каталог из WorkingDirectory= до запуска программы. Причины и решение.
Где встречается чаще всего
Источники
- Документация PostgreSQL: каталог данных
-
Воспроизведено на тестовой машине, systemd 255 (Ubuntu 24.04)
Воспроизведено правами 0755 на каталоге данных PostgreSQL 16.