#Симптом и границы применимости
PostgreSQL пишет no space left on device, когда исчерпаны блоки файловой системы, inode или место в отдельном табличном пространстве. Опасно удалять содержимое каталога pg_wal: это может сделать весь кластер невосстановимым.
#Как отличить возможные причины
| Возможная причина | Как узнать | Что делать |
|---|---|---|
| Заполнен раздел с даннымиФайловой системе некуда писать таблицы, временные данные или WAL. | df -h показывает 100% | Найти рост конкретного раздела |
| Исчерпаны inodeМесто в байтах есть, но новые файлы создать нельзя. | df -i показывает 100% | Найти множество мелких файлов |
| Другое tablespace/WALОшибку выдаёт файловая система, отличная от PGDATA. | pg_tablespace_location указывает отдельный диск | Проверить правильный том |
#Пошаговая диагностика и безопасное исправление
- 1. Остановите опасные повторные записиПри сообщении no space left on device ограничьте повторные тяжёлые импорты/индексацию и уведомите дежурного. Не удаляйте pg_wal, global, base и файлы таблиц: это не временный мусор.
- 2. Определите конкретную файловую системуНа Linux-сервере в терминале проверьте блоки и inode. Подставьте настоящий путь каталога данных после проверки конфигурации; выполнение df безопасно и не требует прав администратора.
- Терминал Linux; чтениеLinux · Терминал (Bash)КомандаТерминал Linux; чтение. Каталог примерный — проверьте на вашем сервере реальный PGDATA и WAL.
df -h /var/lib/postgresqldf -i /var/lib/postgresql
- 3. Проверьте размещение основного каталога и WALЕсли PostgreSQL ещё доступен, спросите SHOW data_directory и через pg_settings параметр wal_directory не ищите — отдельной стандартной настройки с таким именем нет; WAL обычно находится в pg_wal, который может быть ссылкой на другой том.SQLКомандаpsql, чтение. При остановленном сервере путь узнайте из конфигурации службы.
SHOW data_directory;
- 4. Проверьте отдельно табличные пространстваВ psql прочитайте pg_tablespace_location для пользовательских tablespace, чтобы не чистить не тот диск. Каталоги из результата осмотрите через df; данные внутри них не удалять вручную.
- psql, чтениеSQLКомандаpsql, чтение. Пустой путь не означает отсутствие данных в основных tablespace.
SELECT spcname, pg_tablespace_location(oid) AS location FROM pg_tablespace WHERE spcname NOT IN ('pg_default','pg_global');
- 5. Найдите безопасные кандидаты на освобождение местаПроверьте собственные журналы приложения, старые архивы резервных копий вне PGDATA, временные выгрузки и системные журналы. Удаляйте только явно опознанные неиспользуемые файлы по процедуре организации, сохраняя резервную копию.
- 6. Не устраняйте переполнение WAL вручнуюЕсли велик pg_wal, выясните, не удерживают ли сегменты репликационные слоты или отставшие реплики; удаление файлов вручную недопустимо. Проверьте архивирование, slots и мониторинг, прежде чем менять удержание.
- 7. Увеличьте ёмкость управляемым способомЕсли доступное место действительно исчерпано данными, используйте одобренное расширение тома, переезд tablespace или очистку ненужных бизнес-данных через SQL с копией и тестом. На почти полном диске VACUUM FULL требует дополнительного места и не подходит.
- 8. Проверьте запись и непрерывность журналаПосле восстановления свободного места выполните безопасный SELECT и маленькую транзакцию в тестовой таблице с последующим ROLLBACK. Убедитесь, что репликация и архивирование WAL исправны; повреждения после дискового сбоя требуют отдельной процедуры восстановления.
#Как проверить, что проблема устранена
На всех томах PGDATA, WAL и tablespace есть запас блоков и inode, новые транзакции проходят, логи не содержат повторных ENOSPC.
#Если исправление не помогло
Если место есть, но ошибка продолжается, проверьте квоты, контейнерные лимиты, inodes, временный каталог и сообщения ядра о файловой системе. Не отключайте fsync.