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

19.02.26

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

Копирование данных из Мелкомягкого сиквела в Постгрес.

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

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

Пристегнитесь и погнали, да пребудет с вами декларативный дух!

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

Инструкция составлялась на основании экспериментов с Postgres Pro 1c (17.4) на Linux Ubuntu 24.04.2 LTS и Microsoft SQL Server 2019 Developer Edition (15.0.4455.2) на Windows 11 Enterprise (10.0.26200.7840), но будет работать на любых MS и PG SQL-серверах и операционных системах.

Подразумевается, что у вас Windows, Linux, MSSQL 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» или что-либо другое)

 

Для взаимодействия с внешним сервером MSSQL со стороны PostgreSQL надо создать "прилинкованный" сервер. Поможет нам в этом расширение «tds_fdw». Но так как это расширение НЕ входит в дефолтный пакет при установке Постгреса, то нам придётся собрать расширение из исходников.

Погодите, не разбегайтесь, это не так страшно и для данного конкретного расширения совсем уж НЕ сложно! Серверные расширения можно установить и с помощью отдельного пакета *-contrib, но мы же не ищем лёгких путей, поэтому возьмём свежачок из репозитория.

«tds_fdw» - опенсорсное расширение, исходный код которого расположен на гитхабе . Выполним несколько шагов:

Установим пакеты для сборки:

sudo apt install gnupg gcc make

Установим библиотеки для взаимодействия с  MSSQL:

sudo apt install libsybdb5 freetds-dev freetds-common

Установим GIT:

sudo apt install git

Склонируем репозиторий:

git clone https://github.com/tds-fdw/tds_fdw.git

Перейдём в каталог с исходниками:

cd tds_fdw

Выполним сборку:

make USE_PGXS=1

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

sudo make USE_PGXS=1 install

Теперь у Постгреса есть расширение «tds_fdw».

 

 

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

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

CREATE EXTENSION IF NOT EXISTS tds_fdw;

 

 

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

CREATE SERVER IF NOT EXISTS mssql
FOREIGN DATA WRAPPER tds_fdw
OPTIONS (servername '192.168.0.111', port '1433', database 'ms_files', tds_version '7.1');

(здесь «mssql» - назначаемое имя создаваемого внешнего (прилинкованного) сервера; значения '192.168.0.111', '1433', 'ms_files' - это IP/имя сервера MSSQL, его порт и имя базы соответственно, их нужно заменить на свои значения)

 

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

CREATE USER MAPPING FOR postgres
SERVER mssql
OPTIONS (username 'sa', password 'YOUR_SECRET_PASSWORD');

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

 

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

GRANT USAGE ON FOREIGN SERVER mssql TO postgres;

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

 

 

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

CREATE FOREIGN TABLE IF NOT EXISTS ms_data (
	_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 mssql
OPTIONS (table_name 'dbo._InfoRg4321', row_estimate_method 'showplan_all');

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

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

 

 

Можно выполнить запрос (SELECT * FROM ms_data LIMIT 0;) и убедиться, что вы движетесь в правильном направлении, если запрос отработал без ошибок.

Если на данном этапе в текущей базе «current_db» на Постгресе ещё не существуют таблицы для переноса данных, то создадим их:

CREATE TABLE IF NOT EXISTS public.pg_data (
	id bytea NOT NULL, 
	file bytea NOT NULL, 
	descr mvarchar(36) NOT NULL, 
	CONSTRAINT pg_data_pkey PRIMARY KEY (id) 
);

COMMENT ON TABLE public.pg_data IS 'Хранилище файлов';
COMMENT ON COLUMN public.pg_data.id IS 'Идентификатор';
COMMENT ON COLUMN public.pg_data.file IS 'Файл';
COMMENT ON COLUMN public.pg_data.descr IS 'Описание';

CREATE UNIQUE INDEX pg_data_idx ON public.pg_data (id);
ALTER TABLE public.pg_data CLUSTER ON pg_data_idx;

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

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

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

sudo su - postgres

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

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

(здесь «current_db» - имя текущей базы, «ms_data» - имя "прилинкованной" внешней таблицы, «pg_data» - имя результирующей локальной таблицы)

 

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

 

 

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

P.S. Операции вставки, обновления и удаления НЕ будут работать со сторонними таблицами.

 

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

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

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

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

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

См. также

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

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

02.02.2026    862    Tantor    3    

8

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

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

15.12.2025    4098    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    4820    user2169944    2    

14

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

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

22.08.2025    3267    a13k55    0    

17
Комментарии
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
1. sapervodichka 7524 19.02.26 18:16 Сейчас в теме
Я читал, что в 1С:Предприятие 8.3.23+ в утилите ibcmd в режиме infobase добавлена команда replicate без dt переносить из одной локации в другую в том числе между разными СУБД. Я её сам не пробовал, ты видел?
2. SerVer1C 1024 19.02.26 18:17 Сейчас в теме
(1) Да, и она отлично работает для баз 1С. Но сторонние базы она НЕ поддерживает, к сожалению.
sapervodichka; +1 Ответить
4. sapervodichka 7524 19.02.26 18:19 Сейчас в теме
(2) агамс, я понял, благодарочка
3. war41k 514 19.02.26 18:18 Сейчас в теме
Выгрузка загрузка dt решает весь вопрос без геморая, платформа сама конвертит таблицы, танцы с бубном и потеря времени
5. sapervodichka 7524 19.02.26 18:20 Сейчас в теме
(3) для понятных баз, да, а я пробовал терабайт+ в dt выгрузить и загрузить обратно, что-то не очень работало, а проще не работало, ложилась 1С-ка (даже с ключами поточности при разворачивании, как 1 так и несколько потоков)
7. SerVer1C 1024 19.02.26 18:22 Сейчас в теме
(5) Просто у вас на системном диске НЕ было места под буфер для DT, а если был бы там свободный терабайт, то выгрузилась бы без проблем!
sapervodichka; +1 Ответить
8. sapervodichka 7524 19.02.26 18:24 Сейчас в теме
6. SerVer1C 1024 19.02.26 18:21 Сейчас в теме
(3) Вот как раз если через DT выгружать платформой, то это жесть. Требуется удвоенный размер места под DT. А если юзать ibcmd - то она только для эсных баз. Свои базы через неё НЕ перенести...
sapervodichka; +1 Ответить
Для отправки сообщения требуется регистрация/авторизация