Как правильно создать копию базы 1С на PostgreSQL и избежать ошибки relation already exists

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

Создание копии базы данных — одна из самых частых задач системного администратора при работе с экосистемой 1С. Однако при использовании связки 1С:Предприятие и PostgreSQL через стандартные средства pgAdmin 4 пользователи часто сталкиваются с прерыванием процесса и ошибкой Failed (exit code 1). Проанализируем типичную ситуацию: при попытке развернуть бэкап в существующую или вновь созданную базу система выдает сообщение ERROR: relation "byshow" already exists. Это происходит потому, что в целевой базе уже присутствуют объекты (таблицы, индексы), которые PostgreSQL пытается создать повторно.

В этой статье мы подробно разберем, как правильно подготовить среду для восстановления, какие настройки pg_restore использовать и как автоматизировать процесс клонирования базы без ошибок.

Причины возникновения ошибок при восстановлении

Разберем ситуацию, когда при восстановлении возникает ошибка relation already exists. Это классический конфликт имен в PostgreSQL. Если вы восстанавливаете данные в базу, которая не была предварительно полностью очищена, утилита восстановления пытается выполнить команду CREATE TABLE или CREATE INDEX для объектов, которые там уже есть. В частности, индекс byshow в системной таблице 1С v8users является одной из первых точек преткновения.

Основные причины неудачи:

  1. Активные сессии: Служба 1С или фоновые задания удерживают соединения с базой, не давая ее удалить или изменить.
  2. Остаточные данные: Попытка восстановить бэкап "поверх" старой структуры без флага очистки.
  3. Несоответствие версий: Использование бинарных файлов pg_dump от стандартной версии PostgreSQL для базы с патчами от "1С".

Метод 1: Полное пересоздание базы данных (надежный способ)

Проанализируем самый надежный алгоритм, который гарантирует отсутствие конфликтов имен. Этот метод подразумевает полное удаление старой целевой базы перед разворачиванием копии. Рассмотрим шаги, которые необходимо выполнить:

  1. Остановка службы 1С: Прежде всего, необходимо остановить службу 1C:Enterprise 8.3 Server Agent. Если этого не сделать, менеджер кластера будет постоянно переподключаться к базе, блокируя ее.
  2. Удаление базы из кластера 1С: Рекомендуется удалить регистрацию базы в консоли администрирования 1С.
  3. Принудительное завершение соединений в PostgreSQL: Даже после остановки 1С могут остаться "зависшие" процессы. Выполним SQL-запрос в Query Tool для принудительного разрыва связей:

SELECT pg_terminate_backend(pid) 
FROM pg_stat_activity 
WHERE datname = 'имя_вашей_базы' 
AND pid <> pg_backend_pid();
  1. Удаление и создание базы: Удаляем старую базу DROP DATABASE "BASE_COPY"; и создаем ее заново CREATE DATABASE "BASE_COPY" WITH OWNER = postgres ENCODING = 'UTF8';.
  2. Восстановление данных: Теперь, когда база абсолютно пуста, запускаем Restore через pgAdmin.

Метод 2: Настройка параметров очистки в pgAdmin

Если вы хотите восстанавливать базу в уже существующую структуру без ее удаления, выясним, какие настройки необходимо указать в интерфейсе pgAdmin 4. При запуске задачи восстановления перейдите на вкладку "Options" (Параметры):

В разделе "Type of objects" и "Do not save" важно обратить внимание на следующие флаги:

Рассмотрим стандартный набор параметров, который часто используется в скриптах:


--username "postgres" 
--no-password 
--role "postgres" 
--dbname "my_test_db" 
--clean 
--if-exists 
--section=pre-data --section=data --section=post-data 
--verbose "path_to_backup/file.backup"

Метод 3: Использование командной строки для крупных баз

Для баз 1С объемом более 50-100 Гб использование графического интерфейса pgAdmin неэффективно. Проанализируем, как ускорить процесс с помощью утилиты pg_restore. Главное преимущество здесь — многопоточность.

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


pg_restore -h localhost -p 5432 -U postgres -d BASE_COPY -j 4 -v "C:\Backup\1c_prod.backup"

В данном примере параметр -j 4 запускает восстановление в 4 потока, что существенно сокращает время простоя системы. Обратите внимание, что для использования многопоточности формат бэкапа должен быть Custom (сжатый формат PostgreSQL), а не простой SQL-текст.

Настройка путей к бинарным файлам

Выясним еще одну неочевидную причину ошибки Exit code 1. Часто она связана с тем, что pgAdmin использует свои встроенные утилиты pg_dump, версия которых отличается от версии сервера PostgreSQL 12.5-3.1C. Для корректной работы с базами 1С крайне важно прописать пути к папке bin именно вашего установленного сервера.

Пошагово настроим пути:

  1. Откройте File -> Preferences.
  2. Перейдите в раздел Paths -> Binary paths.
  3. Найдите строку PostgreSQL Binary Path и укажите путь к установленной версии, например: C:\Program Files\PostgreSQL\12.5-3.1C\bin.
  4. Нажмите Save и перезапустите pgAdmin.

Важные рекомендации по работе с базами 1С

При создании копий для тестирования (например, из рабочей базы в тестовую) придерживайтесь следующей стратегии:

Во-первых, всегда проверяйте владельца базы. В 1С объекты должны принадлежать той роли, под которой сервер 1С подключается к СУБД. Если вы создали базу под пользователем postgres, а 1С подключается под v8user, могут возникнуть проблемы с правами на таблицы.

Во-вторых, после создания копии обязательно измените заголовок базы в 1С и заблокируйте регламентные задания, чтобы тестовая база не начала обмениваться данными с реальными внешними сервисами (например, отправлять реальные счета клиентам или синхронизироваться с сайтом). Если для тестов требуется очистить копию от лишней информации, используйте инструменты выборочного удаления данных организаций.

В-третьих, если вы используете расширения (extensions) в PostgreSQL, убедитесь, что они установлены в целевой базе до начала восстановления. Хотя 1С редко требует специфических расширений в "коробочных" версиях, в доработанных конфигурациях это может стать критичным фактором.

Соблюдение этих шагов позволит вам создавать идентичные копии баз данных для разработки и тестирования, минимизируя риски повреждения данных и экономя время на отладку серверной части 1С. Контроль результата и поиск расхождений после переноса осуществляется через инструмент для автоматической сверки проводок между базами 1С.

← На главную