PostgreSQL Error 58P02 duplicate_file: Устранение Конфликтов Файлов
- Ошибка выполнения DDL:
ERROR: 58P02: could not create file "...": File exists. - Сбой выполнения команды
CREATE DATABASEилиCREATE TABLESPACE. - Невозможность инициализации нового логического тома или партиции в 1С:Предприятие.
- Отказ клонирования базы данных из шаблона (
TEMPLATE).
1. Причина возникновения ошибки 58P02
Ошибка генерируется, когда PostgreSQL пытается создать новый каталог или файл на диске под новый объект (таблицу, базу, tablespace), но в файловой системе уже присутствует файл или папка с идентичным именем (OID) от ранее удаленного или аварийно упавшего объекта.
2. Сценарий: Конфликт при CREATE TABLESPACE
Попытка создать табличное пространство в директории, где уже есть файлы:
-- Ошибка: directory "/mnt/fast_disk/pg_ts" is not empty
-- Решение (в консоли ОС):
# 1. Проверьте содержимое каталога:
ls -la /mnt/fast_disk/pg_ts
# 2. Очистите пустой каталог (убедившись, что там нет боевых данных!):
rm -rf /mnt/fast_disk/pg_ts/*
# 3. Выполните повторно в psql:
CREATE TABLESPACE fast_space LOCATION '/mnt/fast_disk/pg_ts';
3. Сценарий: Конфликт OID при создании базы данных (CREATE DATABASE)
Если процесс создания базы был прерван сигналом SIGKILL, в каталоге $PGDATA/base/ могла остаться папка со старым OID:
-- 1. Найдите OID всех зарегистрированных баз данных:
SELECT oid, datname FROM pg_database;
-- 2. Сравните с папками в $PGDATA/base/ (в терминале Linux):
cd /var/lib/postgresql/data/base/
ls -d */
-- 3. Если в каталоге есть папка с номером, которого НЕТ в pg_database, переместите ее в бэкап:
mv 24512 /tmp/orphaned_24512
4. Проверка остаточных файлов после аварийного сбоя реляций
Если таблица не создается из-за дубликата relfilenode, выполните полную проверку целостности каталога через VACUUM FULL системных таблиц.
Частые вопросы (FAQ)
Откуда берутся файлы-сироты (orphaned files), вызывающие 58P02?
Они возникают в результате аварийной жесткой перезагрузки сервера (hard reset) во время выполнения тяжелых DDL операций, либо при ручном восстановлении отдельных папок из резервных копий.
Можно ли просто удалить конфликтующий файл через rm?
Только после строгой проверки, что данный файл/папка не зарегистрированы в системных каталогах pg_class, pg_database или pg_tablespace.
Как избежать конфликтов при автоматическом тестировании баз 1С?
Всегда проверяйте успешность завершения DROP DATABASE перед вызовом CREATE DATABASE и используйте уникальные постфиксы времени в именах временных баз.
Каковы правильные права доступа к создаваемым каталогам табличных пространств?
Каталог должен принадлежать пользователю postgres с маской прав 0700 (drwx------).