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

См. также

HighLoad оптимизация Администрирование СУБД Разработчик 1С:Предприятие 8 1С:ERP Управление предприятием 2 Бухгалтерский учет Бесплатно (free)

После миграции с MS SQL на PostgreSQL закрытие месяца в 1С:ERP стало идти 8 часов вместо 12 минут. Рассказываем, как мы нашли причину в оценке Hash Join, которую планировщик завышал в миллионы раз, и как исправили её так, что проблемный запрос теперь выполняется за 18 секунд вместо часа.

19.10.2026    1021    Tantor    0    

10

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

Большинство материалов о компрессии в PostgreSQL отвечают на вопрос «во сколько раз удалось уменьшить базу». Мы предлагаем посмотреть на проблему с другой стороны — какой ценой достигается эта экономия? В статье разбираем архитектурные компромиссы различных подходов к компрессии страниц, объясняем, почему при разработке CSM в Tantor Postgres отказались от погони за максимальным коэффициентом сжатия, и показываем результаты нагрузочных испытаний на реальных базах 1С.

01.10.2026    1516    Tantor    6    

18

DevOps и автоматизация разработки Администрирование СУБД Групповая разработка (Git, хранилище) Разработчик 1С 8.3 Абонемент ($m)

В корпоративных инсталляциях «1С:Предприятие 8.3» под управлением PostgreSQL всё чаще проявляются архитектурные пределы масштабирования: рост числа пользователей, обязательная маркировка, плотный поток API-интеграций и высокая стоимость простоя. Вводная часть цикла разбирает ключевые факторы современной эксплуатационной нагрузки и формирует инженерную методологию эволюционной модернизации без остановки продуктивного контура. Материал основан на практическом кейсе «Торговый контур» и показывает, как определить целевые метрики (p95, MTTR, APDEX), выстроить наблюдаемость, стабилизировать работу кластера и подготовить инфраструктуру к дальнейшему масштабированию. Публикация задаёт фундамент для последующих частей, посвящённых телеметрии, оптимизации PostgreSQL, CI/CD и архитектурному росту.

1 стартмани

10.09.2026    1576    Ninel_S    0    

6

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

В рамках 18 релиза СУБД Tantor Postgres мы рассказывали об оптимизациях, которые помогают планировщику сделать более точный выбор между Nested Loop и Hash Join. В следующем релизе у нас планируются оптимизации, которые позволят ускорить выполнение как Nested Loop, так и Hash Join. Сегодня мы расскажем об одном из таких методов - фильтре Блума.

31.08.2026    6175    Tantor    3    

18

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

Мы подготовили для сообщества Infostart.ru практическое занятие, в котором каждый желающий сможет: научиться собирать реальные данные о процессах кластера 1С; выявлять «перестарков» — процессы старше периода и без соединений; выполнять безопасный перезапуск (с dry-run и подтверждением); настраивать автоматическую проверку через systemd на Linux; отправлять уведомления (Telegram, почта) при обнаружении проблем; работать с логами, ротацией, профилями кластеров и конфигурацией; развернуть полноценный учебный проект AdminClusterMonitor у себя в тестовой среде.

30.08.2026    1776    Ninel_S    2    

6

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

На infostart.ru вышел разбор Ивана Недомолкова «Сервер 1С падает: настройка сбора дампов (logcfg.xml), лимиты памяти и передача дампа в поддержку» - это хорошая инструкция, как ловить и разбирать падение rphost постфактум: logcfg.xml, procdump, анализ дампа. Но там нет ответа на вопрос «а почему кластер вообще прибил процесс сам, ещё до всякого краша». Мы дополняем разбор тремя сводными таблицами лимитов памяти и автомасштабирования кластера - и заодно фиксируем, чем в этой части лицензия ПРОФ урезана относительно КОРП.

12.08.2026    2537    Ninel_S    5    

6

Администрирование СУБД Системный администратор Разработчик Бесплатно (free)

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

11.08.2026    3456    jul.dolganova    9    

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