Инструкция по переносу данных из базы 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 МС скуль сиквел перенос копирование инструкция гайд

Вы можете заказать платную адаптацию этой статьи под ваши задачи на «Бирже заказов».

  • 0% комиссии — оплата напрямую исполнителю;
  • Исполнители любого масштаба — от отдельных специалистов до команд под проект;
  • Прямой обмен контактами между заказчиком и исполнителем;
  • Безопасная сделка — при необходимости;
  • Рейтинги, кейсы и прозрачная система откликов.

См. также

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

5,5 тысячи пользователей в единой базе 1С, розница в режиме 24/7 и SLA 99,98% – в таких условиях любая авария быстро превращается в очереди на кассах, потерю денег и давление со стороны бизнеса. Показываем, как выстроить процесс аварийно-восстановительных работ: от первых алертов и базового скрининга системы до подключения команды, проверки гипотез и дебрифа после инцидента. Разбираем, как метрики, дашборды, техжурнал, Zabbix, Prometheus, Grafana, Telegram-боты и скрипты помогают не гадать, а быстро находить причину проблемы. На реальных авариях объясняем, почему «быстро» не должно означать «рискованно», как работа над ошибками снижает панику и почему каждая авария может сделать систему надежнее.

11.08.2026    1642    jul.dolganova    8    

21

Администрирование СУБД Пароли Системный администратор 1С 8.3 1С:Розница 2 1С:Управление производственным предприятием Абонемент ($m)

Пароль пользователя СУБД лежит в 1CV8Clst.lst обратимо: кто читает папку srvinfo - достаёт пароли SQL всех баз кластера, минуя права 1С. Обработка показывает, у каких баз пароль извлекается, помечает слабые и выдаёт план защиты. К СУБД не подключается, ничего не пишет - только читает файл.

10 стартмани

06.08.2026    725    12    nedomolkov.ivan    0    

7

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

Прогнал набор диагностических скриптов на двух рабочих базах: боевой с 580 сеансами и малонагруженной. Разбираю пять находок: статистика 97-дневной давности, 598 запросов со сканами, журнал транзакций в 73 % от данных, tempdb в один файл и 81 % ожиданий на параллелизме, который чинить не надо. Плюс три грабли, из-за которых самописный диагностический скрипт падает на чужом сервере. Семь рабочих скриптов внутри, копируются в SSMS как есть.

05.08.2026    1011    nedomolkov.ivan    8    

7

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

Журнал регистрации на нагруженной базе перестаёт открываться: файлы растут на гигабайты в день, просмотр виснет, история недоступна. Рассказываю, как мы вынесли журнал трёх продуктивных баз в ClickHouse: 35 млрд событий, поиск всех ошибок за сутки — 0,11 секунды, привычная форма журнала для пользователей и падение числа ошибок в проде в 23 раза за полгода. Архитектура, схема таблицы, грабли интеграции и все цифры с прода.

04.08.2026    1262    nedomolkov.ivan    0    

8

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

База 1С:ERP размером 646 Гб, полное маскирование за 5 часов - без создания промежуточной незащищенной копии. Разбираем бесплатный pg_anon на сквозном примере с реального продуктива.

27.07.2026    2478    Tantor    16    

13

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

Если вы работаете с 1С на PostgreSQL и жалуетесь на тормоза — скорее всего, дело в join predicate pushdown, которого в стандартном PostgreSQL нет. В MS SQL Server этот механизм работает «из коробки», и при миграции именно запросы к виртуальным таблицам 1С бьют по производительности сильнее всего. В этой статье — реальный кейс от Postgres Professional с разбором плана выполнения, ручным экспериментом и доработкой планировщика СУБД, которая ускорила запросы от 22 до 54 000 раз.

16.06.2026    8834    postgres_professional    13    

12

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

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

16.06.2026    3369    Tantor    7    

10

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

База 1С за несколько лет эксплуатации разрослась, - стала большой, медленно работает, требует много места и времени для копирования и прочего обслуживания. Нужна ли обязательно свертка или можно обойтись более «мягкими» средствами. Делюсь своим опытном как для новых конфигураций, так и для старых УПП, УТ 10…

01.06.2026    8078    2ncom    30    

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

А по теме статьи, очень интересный подход, а главное - рабочий. Нашел статью по теме: не пробовал через спец.драйвер для MSSQL переносить, как, например в этой https://translated.turbopages.org/proxy_u/en-ru.ru.3a5e4a3f-69a7cd7a-fed34957-74722d776562/https/stackoverflow.com/questions/1370326/migrate-data-from-ms-sql-to-postgresql сатье описано?
Или это только для ванильного Postgres работает?
12. SerVer1C 1121 04.03.26 09:22 Сейчас в теме
(11) Через .NET коннектор будет работать, но могут возникнуть сложности с настройкой сопоставления типов.
6. SerVer1C 1121 19.02.26 18:21 Сейчас в теме
(3) Вот как раз если через DT выгружать платформой, то это жесть. Требуется удвоенный размер места под DT. А если юзать ibcmd - то она только для эсных баз. Свои базы через неё НЕ перенести...
sapervodichka; +1 Ответить
Для отправки сообщения требуется регистрация/авторизация