Почему при создании базы 1С в PostgreSQL возникает ошибка base/xxxxxx is missing и как ее исправить

Системный администратор 1С v8.3 (Управляемые формы) IT и автоматизация бизнеса
← На главную

При работе со связкой 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.

Шаг 1. Анализ сетевых настроек и влияния IPv6

Проанализируем логи СУБД, представленные в обсуждении. Часто ошибка создания базы сопровождается сообщениями вида 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.

Шаг 2. Проверка целостности шаблонов template0 и template1

Поскольку любая новая база в PostgreSQL — это клон шаблона, разберем ситуацию, когда поврежден сам источник. Если папка base/1 (соответствующая template1) содержит битые файлы или поврежденные индексы, создание любой новой базы будет выдавать ошибку missing subdirectory.

Попробуем диагностировать состояние шаблонов. Запустим консоль psql и выполним команду вывода списка баз:

psql -U postgres -l

Если в списке отображаются базы с некорректными параметрами или если вы не можете войти в template1, выполнив psql -U postgres -d template1, значит, шаблон поврежден. В этом случае лучшим решением будет пересоздание кластера баз данных, так как ручное восстановление системных таблиц крайне рискованно.

Шаг 3. Устранение блокировок файловой системы

Выясним, не препятствуют ли сторонние программы созданию файлов СУБД. Процесс postgres.exe должен иметь беспрепятственный доступ к своей директории Data. Разберем основные факторы риска:

  1. Антивирусное ПО: Часто защитные системы блокируют создание множества мелких файлов в папке base, считая это подозрительной активностью. Добавим папку с данными PostgreSQL в исключения.
  2. Права доступа: Служба PostgreSQL должна быть запущена от имени пользователя (обычно postgres), который обладает правами «Полный доступ» на всю иерархию папок Data. Проверим это в свойствах папки на вкладке «Безопасность».
  3. Аппаратная нестабильность: Как отмечалось в исходном обсуждении, проблемы с сетевыми картами и контроллерами могут приводить к кратковременным сбоям записи. Если диск переходит в режим Read Only на доли секунды, транзакция создания базы завершится ошибкой «missing».

Шаг 4. Очистка «фантомных» баз

Если в psql -l вы видите базу, которая помечена как существующая, но физически папки нет, ее необходимо удалить. Платформа 1С не сможет создать базу с тем же именем, пока в системном каталоге СУБД есть запись о старой попытке.

Выполним команду удаления в консоли psql:

DROP DATABASE "имя_вашей_базы";

Если команда DROP DATABASE не отрабатывает из-за отсутствия файлов, это подтверждает критическое повреждение структуры кластера.

Рекомендованный план действий для восстановления

Если вышеописанные методы настройки сети и прав не помогли, рассмотрим радикальный, но наиболее надежный путь, предложенный опытными администраторами:

  1. Выполним резервное копирование всех работоспособных баз. Используем для этого выгрузку в .dt средствами 1С (если базы открываются) и утилиту pg_dump для создания SQL-дампов.
  2. Остановим службу postgresql.
  3. Скопируем текущую папку Data в надежное место в качестве архивной копии.
  4. Удалим содержимое папки Data и инициализируем новый кластер с помощью команды initdb (или путем переустановки СУБД).
  5. Рекомендуется обновить версию PostgreSQL до поддерживаемой вашей платформой 1С (например, переход на версию 12 или 14, если позволяет платформа 8.3.19+).
  6. Восстановим базы из резервных копий.

Важный момент: при использовании платформы 1С версии 8.3.19.1150 и выше, старайтесь создавать базу через саму платформу («Добавить» -> «Создание новой информационной базы»), а не через консоль администрирования серверов 1С. Это позволяет избежать некоторых проблем с таймаутами при инициализации таблиц.

← На главную