При работе со связкой 1С:Предприятие и PostgreSQL системные администраторы часто сталкиваются с ситуацией, когда попытка создания новой информационной базы завершается неудачей. Одной из самых коварных ошибок является сообщение The database subdirectory is missing. Это состояние указывает на серьезный разрыв между тем, что СУБД «думает» о наличии базы, и тем, что реально существует на жестком диске. В этой статье мы подробно разберем причины этой проблемы, проанализируем влияние сетевых протоколов и составим план восстановления работоспособности сервера.
Рассмотрим механизм создания базы. Когда платформа 1С инициирует создание новой базы, PostgreSQL выполняет команду CREATE DATABASE. В этот момент СУБД копирует содержимое системного шаблона (обычно template1) в новую директорию внутри папки data/base/. Каждой базе присваивается уникальный числовой идентификатор (OID), который становится именем папки.
Если в процессе копирования происходит сбой (проблема с правами, блокировка антивирусом или аппаратный сбой диска), может возникнуть ситуация, когда запись в системной таблице pg_database уже появилась, а физическая папка на диске отсутствует или пуста. При последующих попытках обращения к этой базе PostgreSQL выдает ошибку: DETAIL: The database subdirectory "base/60864287" is missing.
Проанализируем логи СУБД, представленные в обсуждении. Часто ошибка создания базы сопровождается сообщениями вида FATAL: no pg_hba.conf entry for host "fe80::...". Это указывает на то, что сервер 1С пытается авторизоваться в PostgreSQL, используя протокол IPv6, для которого в конфигурационном файле нет разрешающих правил.
Даже если вы отключали IPv6 в свойствах сетевого адаптера, Windows может продолжать использовать так называемые Link-Local адреса. Выясним причину, выполнив команду ping localhost. Если в ответе вы видите ::1 или 0:0:1:0 вместо привычного 127.0.0.1, значит, IPv6 активен и влияет на работу сокета.
Для исправления ситуации выполним следующие действия в файле pg_hba.conf:
# IPv4 local connections:
host all all 127.0.0.1/32 md5
host all all 0.0.0.0/0 md5
# IPv6 local connections:
host all all ::1/128 md5
host all all ::0/0 md5
Обратите внимание на строку host all all ::0/0 md5. Она позволяет подключаться с любого IPv6 адреса. Также рекомендуется проверить файл hosts по адресу C:\Windows\System32\drivers\etc\hosts и закомментировать строку ::1 localhost, чтобы принудительно использовать IPv4.
Поскольку любая новая база в PostgreSQL — это клон шаблона, разберем ситуацию, когда поврежден сам источник. Если папка base/1 (соответствующая template1) содержит битые файлы или поврежденные индексы, создание любой новой базы будет выдавать ошибку missing subdirectory.
Попробуем диагностировать состояние шаблонов. Запустим консоль psql и выполним команду вывода списка баз:
psql -U postgres -l
Если в списке отображаются базы с некорректными параметрами или если вы не можете войти в template1, выполнив psql -U postgres -d template1, значит, шаблон поврежден. В этом случае лучшим решением будет пересоздание кластера баз данных, так как ручное восстановление системных таблиц крайне рискованно.
Выясним, не препятствуют ли сторонние программы созданию файлов СУБД. Процесс postgres.exe должен иметь беспрепятственный доступ к своей директории Data. Разберем основные факторы риска:
base, считая это подозрительной активностью. Добавим папку с данными PostgreSQL в исключения.PostgreSQL должна быть запущена от имени пользователя (обычно postgres), который обладает правами «Полный доступ» на всю иерархию папок Data. Проверим это в свойствах папки на вкладке «Безопасность».Read Only на доли секунды, транзакция создания базы завершится ошибкой «missing».Если в psql -l вы видите базу, которая помечена как существующая, но физически папки нет, ее необходимо удалить. Платформа 1С не сможет создать базу с тем же именем, пока в системном каталоге СУБД есть запись о старой попытке.
Выполним команду удаления в консоли psql:
DROP DATABASE "имя_вашей_базы";
Если команда DROP DATABASE не отрабатывает из-за отсутствия файлов, это подтверждает критическое повреждение структуры кластера.
Если вышеописанные методы настройки сети и прав не помогли, рассмотрим радикальный, но наиболее надежный путь, предложенный опытными администраторами:
.dt средствами 1С (если базы открываются) и утилиту pg_dump для создания SQL-дампов.postgresql.Data в надежное место в качестве архивной копии.Data и инициализируем новый кластер с помощью команды initdb (или путем переустановки СУБД).Важный момент: при использовании платформы 1С версии 8.3.19.1150 и выше, старайтесь создавать базу через саму платформу («Добавить» -> «Создание новой информационной базы»), а не через консоль администрирования серверов 1С. Это позволяет избежать некоторых проблем с таймаутами при инициализации таблиц.