Почему тестирование миграции данных - это не просто «проверить, что всё перенеслось»
Сравнение количества записей в исходной и целевой системах - лишь вершина айсберга. Корректная миграция данных требует подтверждения сохранности связей между таблицами, идентичности бизнес-логики и приемлемой производительности на новом месте. Пропуск любого из этих этапов приводит к скрытым дефектам, которые проявляются в самый неподходящий момент: при формировании квартального отчёта или запуске критичного регламентного задания.
Практика показывает три типовых сценария провала. Первый - потеря части данных из-за неправильной обработки специальных символов при смене кодировки. Второй - нарушение ссылочной целостности, когда документ есть, а его строки ссылаются на несуществующий справочник. Третий - деградация производительности, при которой формально целая база работает в десятки раз медленнее из-за отсутствия актуальной статистики планировщика. Эта статья даёт инженерный подход к валидации: конкретные скрипты, метрики и чек-лист, проверенные на проектах с PostgreSQL и 1С.
Материал построен вокруг трёх фаз тестирования - до, во время и после миграции. Вы получите SQL-запросы для аудита исходных данных, методику создания эталонных метрик, приёмы мониторинга прогресса и полный набор проверок для финальной приёмки. Отдельный блок посвящён автоматизации рутины: скрипты для сверки объёмов и целостности в PostgreSQL, обработки для 1С, а также итоговый чек-лист, который исключает человеческий фактор.
Этап 1: Подготовка и тестирование до миграции
Предварительная подготовка определяет 70% успеха всего проекта. Запускать перенос данных без аудита источника - значит переносить скрытые проблемы в новую среду, где к ним добавятся ещё и ошибки трансформации. Задача этого этапа - найти все нарушения в исходной системе, зафиксировать эталонные метрики и настроить тестовую среду, идентичную продакшену по конфигурации СУБД, версиям библиотек и параметрам ОС.
Резервное копирование - обязательный нулевой шаг. Полный дамп исходной базы должен быть снят и проверен на восстанавливаемость до начала любых манипуляций. Без этого любая ошибка на следующих стадиях превращается в необратимую потерю данных.
Аудит исходных данных: находим проблемы до того, как они станут фатальными
Исходная база, прожившая несколько лет в продакшене, почти гарантированно содержит нарушения. Орфанные записи, дубликаты по ключевым полям, некорректные форматы дат - всё это всплывёт при попытке накатить строгие constraint'ы на целевой системе или при конвертации типов. Лучше найти эти проблемы сейчас, пока есть доступ к источнику и возможность их исправить штатными средствами.
Для PostgreSQL используйте следующий набор диагностических запросов. Поиск дубликатов по бизнес-ключу:
SELECT inn, COUNT(*)
FROM contractors
GROUP BY inn
HAVING COUNT(*) > 1;
Поиск записей с NULL в полях, которые должны быть обязательными в новой схеме:
SELECT id, full_name
FROM employees
WHERE hire_date IS NULL
OR department_id IS NULL;
Проверка орфанных записей - дочерних строк без родительских:
SELECT o.id, o.order_date, o.customer_id
FROM orders o
LEFT JOIN customers c ON o.customer_id = c.id
WHERE c.id IS NULL;
Обнаружение некорректных форматов данных, которые могут сломать парсинг при преобразовании типов:
SELECT id, phone
FROM contacts
WHERE phone !~ '^\+7\(\d{3}\)\d{3}-\d{2}-\d{2}$';
Результаты аудита документируйте. Каждый тип нарушения должен получить решение: исправить в источнике, трансформировать при миграции или исключить запись. Без этого решения вы перенесёте мусор в новую систему.
Создание эталонных данных и метрик для последующего сравнения
Чтобы доказать корректность миграции, нужно зафиксировать состояние «до». Метрики снимаются по трём направлениям: объём, содержимое и производительность. Автоматизируйте сбор скриптами - ручной подсчёт неизбежно приведёт к ошибкам.
Подсчёт количества записей по всем таблицам схемы:
SELECT schemaname, relname, n_live_tup
FROM pg_stat_user_tables
ORDER BY schemaname, relname;
Вычисление контрольных сумм для критичных таблиц. Используйте встроенные функции PostgreSQL:
SELECT md5(string_agg(md5(ROW(t.*)::text), '' ORDER BY id))
FROM orders t;
Для больших таблиц считайте хеш не по всей таблице, а по диапазонам первичного ключа - это ускорит последующую сверку и позволит локализовать расхождения с точностью до блока записей.
Сохраните планы выполнения эталонных запросов. Они понадобятся на этапе тестирования производительности:
EXPLAIN (ANALYZE, BUFFERS, FORMAT JSON)
SELECT * FROM orders WHERE order_date BETWEEN '2025-01-01' AND '2025-06-30';
-- сохраните вывод в файл эталонных планов
Все собранные метрики сохраните в отдельной схеме или файловой структуре тестовой среды. Эти данные станут единственным объективным критерием успешности миграции.
Этап 2: Тестирование во время миграции
Фаза активного переноса данных - это не пассивное ожидание завершения скрипта. Даже при использовании проверенных инструментов вроде pg_dump/pg_restore или механизмов 1С:Конвертации данных возможны сбои: обрыв сетевого соединения, переполнение дискового пространства, ошибки трансформации на конкретных записях. Без мониторинга в реальном времени вы рискуете узнать о проблеме спустя часы после её возникновения.
Мониторинг прогресса и обработка ошибок в реальном времени
Настройте детальное логирование на стороне инструмента миграции. Для pg_dump/pg_restore ключевые параметры: --verbose для вывода прогресса и --error-on-continue (или его аналоги в обёртках) для немедленной остановки при критических ошибках. Лог должен писаться в файл с ротацией, а не только в stdout.
Параллельно с основным процессом запустите скрипт периодического контроля. Он раз в N минут подключается к целевой системе и считает количество перенесённых записей по ключевым таблицам. Сравнение с эталонными метриками из первого этапа покажет прогресс в процентах и выявит остановку миграции:
#!/bin/bash
# Пример скрипта мониторинга для PostgreSQL
while true; do
COUNT=$(psql -h target_host -U migrator -d target_db -t -c "SELECT COUNT(*) FROM orders;")
echo "[$(date +%H:%M:%S)] Orders migrated: $COUNT / 1_250_000"
sleep 300
done
Для 1С:Конвертации данных включите расширенное логирование в настройках правил обмена. Номера объектов, на которых произошёл сбой, фиксируйте в отдельный регистр сведений - это позволит после завершения основного прогона точечно обработать проблемные записи, не перезапуская всю миграцию.
При потоковой миграции (логическая репликация, Change Data Capture) добавьте проверку лага - отставания целевой системы от источника. Критический рост лага сигнализирует о проблемах с производительностью целевой стороны или о сетевых задержках.
Этап 3: Тестирование после миграции - полная валидация
Финальная валидация - это формальный процесс подтверждения, что целевая система готова заменить исходную. Четыре группы тестов закрывают все аспекты: объём, целостность, производительность и функциональность. Последовательность важна: сначала убеждаемся, что все данные на месте, затем - что они корректны, и только потом проверяем, как быстро они обрабатываются и работают ли приложения.
Проверка объема данных: считаем строки и байты
Самый быстрый тест, который отсекает грубые ошибки. Сравните количество записей по всем таблицам источника и приёмника. Расхождение даже на одну строку в критичной таблице - повод для полной остановки приёмки.
-- Выполнить на исходной и целевой системах, сравнить вывод
SELECT relname, n_live_tup
FROM pg_stat_user_tables
ORDER BY relname;
Для автоматизации используйте скрипт, который подключается к обеим базам и выводит только расхождения:
#!/bin/bash
# Сравнение количества строк. Требует установленных утилит psql.
TABLES=$(psql -h source_host -t -c "SELECT tablename FROM pg_tables WHERE schemaname='public'")
for t in $TABLES; do
SRC=$(psql -h source_host -d source_db -t -c "SELECT COUNT(*) FROM $t")
TGT=$(psql -h target_host -d target_db -t -c "SELECT COUNT(*) FROM $t")
if [ "$SRC" != "$TGT" ]; then
echo "MISMATCH: $t - source: $SRC, target: $TGT"
fi
done
Проверка целостности ссылочной структуры и данных
Количество записей сошлось - теперь проверяем, что связи между ними не нарушены. Внешние ключи, созданные на целевой системе, гарантируют формальную целостность, но не проверяют логическую: документ может ссылаться не на того контрагента, если при миграции перепутались идентификаторы.
Для PostgreSQL используйте оператор EXCEPT для построчного сравнения подмножеств данных:
-- Сравнение состава ключевых полей
SELECT id, order_date, customer_id, total_amount
FROM source_db.orders
WHERE order_date >= '2026-01-01'
EXCEPT
SELECT id, order_date, customer_id, total_amount
FROM target_db.orders
WHERE order_date >= '2026-01-01'
UNION ALL
SELECT id, order_date, customer_id, total_amount
FROM target_db.orders
WHERE order_date >= '2026-01-01'
EXCEPT
SELECT id, order_date, customer_id, total_amount
FROM source_db.orders
WHERE order_date >= '2026-01-01';
Пустой результат означает полную идентичность выборок. Для таблиц с десятками миллионов строк разбейте проверку на диапазоны первичного ключа.
Сравнение контрольных сумм, снятых на первом этапе, - ещё один быстрый метод. Если хеш таблицы на источнике и приёмнике совпадает, данные идентичны с вероятностью, близкой к 100%. Расхождение требует локализации: дели́те таблицу пополам по диапазону ID и пересчитывайте хеши, пока не найдёте расходящийся блок.
Для 1С сверка целостности имеет свою специфику. Проверяйте не только количество объектов метаданных, но и остатки регистров накопления на ключевые даты, обороты регистров бухгалтерии и движения документов. Типовая ошибка - документ перенесён, но его движения по регистрам отсутствуют из-за ошибки в правилах конвертации. Скрипты для такой проверки приведены в разделе автоматизации.
Тестирование производительности: сравниваем скорость до и после
Формально корректная база может работать неприемлемо медленно. Причины: отсутствующая или устаревшая статистика планировщика, неоптимальные планы запросов на новой версии СУБД, другие параметры конфигурации сервера. Сравнение с эталонными метриками, снятыми до миграции, даёт объективную картину.
Методика:
- Обновите статистику на целевой системе:
ANALYZE; - Выполните эталонные запросы с
EXPLAIN (ANALYZE, BUFFERS). - Сравните фактическое время выполнения и планы с эталонными.
Рост времени до 10% допустим и может объясняться различиями в аппаратном обеспечении. Рост в 2-5 раз - сигнал к анализу плана запроса. Типичные проблемы: пропущенный индекс, переключение с Index Scan на Seq Scan из-за изменения параметра random_page_cost, невыгодный Join-алгоритм на новой версии планировщика.
Для 1С тестирование производительности проводится путём замера времени проведения ключевых документов и формирования регламентированных отчётов. Сравните время закрытия месяца на тестовой копии целевой базы с историческими данными о времени закрытия на исходной системе. Значимое замедление - повод для технологического аудита настроек СУБД и пересмотра регламентных заданий по обновлению статистики.
Функциональное тестирование: проверяем работу приложений
Данные целы, связи на месте, производительность в норме. Осталось убедиться, что прикладное ПО корректно работает с новой базой. Этот этап критичен для систем с жёсткой бизнес-логикой на стороне приложения - ERP, CRM, биллингов.
Для 1С функциональное тестирование включает:
- Тестовое проведение документов всех ключевых видов за выбранный период. Проверьте, что движения формируются корректно, не возникает ошибок контроля остатков.
- Формирование регламентированной отчётности за предыдущий закрытый период. Сравните показатели с эталонными отчётами, сформированными на исходной базе.
- Проверку интеграционных интерфейсов: выгрузки в банк, обмены с внешними системами, API-запросы. Убедитесь, что форматы и протоколы не изменились.
Для самописных приложений запустите набор регрессионных тестов, покрывающих критичные бизнес-сценарии. Если такого набора нет, миграция - повод его создать. Минимальный объём: 10-15 ключевых пользовательских сценариев, от входа в систему до формирования финального документа.
Автоматизация валидации: готовые скрипты для PostgreSQL и 1С
Ручная проверка десятков таблиц и сотен связей отнимает часы и провоцирует ошибки. Скрипты автоматизации выполняют рутину за минуты и формируют отчёт, в котором видны только расхождения. Это освобождает время инженера для анализа причин, а не для поиска иголки в стоге сена.
Скрипты для PostgreSQL: сверка объемов, целостности и производительности
Комплексный скрипт сверки количества записей по всем таблицам схемы. Подключается к двум базам через foreign data wrapper или через раздельные соединения и выводит таблицу расхождений:
-- Предполагается, что на целевой базе настроен foreign server к исходной
CREATE EXTENSION IF NOT EXISTS postgres_fdw;
-- Настройка соединения (выполняется один раз)
-- CREATE SERVER source_srv FOREIGN DATA WRAPPER postgres_fdw OPTIONS (host 'src_host', dbname 'src_db');
-- CREATE USER MAPPING FOR CURRENT_USER SERVER source_srv OPTIONS (user 'src_user', password 'src_pass');
-- IMPORT FOREIGN SCHEMA public LIMIT TO (orders, customers, products) FROM SERVER source_srv INTO source;
SELECT
'orders' AS table_name,
(SELECT COUNT(*) FROM orders) AS target_count,
(SELECT COUNT(*) FROM source.orders) AS source_count
UNION ALL
SELECT
'customers',
(SELECT COUNT(*) FROM customers),
(SELECT COUNT(*) FROM source.customers)
UNION ALL
SELECT
'products',
(SELECT COUNT(*) FROM products),
(SELECT COUNT(*) FROM source.products);
Проверка внешних ключей - поиск записей, нарушающих ссылочную целостность. Выполняется на целевой системе после миграции, но до создания constraint'ов, либо при их временном отключении:
SELECT o.id, o.customer_id
FROM orders o
LEFT JOIN customers c ON o.customer_id = c.id
WHERE c.id IS NULL
AND o.customer_id IS NOT NULL;
Сравнение планов запросов автоматизируйте через сохранение и diff вывода EXPLAIN. Ключевые метрики для сравнения: фактическое время выполнения (actual time), количество прочитанных буферов (buffers read), выбранный алгоритм соединения (Nested Loop / Hash Join / Merge Join).
Скрипты и обработки для 1С: проверка переноса данных
Для платформы 1С:Предприятие автоматизация строится на встроенном языке. Базовая проверка количества объектов метаданных:
// Сравнение количества элементов справочников и документов
&НаСервере
Процедура СверитьКоличествоОбъектов()
МассивМетаданных = Новый Массив;
МассивМетаданных.Добавить(Метаданные.Справочники.Контрагенты);
МассивМетаданных.Добавить(Метаданные.Документы.РеализацияТоваров);
МассивМетаданных.Добавить(Метаданные.Справочники.Номенклатура);
Для Каждого Мд Из МассивМетаданных Цикл
Запрос = Новый Запрос;
Запрос.Текст = "ВЫБРАТЬ КОЛИЧЕСТВО(1) КАК Количество ИЗ " + Мд.ПолноеИмя();
Результат = Запрос.Выполнить();
Выборка = Результат.Выбрать();
Выборка.Следующий();
Сообщить(Мд.Имя + ": " + Выборка.Количество);
КонецЦикла;
КонецПроцедуры
Сверка остатков регистров накопления на ключевую дату - критичная проверка для бухгалтерского и складского учёта:
// Сравнение остатков по регистру ТоварыНаСкладах на конец периода
&НаСервере
Процедура СверитьОстатки(ДатаПроверки)
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| ТоварыНаСкладахОстатки.Номенклатура КАК Номенклатура,
| ТоварыНаСкладахОстатки.Склад КАК Склад,
| ТоварыНаСкладахОстатки.КоличествоОстаток КАК Количество
|ИЗ
| РегистрНакопления.ТоварыНаСкладах.Остатки(&ДатаПроверки, ) КАК ТоварыНаСкладахОстатки";
Запрос.УстановитьПараметр("ДатаПроверки", ДатаПроверки);
// Выполнить на исходной и целевой базе, сравнить результат
КонецПроцедуры
Проверка движений документов - убеждаемся, что проведённый документ сформировал записи в регистрах:
// Проверка наличия движений у проведённых документов
&НаСервере
Процедура ПроверитьДвиженияДокументов(НачалоПериода, КонецПериода)
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| РеализацияТоваров.Ссылка КАК Документ,
| РеализацияТоваров.Проведен
|ИЗ
| Документ.РеализацияТоваров КАК РеализацияТоваров
|ГДЕ
| РеализацияТоваров.Дата МЕЖДУ &НачалоПериода И &КонецПериода
| И РеализацияТоваров.Проведен";
// Для каждого документа проверить наличие записей в подчинённых регистрах
КонецПроцедуры
Эти фрагменты адаптируются под конкретную конфигурацию: имена справочников, документов и регистров берутся из метаданных вашей системы. Рекомендуем оформить их в виде внешней обработки с табличным выводом результатов для наглядности.
Чек-лист тестирования миграции данных: от планирования до приемки
Структурированный список исключает пропуск критичных шагов под давлением сроков. Каждый пункт - это атомарная проверка с бинарным результатом: выполнено или нет. Используйте чек-лист как титульный лист отчёта о миграции, подписываемого ответственными инженерами.
До миграции:
- Полный резервный бэкап исходной системы выполнен и проверен на восстанавливаемость.
- Аудит исходных данных проведён: дубликаты, орфанные записи, нарушения форматов выявлены и задокументированы.
- Эталонные метрики сняты: количество строк по таблицам, контрольные суммы, планы эталонных запросов.
- Тестовая среда развёрнута: версии СУБД, ОС, библиотек и параметры конфигурации идентичны целевой продакшен-среде.
- Правила трансформации данных задокументированы и согласованы с владельцами систем.
- План отката (rollback) утверждён и проверен на тестовой среде.
Во время миграции:
- Детальное логирование процесса миграции настроено, логи пишутся в файл.
- Скрипт мониторинга прогресса запущен, алерты при остановке переноса настроены.
- Промежуточные проверки целостности выполняются по графику (каждые N записей или каждые M минут).
- Ошибки трансформации фиксируются с идентификаторами проблемных записей для последующей обработки.
После миграции:
- Количество записей по всем таблицам совпадает с эталоном.
- Контрольные суммы критичных таблиц совпадают.
- Ссылочная целостность проверена: внешние ключи созданы, орфанные записи отсутствуют.
- Производительность эталонных запросов не деградировала более чем на 10%.
- Статистика планировщика обновлена (ANALYZE выполнен).
- Функциональное тестирование приложений пройдено: ключевые бизнес-операции выполнены без ошибок.
- Интеграционные интерфейсы проверены: обмены, API, выгрузки работают корректно.
- Регламентированная отчётность сформирована и сверена с эталоном.
- Результаты всех проверок задокументированы, акт приёмки подписан.
Типичные ошибки при тестировании миграции и как их избежать
Разбор частых просчётов, основанный на анализе десятков проектов переноса данных. Каждая ошибка - это реальный инцидент, которого можно избежать, зная о нём заранее.
Тестирование на усечённом объёме данных. Разработчики отлаживают миграцию на базе с 10% записей, всё проходит гладко. На полном объёме всплывают проблемы с памятью, временем выполнения и блокировками. Решение: тестовый прогон выполняется на копии продакшен-базы. Допустимо маскирование чувствительных данных, но объём и распределение значений должны сохраняться.
Игнорирование нефункциональных требований. Команда проверяет только корректность данных, забывая о времени выполнения миграции и о производительности после неё. Результат: миграция идёт 48 часов при допустимом окне в 8, а после переключения пользователи не могут работать из-за таймаутов. Решение: включить в чек-лист замеры времени всех этапов и нагрузочное тестирование целевой системы до переключения трафика.
Тестовая среда не идентична продакшену. Миграция тестируется на PostgreSQL 15 с дефолтными настройками, а продакшен работает на PostgreSQL 14 с кастомными параметрами shared_buffers и work_mem. Планы запросов различаются кардинально. Решение: тестовая среда должна быть клоном продакшена по версиям ПО и конфигурационным файлам. Контейнеризация (Docker) упрощает создание таких клонов.
Недостаточное внимание к интеграциям. Проверили базу, но забыли про внешние системы, которые с ней обмениваются данными. После переключения падает обмен с банком из-за изменения формата выгрузки. Решение: включить в функциональное тестирование все интеграционные точки. Составить карту интеграций до начала миграции и проверить каждую.
Отсутствие плана отката. Миграция выполнена, но при приёмке обнаружена критичная ошибка, исправление которой требует дней. Возврат к исходной системе невозможен, потому что за время миграции в неё продолжали вносить изменения. Решение: план отката - это не просто «восстановить из бэкапа». Это процедура обратного переноса данных, накопившихся в целевой системе за время тестирования, обратно в источник. План должен быть проверен на тестовой среде до начала продакшен-миграции.
Системный подход к тестированию миграции данных - это страховка от ночных звонков и авральных восстановлений. Три фазы проверок, автоматизированные скрипты и дисциплина чек-листа превращают хаотичный процесс в управляемый инженерный проект с предсказуемым результатом. Для углубления в смежные темы рекомендуем изучить пошаговый план миграции между СУБД и руководство по планированию миграции инфраструктуры. Если вы управляете проектом целиком, пригодятся материалы по организации миграции как IT-проекта и управлению процессом с контролем типичных ошибок.