Инструкция по переносу данных между базами PostgreSQL

18.02.26

База данных - Администрирование СУБД

Копирование данных между различными базами на Постгресе.

Всем реляционный привет!

Решил написать небольшой гайд о том, как скопировать данные таблиц между различными базами Постгреса, расположенными как на одном сервере, так и на разных серверах. Картинок здесь будет мало, т.к. весь процесс проходит в чёрной консоли (если у вас не чёрная, напишите про это в комментах).

Где это может пригодиться? Например, вы решили вынести хранение файлов из эсной базы во внешнюю БД, или решили скопировать часть таблиц(ы) на другой сервер.

Кто работает с Микрософтовым SQL, те знают, что там достаточно легко можно скопировать данные одной базы в другую, расположенную на этом же сервере через конструкцию, типа

INSERT INTO dst_table
(field1, field2, ..., fieldX)
SELECT field01, field02, ..., field0X
FROM other_db.dbo.src_table
...

Но Постгрес устроен по-другому, и в определенный момент времени вы работаете только с одной конкретной базой. Поэтому через "INSERT INTO SELECT" данные между базами НЕ перенесутся. Для этого надо создать "прилинкованный" сервер. Поможет нам в этом расширение "postgres_fdw".

 

Инструкция составлялась на основании экспериментов с Postgres Pro 1c (17.4), а также Linux Ubuntu 24.04.2 (но будет работать на любом постгресе и лине)

Подразумевается, что у вас Linux и PostgreSQL установлены без каких-либо кастомизированных настроек.

 

Для начала потребуется установить на клиентскую машину (с которой вы будете взаимодействовать с серверами СУБД) клиентский софт для подключения к серверу постгреса (в т.ч. утилиту psql):

sudo apt install postgrespro-1c-17-client

а также дополнительное ПО (в т.ч. утилиту pg_config):

sudo apt install postgrespro-1c-17-dev

Далее необходимо создать символическую ссылку:

sudo ln -s /opt/pgpro/1c-17/bin/pg_config /usr/bin/pg_config

(обратите внимание, что у вас вместо «1c-17» может быть «std-17» или «ent-17» или что-либо другое)

 

Далее выполняем скрипты в PostgreSQL (можно в любом менеджере, например, PGAdmin, DBeaver, <ПодставьСвоё> или в консольной утилите psql для текущей БД «current_db», в которую будут переноситься данные).

Подключим расширение:

CREATE EXTENSION IF NOT EXISTS postgres_fdw;

 

 

Создадим внешний сервер:

CREATE SERVER IF NOT EXISTS pg_outer
FOREIGN DATA WRAPPER postgres_fdw
OPTIONS (dbname 'my_db', host '127.0.0.1', port '5432');

(здесь «pg_outer» - имя создаваемого внешнего (прилинкованного) сервера, «my_db» - имя базы на внешнем или текущем сервере PostgreSQL, из которой будут копироваться данныеhost и port для текущего сервера можно не прописывать)

 

Создадим сопоставление пользователя:

CREATE USER MAPPING IF NOT EXISTS FOR postgres
SERVER pg_outer 
OPTIONS (user 'postgres_outer', password 'YOUR_SECRET_PASSWORD');

(здесь мы связали пользователя postgres текущей базы с пользователем postgres_outer внешней базы)

 

Дадим права пользователю на доступ к данным на внешнем сервере:

GRANT USAGE ON FOREIGN SERVER pg_outer TO postgres;

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

 

 

Создадим внешние таблицы:

CREATE FOREIGN TABLE IF NOT EXISTS data_files (
_fld6789rref bytea NOT NULL,
_fld6790 numeric(10,0) NOT NULL,
_fld16791 timestamp without time zone NOT NULL,
_fld6792 timestamp without time zone NOT NULL,
_fld6793 numeric(16,0) NOT NULL,
_fld16246rref bytea NOT NULL,
_fld6794 bytea NOT NULL,
_fld7889 mvarchar(36) NOT NULL)
SERVER pg_outer
OPTIONS (schema_name 'public', table_name '_inforg4321');

(здесь приведён пример для одной таблицы, но вам надо создать связи для всех таблиц, из которых вы собираетесь копировать данные; каждая таблица создаётся по структуре такой же, как и исходная во внешней базе; «data_files» - имя таблицы, по которому мы будем обращаться к внешней таблице для чтения данных)

* здесь используется постгреспрошный тип данных mvarchar - чтобы его заюзать, установите расширение mchar (CREATE EXTENSION IF NOT EXISTS mchar;)

 

 

На этом шаге у нас завершаются подготовительные работы. Теперь можно перейти непосредственно к самому переносу данных из одной базы в другую.

Возвращаемся в терминал Linux

Переключимся на пользователя postgres:

sudo su - postgres

 

Теперь мы должны создать в текущей базе таблицы (если таковых ещё нет), куда мы будем копировать данные, например:

psql -d current_db -c 'CREATE TABLE IF NOT EXISTS files ( id bytea NOT NULL, file bytea NOT NULL, descr mvarchar(36) NOT NULL, CONSTRAINT files_pkey PRIMARY KEY (id) )'

 

 

Ну и наконец, финальный шаг, копирование данных:

psql -d current_db -c 'copy (select _fld6789rref, _fld6794, _fld7889 from data_files) to stdout;' | psql -d current_db -c 'copy files (id, file, descr) from stdin;'

Копирование идёт достаточно быстро, т.к. осуществляется через конвейер. Через некоторое время копирование выполнится с выводом результата о количестве скопированных записей.

 

 

На этом перенос завершён!

Если контент вам зашёл, не стесняйтесь голосовать. Так я увижу вашу заинтересованность и буду писать исчо. Например, подобную инструкцию по переносу из MSSQL в PostgreSQL .

Не забывайте навещать мой гитхаб

Всем быстрых запросов!

Вступайте в нашу телеграмм-группу Инфостарт

SQL PostgreSQL СУБД Постгрес postgres перенос копирование инструкция гайд

См. также

HighLoad оптимизация Администрирование СУБД 1С:Предприятие 8 Бесплатно (free)

В статье рассматриваются текущие возможности горизонтального масштабирования СУБД для 1С, а также какое решение предлагает Tantor Postgres.

02.02.2026    861    Tantor    3    

8

Администрирование СУБД Технологический журнал Мониторинг Системный администратор Программист Бесплатно (free)

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

15.12.2025    4097    tystik    1    

8

HighLoad оптимизация Администрирование СУБД 1С:Предприятие 8 1С:ERP Управление предприятием 2 Бесплатно (free)

Завершаем цикл статей по совместному докладу Алены Генераловой и Александра Симонова на INFOSTART TECH EVENT 2025 о нагрузочном тестировании (НТ) на 30 000 АРМ на машине баз данных Tantor XData. В заключительной части расскажем о том, что нас ждало при запусках теста, и какие доработки СУБД Tantor Postgres были сделаны, чтобы его пройти с высоким результатом.

27.11.2025    2880    Tantor    28    

16

HighLoad оптимизация Администрирование СУБД Программист Бесплатно (free)

Продолжаем знакомить вас с улучшениями СУБД Tantor Postgres для работы с продуктами 1С. В рамках предыдущей статьи мы разобрали арсенал специализированных функций, призванных существенно ускорить выполнение типичных для 1С операций, снизить нагрузку на инфраструктуру и упростить администрирование. Сегодня мы рассмотрим, с какими проблемами можно столкнуться при высоких значениях default_statistics_target, расскажем о новых оптимизациях для ускорения выполнения запросов, и, конечно, коснемся временных таблиц.

11.11.2025    1851    Tantor    10    

5

Администрирование СУБД 1С:Элемент Системный администратор Программист Бесплатно (free)

1С:Управление ландшафтом – это инструмент, способный объединить десятки разрозненных систем, серверов и баз данных в единое управляемое пространство, где установка, обновление, администрирование и контроль за инфраструктурой 1С происходят из одной точки, а рутинные задачи решаются за пару минут. Расскажем о том, как сделать свой ИТ-ландшафт управляемым.

23.10.2025    4819    user2169944    2    

14

Администрирование СУБД Программист 1С:Предприятие 8 Россия Бесплатно (free)

Ошибка реструктуризации: "Запись не найдена в менеджере имен баз данных". Диагностика и решение проблемы.

22.08.2025    3267    a13k55    0    

17
Для отправки сообщения требуется регистрация/авторизация