Создание копии базы данных — одна из самых частых задач системного администратора при работе с экосистемой 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 является одной из первых точек преткновения.
Основные причины неудачи:
pg_dump от стандартной версии PostgreSQL для базы с патчами от "1С".Проанализируем самый надежный алгоритм, который гарантирует отсутствие конфликтов имен. Этот метод подразумевает полное удаление старой целевой базы перед разворачиванием копии. Рассмотрим шаги, которые необходимо выполнить:
1C:Enterprise 8.3 Server Agent. Если этого не сделать, менеджер кластера будет постоянно переподключаться к базе, блокируя ее.Query Tool для принудительного разрыва связей:
SELECT pg_terminate_backend(pid)
FROM pg_stat_activity
WHERE datname = 'имя_вашей_базы'
AND pid <> pg_backend_pid();
DROP DATABASE "BASE_COPY"; и создаем ее заново CREATE DATABASE "BASE_COPY" WITH OWNER = postgres ENCODING = 'UTF8';.Restore через pgAdmin.Если вы хотите восстанавливать базу в уже существующую структуру без ее удаления, выясним, какие настройки необходимо указать в интерфейсе pgAdmin 4. При запуске задачи восстановления перейдите на вкладку "Options" (Параметры):
В разделе "Type of objects" и "Do not save" важно обратить внимание на следующие флаги:
DROP перед командами создания объектов. Это решит проблему relation already exists.Clean, чтобы система не выдавала ошибок, если какого-то объекта в базе еще нет.Рассмотрим стандартный набор параметров, который часто используется в скриптах:
--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"
Для баз 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 именно вашего установленного сервера.
Пошагово настроим пути:
C:\Program Files\PostgreSQL\12.5-3.1C\bin.При создании копий для тестирования (например, из рабочей базы в тестовую) придерживайтесь следующей стратегии:
Во-первых, всегда проверяйте владельца базы. В 1С объекты должны принадлежать той роли, под которой сервер 1С подключается к СУБД. Если вы создали базу под пользователем postgres, а 1С подключается под v8user, могут возникнуть проблемы с правами на таблицы.
Во-вторых, после создания копии обязательно измените заголовок базы в 1С и заблокируйте регламентные задания, чтобы тестовая база не начала обмениваться данными с реальными внешними сервисами (например, отправлять реальные счета клиентам или синхронизироваться с сайтом). Если для тестов требуется очистить копию от лишней информации, используйте инструменты выборочного удаления данных организаций.
В-третьих, если вы используете расширения (extensions) в PostgreSQL, убедитесь, что они установлены в целевой базе до начала восстановления. Хотя 1С редко требует специфических расширений в "коробочных" версиях, в доработанных конфигурациях это может стать критичным фактором.
Соблюдение этих шагов позволит вам создавать идентичные копии баз данных для разработки и тестирования, минимизируя риски повреждения данных и экономя время на отладку серверной части 1С. Контроль результата и поиск расхождений после переноса осуществляется через инструмент для автоматической сверки проводок между базами 1С.