Миграция MS SQL Server на PostgreSQL: перенос базы, логики и приложений

Переносим базы MS SQL Server на PostgreSQL вместе с тем, что на них держится: хранимыми процедурами, заданиями SQL Server Agent, отчётами, правами и приложениями, которые ходят в базу напрямую. Сначала инвентаризация и оценка, потом перенос на тестовом контуре с нагрузкой и построчной сверкой, потом переключение с отрепетированным откатом. Исходники, схемы и документация остаются у вас, работаем в вашем контуре. Конвертера «в один клик» мы не обещаем: конвертер переносит синтаксис, а смысл приходится читать.

Обследование — от 200 000 ₽, 2–3 неделиИсходники и доступы остаются у васНулевой простой не обещаем: окно считаем на репетиции

Зачем это нужно

Когда приходят с этой задачей

Лицензии и поддержка

Продлить лицензии или поддержку SQL Server нельзя либо невыгодно, а дата отказа от продукта уже названа.

Требование к реестру

Заказчик или нормативный срок требует СУБД из реестра отечественного ПО, а ваша система стоит на SQL Server.

Логика в процедурах

Бизнес-правила живут в хранимых процедурах и триггерах, и целиком их уже никто не помнит.

Неизвестные потребители

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

Прошлая попытка встала

Конвертер перенёс таблицы, но отчёты показывают другой порядок строк, а процедуры падают на первом же вызове.

Переезд вместе с Windows Server

Серверы уходят на Linux, и вместе с ними нужно решать судьбу SQL Server. Об этом отдельно: переход с Windows Server на Linux.

Что меняется

Объекты и конструкции: что во что превращается

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

В MS SQL Server
В PostgreSQL
Что проверяем
Где ломается
В MS SQL ServerTOP, OFFSET … FETCHвыборка первых строк и страницы
В PostgreSQLLIMIT, OFFSET, FETCH FIRST n ROWS ONLY
Что проверяемПостраничные запросы и сортировку, на которой они стоят
Где ломаетсяБез явного ORDER BY порядок строк нестабилен; TOP … PERCENT переписывается вручную
В MS SQL ServerISNULL, IIF, CONVERTфункции значений и преобразований
В PostgreSQLCOALESCE, CASE, CAST, to_char
Что проверяемТип результата выражения и формат дат в строках
Где ломаетсяISNULL берёт тип первого аргумента, COALESCE — общий тип; стили CONVERT не переносятся один к одному
В MS SQL ServerGETDATE, DATEADD, DATEDIFFтекущее время и арифметика дат
В PostgreSQLnow(), прибавление interval, вычитание дат, extract
Что проверяемГраницы суток и месяцев в отчётах
Где ломаетсяDATEDIFF считает пересечённые границы, а не прошедшее время; now() фиксируется на начало транзакции
В MS SQL ServerСтроки: +, LEN, CHARINDEXсклейка и поиск
В PostgreSQL||, concat(), length(), strpos()
Что проверяемNULL в склейке, хвостовые пробелы, регистр при сравнении
Где ломаетсяСравнение строк регистрозависимо, пробелы в конце значимы, а LEN их не считал
В MS SQL Server#temp и @tableвременные таблицы и табличные переменные
В PostgreSQLCREATE TEMP TABLE; табличных переменных нет
Что проверяемВремя жизни таблицы и статистику по ней
Где ломаетсяВременная таблица живёт до конца сессии, а не процедуры; для больших нужен ручной ANALYZE
В MS SQL ServerIDENTITY, SCOPE_IDENTITY()автоинкремент
В PostgreSQLGENERATED … AS IDENTITY, последовательности, RETURNING
Что проверяемПозицию последовательности после загрузки данных
Где ломаетсяДанные залиты с явными ключами, последовательность осталась на единице: первая вставка падает на дубликате
В MS SQL ServerCROSS APPLY, OUTER APPLYсоединение с подзапросом по строке
В PostgreSQLCROSS JOIN LATERAL, LEFT JOIN LATERAL … ON true
Что проверяемПоведение на пустых результатах подзапроса
Где ломаетсяЗамена OUTER APPLY на обычное соединение теряет строки
В MS SQL ServerMERGE, OUTPUTupsert и возврат изменённого
В PostgreSQLINSERT … ON CONFLICT, RETURNING; MERGE в новых версиях
Что проверяемКонкурентные вставки и версию PostgreSQL
Где ломаетсяВ версиях до 15 команды MERGE нет; при конкуренции upsert ведёт себя иначе
В MS SQL ServerTRY … CATCH, THROWобработка ошибок
В PostgreSQLблок EXCEPTION в PL/pgSQL, RAISE
Что проверяемСостояние транзакции после ошибки и коды ошибок в приложении
Где ломаетсяОшибка отменяет всю транзакцию до точки сохранения; номера ошибок SQL Server заменяются кодами SQLSTATE
В MS SQL ServerХинты NOLOCK, UPDLOCK, READPASTуправление блокировками
В PostgreSQLхинтов нет; FOR UPDATE, SKIP LOCKED
Что проверяемВсё, что строилось на блокировках и очередях
Где ломаетсяNOLOCK просто убирают, а очереди на READPAST переписывают; поведение под нагрузкой проверяем
В MS SQL Server[Имя], схема dboидентификаторы
В PostgreSQL"имя", схема public или своя
Что проверяемРегистр имён объектов
Где ломаетсяPostgreSQL приводит имена без кавычек к нижнему регистру; перенесённые имена в «ВерблюжьемРегистре» потом требуют кавычек в каждом запросе
Типы данных

Типы данных: что переносим как есть, а что решаем отдельно

Расхождение типа не всегда видно сразу: данные переедут, а ошибка всплывёт в отчёте за квартал.

Тип в MS SQL
Тип в PostgreSQL
Что проверяем
Подвох
Тип в MS SQLDATETIME, DATETIME2дата и время без пояса
Тип в PostgreSQLtimestamp
Что проверяемТочность и границы значений
ПодвохЗначения DATETIME лежат с шагом около трёх миллисекунд (.000, .003, .007), и эти хвосты переедут вместе с данными
Тип в MS SQLDATETIMEOFFSETмомент со смещением
Тип в PostgreSQLtimestamptz
Что проверяемНужно ли исходное смещение
ПодвохPostgreSQL хранит момент времени, а смещение, с которым его записали, не сохраняет
Тип в MS SQLBITфлаг
Тип в PostgreSQLboolean
Что проверяемУсловия вида = 1 и = 0 в запросах
ПодвохСравнение boolean с числом даёт ошибку типов; условия переписываются на true и false
Тип в MS SQLTINYINT, MONEYмалое число и деньги
Тип в PostgreSQLsmallint, numeric(19,4)
Что проверяемДиапазон и округление
ПодвохОтдельного tinyint нет; тип money в PostgreSQL зависит от локали, поэтому деньги держат в numeric
Тип в MS SQLNVARCHAR(n), VARCHAR(MAX)строки
Тип в PostgreSQLvarchar(n), text
Что проверяемДлины и ограничения, на которые рассчитывают приложения
ПодвохВ PostgreSQL длина считается в символах; снять ограничение значит потерять проверку, которую делала база
Тип в MS SQLUNIQUEIDENTIFIER, NEWID()глобальный идентификатор
Тип в PostgreSQLuuid, gen_random_uuid()
Что проверяемПорядок ключей и фрагментацию индексов
ПодвохАналога NEWSEQUENTIALID() нет; функция gen_random_uuid() встроена в новых версиях, в старых нужно расширение
Тип в MS SQLROWVERSIONверсия строки для оптимистичной блокировки
Тип в PostgreSQLпрямого аналога нет
Что проверяемГде приложение читает это поле
ПодвохЗаменяется явным столбцом версии, который обновляет приложение или триггер
Тип в MS SQLHIERARCHYID, GEOGRAPHYспециальные типы
Тип в PostgreSQLрасширения (например, ltree, PostGIS)
Что проверяемКакие функции типов использует код
ПодвохПрямого переноса нет; решение принимаем по месту использования, а не по названию типа
Особый случай

Базы 1С на MS SQL: переносит платформа, а не мы вручную

Если на SQL Server лежит информационная база 1С, таблицы переносить напрямую не нужно: структурой хранения управляет платформа. Платформа 1С умеет работать с PostgreSQL, и перенос делается её средствами: выгрузкой информационной базы (файл .dt) и загрузкой в новую базу на PostgreSQL. Версия и сборка PostgreSQL должны входить в число поддерживаемых вашей версией платформы, это сверяем с документацией 1С на обследовании.

Работа вокруг выгрузки — всё остальное: внешние обработки и обмены, которые читают базу SQL-запросами, регламентные задания, резервное копирование, настройки кластера серверов и отчёты внешних систем. Они в выгрузку не попадают и переносятся отдельно. Про обмены см. интеграцию 1С.

Переключение

Окно простоя и догон изменений: варианты, а не обещание

Размер базы определяет длительность первой загрузки, а окно переключения определяет объём изменений за время переноса. Выбираем вариант на обследовании и проверяем на репетиции.

Вариант
Как работает
Когда подходит
Ограничение
ВариантОстановка записи на окнобез догона
Как работаетПриложения останавливаются, выполняется финальная выгрузка, сверка и смена строк подключения
Когда подходитДопустимо окно на ночь или выходные
ОграничениеДлительность окна растёт с объёмом данных; реальное время замеряем на репетиции, а не оцениваем на глаз
ВариантОсновная загрузка заранее, догон дельтыдве фазы
Как работаетБольшая часть данных переносится заранее, изменения догоняются по журналу изменений или по ключам
Когда подходитОкно маленькое, база большая
ОграничениеНужна доказуемая сверка дельты; возможности журнала изменений зависят от версии и редакции SQL Server
ВариантПараллельная работа с двусторонней сверкойдве базы одновременно
Как работаетПриложения пишут в одну базу, вторая догоняется и сравнивается
Когда подходитЦена ошибки высока
ОграничениеДвойная нагрузка и двойная эксплуатация на период; расхождения придётся разбирать, а не списывать
ВариантПо одной базе или схемепоэтапный
Как работаетПереключаем независимые участки по очереди
Когда подходитСвязность между базами невысока
ОграничениеЗапросы между базами и связанные серверы тянут зависимости, их нужно развязать заранее
Что делаем

Из чего состоит работа и сколько стоит

Цены — по тарифам. Обследование вычитается из следующего этапа. Остановиться можно после любой ступени: всё сделанное остаётся у вас по акту.

Обследование: одна база, одно-два приложения

Инвентаризация объектов, потребителей и нагрузки, отчёт о совместимости, оценка объёма переписывания и вилка бюджета. 2–3 недели.

200 000 ₽

Обследование: несколько систем

То же плюс задания SQL Server Agent, пакеты SSIS, отчёты SSRS, связанные серверы, обмены между системами, схема потребителей. 3–4 недели.

350 000 ₽

Пилот лёгкий

Одна база или схема на тестовом контуре: схема, данные, сверка, нагрузочный прогон на выборке запросов. 2–8 недель.

150 000–400 000 ₽

Пилот тяжёлый

Много логики: переписывание процедур и триггеров, доработка приложений при наличии исходников, перенос отчётов и заданий, нагрузка. 2–3 месяца.

400 000–1 200 000 ₽

Вывод в продуктив

Репетиция переключения и отката, переключение, опытная эксплуатация, инструкции администраторам. Идёт этапами со своей приёмкой, от 3 месяцев.

от 1 500 000 ₽ этапами по 300 000–700 000 ₽

Сопровождение

Мониторинг, настройка планов запросов и автоочистки, обращения, разбор инцидентов. Три пакета по часам.

20 000 / 60 000 / 120 000 ₽ в месяц
Процесс

Порядок переноса: от инвентаризации до отката

Шаг 1 — Инвентаризация объектов

Схемы, таблицы, представления, процедуры, функции, триггеры, задания, пакеты, отчёты, связанные серверы, логины и права. Параллельно ищем потребителей и снимаем профиль нагрузки, включая закрытие месяца: без базового замера нечем доказать, что стало не хуже.

Шаг 2 — Перенос схемы

Типы, ключи, индексы, ограничения. Кодировку, правила сортировки и правило именования решаем до создания базы: после создания их не поменять без пересоздания.

Шаг 3 — Перенос данных

Тестовая загрузка на тестовый контур, сверка числа строк и контрольных сумм по таблицам, синхронизация последовательностей, сбор статистики после загрузки.

Шаг 4 — Перенос логики

Процедуры, функции и триггеры читаем и переписываем. Автоматическая конвертация даёт черновик, а не результат; каждый объект получает проверку входов и выходов.

Шаг 5 — Сверка

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

Шаг 6 — Нагрузочный прогон

Реальный профиль запросов на тестовом контуре, разбор планов, индексы и параметры. Сравнение с базовым замером, снятым на шаге 1.

Шаг 7 — Переключение

По регламенту: остановка или догон по выбранному варианту, финальная сверка, смена подключений, дежурство в первые дни в рабочее время.

Шаг 8 — Откат

Условие запуска и порядок возврата прописаны и отрепетированы до окна. Старая база остаётся рабочей до конца параллельного периода.

Контроль

Что остаётся у вас и чего мы не делаем

Остаётся у вас

  • Скрипты переноса и сверки, репозиторий с переписанной логикой.
  • Регламент переключения и отката, протоколы сверки.
  • Права администратора на обе базы: мы работаем в вашем контуре.
  • Документация, инструкции администраторам и право остановиться после любой ступени.

Мы этого не делаем

  • Не обещаем конвертер «в один клик» и нулевой простой.
  • Не берёмся переключать приложение без исходников без доработки: такие места находим на обследовании и предлагаем варианты.
  • Не проводим аттестацию и не выполняем лицензируемые работы по защите информации: лицензии ФСТЭК у нас нет.
  • Не подаём заявки и не проходим сертификацию в реестрах: это делает заказчик.
  • Не берём работы дешевле 150 000 ₽ и не дежурим круглосуточно.
Инструменты

На чём собираем перенос

Источник
  • MS SQL Server (версию и редакцию уточняем на обследовании)
  • T-SQL, SQL Server Agent
  • SSIS, SSRS, связанные серверы
  • Расширенные события и трассировка для снятия запросов
Цель и инструменты
  • PostgreSQL: обычная или сертифицированная сборка по требованиям контура
  • PL/pgSQL, COPY, pg_stat_statements, EXPLAIN
  • Планировщик: pg_cron или cron и таймеры systemd
  • Собственные скрипты сверки, pgloader — как вспомогательный инструмент
Честно

Где такие проекты ломаются

Доверились конвертеру

Конвертер переносит синтаксис, но не смысл: порядок сортировки, NULL, границы дат. Каждую сконвертированную процедуру читаем руками, это заложено в срок.

Не измерили нагрузку до переноса

Планировщик PostgreSQL строит планы иначе, часть запросов может стать медленнее. Без базового замера результат нечем доказать.

Забыли про задания и отчёты

Задания SQL Server Agent, пакеты SSIS и отчёты SSRS прямых аналогов не имеют. Это отдельная строка трудоёмкости, и в оценках её чаще всего пропускают.

Переключились без отката

Если старая база не остаётся рабочей, первая же проблема превращается в аварию. Откат репетируется заранее, а не описывается на бумаге.

Материалы

Что почитать по теме

Статья

С MS SQL на PostgreSQL: что меняется в коде и данных

Постраничная выборка, NULL, регистр, даты, последовательности, блокировки и проверка после переноса.

  • синтаксис и типы
  • MVCC и VACUUM
  • чек-лист сверки
Читать →
Разбор задачи

Перенос базы с MS SQL на PostgreSQL к сроку

Типовая задача с названным сроком: реестр зависимостей, протокол сверки, отрепетированный откат.

  • условный разбор, не клиентский проект
  • что проверять на приёмке
Читать →
Статья

Как перейти с Oracle на PostgreSQL

Те же шаги для Oracle: инвентаризация, оценка совместимости, нагрузка, переключение.

  • PL/SQL и пакеты
  • параллельный период
Читать →
Заявка

Разберём вашу базу

Короткий созвон: какая версия SQL Server, сколько в базе логики, кто в неё ходит и к какому сроку нужно уйти.

Спасибо, заявка отправлена. Ответим в течение рабочего дня.

Не удалось отправить. Напишите в телеграм или позвоните.

Вопросы

Частые вопросы: миграция ms sql на postgresql

Сколько стоит миграция MS SQL на PostgreSQL?

Точная цена называется только за обследование: 200 000 ₽ для одной базы и одного-двух приложений, 350 000 ₽ для нескольких систем. Дальше вилка: лёгкий пилот 150 000–400 000 ₽, тяжёлый 400 000–1 200 000 ₽, вывод в продуктив от 1 500 000 ₽ этапами по 300 000–700 000 ₽. Обследование вычитается из следующего этапа.

Сколько времени занимает перенос?

Срок называем после обследования: он зависит не от объёма данных, а от объёма логики в процедурах и числа приложений. По тарифам лёгкий пилот занимает 2–8 недель, тяжёлый 2–3 месяца, вывод в продуктив идёт от трёх месяцев.

Можно ли перенести базу автоматическим конвертером?

Схему и данные в основном можно, процедурный код только частично. Конвертер даёт черновик T-SQL, переписанный на PL/pgSQL, но смысл он не проверяет: порядок сортировки, NULL, поведение транзакций. Поэтому каждый объект читаем и проверяем на тестовых данных.

Будет ли простой на время переключения?

Остановка записи на окно или догон изменений: вариант выбираем на обследовании. Нулевой простой не обещаем. Длительность окна определяется на репетиции переключения на копии боевых данных, а не оценкой.

Что делать с базами 1С?

Платформа 1С работает с PostgreSQL, и информационная база переносится её средствами: выгрузкой и загрузкой. Версию и сборку PostgreSQL сверяем с документацией вашей версии платформы. Внешние обмены и задания вокруг базы переносим отдельно.

Что с SSIS, SSRS и заданиями SQL Server Agent?

Прямых аналогов нет. Задания переносятся на pg_cron или планировщик ОС, пакеты SSIS заменяются скриптами или другим средством загрузки, отчёты SSRS переносятся в другое средство отчётности. Объём видим на обследовании и закладываем отдельной строкой.

А если исходников приложения нет?

Приложение без исходников, которое работает с базой через драйвер SQL Server, на PostgreSQL без доработки не переключить. Такие места находим на обследовании, снимая запросы с работающей системы, и предлагаем варианты: восстановить исходники, заменить приложение или оставить эту базу на старой платформе до замены.

Какую сборку PostgreSQL ставить?

Обычную или сертифицированную: определяют ваши требования к реестру, поддержке и контуру. Технически перенос от выбора почти не меняется, но версию сверяем с приложениями и платформой 1С, если она есть.

Можно ли остановиться после обследования?

Да. Обследование заканчивается документом: карта объектов и потребителей, отчёт о совместимости, оценка и вилка бюджета. С ним можно идти в тендер и сравнивать предложения, в том числе не наши.

Вы работаете только в Ростове-на-Дону?

Мы в Ростове-на-Дону, работаем с заказчиками по всей России: удалённо и в вашем контуре. Доступ к системам и обследование согласуем на старте с вашей службой безопасности.