К статье
Практический материал

Администрирование · 11 мин

Как сделать копию базы 1С в PostgreSQL

Как сделать копию базы 1С в PostgreSQL: pg_dump, pg_basebackup, копия через createdb, снятие нагрузки с рабочего сервера, проверка восстановления и типичные ошибки.

База 1С в клиент-серверном варианте на PostgreSQL — это обычная база данных, с которой работают стандартные инструменты СУБД: pg_dump, pg_basebackup, createdb. При этом у копирования есть специфика: база должна быть консистентной, версия PostgreSQL при переносе должна совпадать, а доступ к базе через консоль кластера 1С часто требует корректного завершения сеансов. Ошибка на любом из этих шагов приводит либо к битой копии, либо к остановке работы пользователей.

Выбор способа зависит от цели. Для тестовой копии на том же сервере достаточно createdb с шаблоном или pg_dump с восстановлением в новую базу. Для резервного копирования на случай аварии нужен pg_dump в custom-формате или физическая копия через pg_basebackup. Для миграции на другой сервер с другой версией PostgreSQL подходит только логический дамп.

Ниже разобраны рабочие способы с командами, условиями выбора, проверкой результата и типичными ошибками. Все команды выполняются от пользователя с правами суперпользователя PostgreSQL (обычно postgres) либо от владельца базы.

Какой способ копирования выбрать

Существует три практических подхода, и у каждого своя область применения. Логический дамп (pg_dump) создаёт файл с командами, воспроизводящими структуру и данные; его можно развернуть на другом сервере и даже на другой версии PostgreSQL. Физическая копия (pg_basebackup или копирование каталога данных) дублирует кластер побайтово — быстро, но только на ту же версию СУБД и ту же архитектуру. Копирование через шаблон (createdb -T) — самый быстрый способ получить клон базы внутри одного сервера.

Сравнение способов копирования

pg_dump + pg_restore

Универсально: перенос между серверами и версиями. Минус — медленно на больших базах, требует места под файл дампа.

createdb -T (шаблон)

Мгновенная копия внутри одного сервера. Ограничение: к исходной базе не должно быть активных подключений.

pg_basebackup

Копия всего кластера для аварийного восстановления. Не подходит для копии одной базы отдельно и для смены версии PostgreSQL.

Выгрузка .dt из 1С

Независима от СУБД, удобна для переноса между платформами. Минус — долго на больших базах и требует монопольного режима.

Если задача — «сделать копию базы 1С для тестов на этом же сервере», выбирайте createdb с шаблоном. Если нужен файл-архив, который можно хранить и разворачивать где угодно, — pg_dump в формате custom. Если речь о резервном копировании всего сервера 1С — pg_basebackup с архивацией WAL.

Подготовка: сеансы, права и свободное место

Перед копированием проверьте три вещи. Первое — активные подключения к базе: pg_dump умеет снимать консистентный снапшот при работающих пользователях, но createdb -T завершится ошибкой, если к исходной базе кто-то подключён. Второе — права: учётная запись, от которой выполняется команда, должна иметь право чтения всех объектов базы; проще всего работать от postgres. Третье — свободное место на диске: дамп большой базы в несжатом виде может занимать объём, сопоставимый с размером данных.

Активные сеансы к конкретной базе можно посмотреть запросом к pg_stat_activity и при необходимости завершить их принудительно. Со стороны 1С сеансы корректнее закрывать через консоль кластера серверов 1С — так пользователи получат предупреждение, а не обрыв соединения.

sql
SELECT pid, usename, application_name, state FROM pg_stat_activity WHERE datname = 'base1c';
SELECT pg_terminate_backend(pid) FROM pg_stat_activity WHERE datname = 'base1c' AND pid <> pg_backend_pid();

Копия через pg_dump и pg_restore

Основной рабочий инструмент — pg_dump с флагом -Fc (custom-формат). Такой дамп сжат, поддерживает параллельное восстановление и выборочное извлечение объектов. Команда снимает консистентный снапшот базы, поэтому пользователи могут продолжать работать — копия будет соответствовать состоянию базы на момент старта дампа.

bash
sudo -u postgres pg_dump -Fc -f /backup/base1c_$(date +%Y%m%d).dump base1c

Восстановление выполняется в два шага: создаётся пустая база, затем в неё разворачивается дамп через pg_restore. Флаг -j ускоряет процесс за счёт параллельных потоков, но работает только с форматами custom и directory.

bash
sudo -u postgres createdb base1c_copy
sudo -u postgres pg_restore -d base1c_copy -j 4 /backup/base1c_20260101.dump

После восстановления новую базу нужно зарегистрировать в кластере серверов 1С: в консоли кластера создайте новую информационную базу, указав тот же сервер СУБД и имя base1c_copy. Параметры «создавать базу данных» при этом включать не нужно — база уже существует.

Порядок действий при копировании через дамп
  1. 1
    Уведомите пользователей и при необходимости заблокируйте новые сеансы
  2. 2
    Снимите дамп: pg_dump -Fc -f файл база
  3. 3
    Создайте пустую базу: createdb имя_копии
  4. 4
    Разверните дамп: pg_restore -d имя_копии -j 4 файл
  5. 5
    Зарегистрируйте копию в консоли кластера 1С
  6. 6
    Проверьте вход в копию и целостность данных

Быстрая копия на том же сервере через createdb -T

PostgreSQL умеет создавать базу как копию существующей через механизм шаблонов. Команда createdb -T base1c base1c_copy выполняется за секунды или минуты даже для больших баз, потому что данные копируются на уровне файлов внутри кластера. Это оптимальный способ сделать тестовую копию перед обновлением конфигурации.

bash
sudo -u postgres createdb -T base1c base1c_copy

Ключевое ограничение: во время копирования к исходной базе не должно быть ни одного активного подключения, включая фоновые процессы самого PostgreSQL, подключённые именно к этой базе. Иначе получите ошибку «source database is being accessed by other users». Поэтому способ применим в нерабочее время или после принудительного завершения сеансов.

Физическая копия кластера через pg_basebackup

Когда нужно скопировать не одну базу, а весь сервер 1С со всеми информационными базами, ролями и настройками, используется pg_basebackup. Утилита создаёт бинарную копию всего каталога данных по протоколу репликации, не останавливая работу сервера. Для её работы на сервере должны быть настроены параметры wal_level, max_wal_senders и разрешение на подключение репликации в pg_hba.conf.

bash
sudo -u postgres pg_basebackup -h 127.0.0.1 -U postgres -D /backup/cluster_copy -Fp -Xs -P

Полученный каталог можно использовать как основу для резервного сервера или для развёртывания полного клона на другой машине с той же версией PostgreSQL. Учитывайте: отдельную базу из такой копии «вытащить» штатными средствами нельзя — придётся поднимать весь кластер и уже из него делать pg_dump нужной базы.

Альтернатива: выгрузка .dt средствами 1С

Выгрузка информационной базы в файл .dt через конфигуратор не зависит от СУБД и переносит данные между платформами — например, с PostgreSQL на MS SQL или в файловый вариант. Это единственный способ, если копия должна быть независимой от инфраструктуры СУБД. Недостатки: требуется монопольный доступ, процесс на больших базах занимает часы, а файл .dt нередко оказывается больше дампа pg_dump.

Практическая рекомендация: для регулярных копий и тестовых сред используйте инструменты PostgreSQL, а .dt оставьте для миграций между СУБД и для передачи базы внешним специалистам, у которых нет доступа к вашему кластеру.

Типичные ошибки
01
Копирование каталога данных PostgreSQL при работающем сервере — получается неконсистентная копия, которая не запустится
02
Восстановление дампа на другую мажорную версию PostgreSQL без проверки совместимости — ошибки при pg_restore или в работе 1С
03
Забытая регистрация копии в консоли кластера 1С — база в СУБД есть, но пользователи её не видят
04
Отсутствие проверки восстановления — дамп делается регулярно, но ни разу не разворачивался, и в критический момент оказывается битым
05
createdb -T при активных сеансах — ошибка и потерянное время вместо копии

Проверка результата и автоматизация

Копия считается рабочей только после проверки восстановления. Минимальный контроль: pg_restore завершился без ошибок (код возврата 0), база открывается в psql, количество записей в ключевых таблицах совпадает с источником, в копию можно войти через клиент 1С. Для регулярных копий настройте автоматическую проверку — например, ночное восстановление свежего дампа в отдельную базу с отчётом об ошибках.

Контрольные точки

Как проверить результат

Код возврата pg_dump / pg_restore
Норма

0, в логе нет ERROR

Тревожный признак

Ненулевой код, сообщения об ошибках — дамп неполный

Размер дампа
Норма

Сопоставим с предыдущими копиями этой же базы

Тревожный признак

Резкое уменьшение размера без причины — возможен обрыв выгрузки

Вход в копию через 1С
Норма

База открывается, отчёты строятся за последние даты

Тревожный признак

Ошибки подключения или пустые данные

Число строк в контрольных таблицах
Норма

Совпадает с источником на момент копирования

Тревожный признак

Расхождения — копия снята некорректно

Автоматизация сводится к скрипту в cron или планировщике systemd: pg_dump с ротацией файлов по дате, контроль кода возврата, отправка уведомления при ошибке. Храните копии на отдельном диске или сервере — дамп, лежащий на том же массиве, что и база, не спасёт при отказе оборудования.

Итог

Что важно запомнить

Для копии базы 1С в PostgreSQL чаще всего достаточно pg_dump -Fc с последующим pg_restore; на одном сервере быстрее использовать createdb -T, для всего кластера — pg_basebackup. Перед копированием контролируйте сеансы, после — обязательно проверяйте восстановление и регистрируйте копию в консоли кластера 1С.

Частые вопросы

Можно ли снять дамп pg_dump, не отключая пользователей 1С?

Да. pg_dump работает с консистентным снапшотом и не блокирует базу: пользователи продолжают работать, а копия отражает состояние на момент старта дампа. Учитывайте лишь дополнительную нагрузку на дисковую подсистему — на сильно загруженном сервере дамп лучше снимать в нерабочие часы.

Почему createdb -T выдаёт ошибку «source database is being accessed by other users»?

К исходной базе есть хотя бы одно активное подключение — сеанс пользователя, зависший фоновый процесс или подключение сервера 1С. Найдите подключения через pg_stat_activity, завершите их через pg_terminate_backend и повторите команду. Альтернатива без отключения пользователей — pg_dump.

Как перенести базу 1С на сервер с более новой версией PostgreSQL?

Только логическим способом: снимите pg_dump на старом сервере (желательно утилитой от новой версии PostgreSQL) и разверните pg_restore на новом. Физическое копирование каталога данных между мажорными версиями не работает — форматы хранения несовместимы.

Достаточно ли выгрузки .dt для резервного копирования?

Для большинства случаев — да, .dt содержит все данные и конфигурацию. Но выгрузка требует монопольного режима и выполняется долго, поэтому для ежедневных копий удобнее pg_dump. Оптимальная схема: регулярные дампы PostgreSQL плюс периодическая выгрузка .dt как независимая от СУБД копия.

Копия восстановилась, но 1С не видит базу. Что делать?

База в PostgreSQL и информационная база в кластере 1С — разные сущности. Откройте консоль кластера серверов 1С, создайте новую информационную базу и укажите существующую базу данных на сервере СУБД, не включая создание новой. Также проверьте, что пользователь СУБД, под которым работает сервер 1С, имеет права на восстановленную базу.

Сколько места нужно под дамп базы 1С?

Точный размер зависит от данных и степени сжатия. Дамп в формате custom обычно заметно меньше объёма базы за счёт сжатия, но планировать хранилище стоит с запасом: размер базы плюс несколько поколений копий. Проверять актуальный объём базы можно запросом SELECT pg_size_pretty(pg_database_size('base1c')).