Утилита миграции с БД Microsoft на Postgres
Процесс миграции с БД типа Microsoft SQL на PostgreSQL состоит из нескольких этапов. Это позволяет лучше контролировать каждый шаг миграции, а также позволяет продолжить миграцию с места остановки, например, при возникновении ошибки. Т.к. PostgreSQL не поддерживает Сателлитные БД, миграция в PostgreSQL подразумевает перенос архивных данных и журналов из соответствующих БД Microsoft SQL (_Archive и _Log) в основную.
Для использования утилиты миграции необходима опция лицензии Docsvision Утилита миграции на PostgreSQL.
-
Подготовьте исходную БД Microsoft SQL.
-
Вытесните файлы в файловое хранилище.
-
Экспортируйте исходную БД в
.csv
файлы. -
Конвертируйте экспортированные
.csv
файлы. -
Подготовьте БД Postgres для миграции.
-
Выполните миграцию
.csv
файлов в БД Postgres.
Описание утилиты миграции
Утилита миграции выполнена в виде консольного приложения.
Утилита может использоваться в режиме тестирования соединения, например, для проверки возможности установления соединения с базой-источником Microsoft SQL и базой-приёмником PostgreSQL. Примеры использования приведены ниже:
CloneDbUtil.exe /pg:"Server=127.0.0.1; Port=5432; Database=target_db; User ID=postgres; Password=password;" /test
CloneDbUtil.exe /ms:"Initial Catalog=source_db; Data Source=server; Integrated Security = SSPI;" /test
Работа утилиты сопровождается сообщениями в окне консоли, также утилита ведет текстовый файл журнала, который сохраняется рядом с файлом утилиты. Для каждого запуска создается отдельный файл журнала, с указанием идентификатора процесса и времени запуска.
Утилита должна запускаться исключительно на сервере приложений с версией платформы 5.5.5, сборка 7876 и выше. |
Аргументы командной строки утилиты
CloneDbUtil.exe [@argfile] [/ms:] [/pg:] [/p:]
[/install[+|-]] [/clone[+|-]] [/export|e[+|-]] [/l:] [/import[+|-]]
[/test[+|-]] [/f[+|-]] [/in:] [/out:] [/infolder:]
[/outfolder:] [/s[+|-]] [/m:] [/help|?|h]
@argfile прочитать аргументы из файла.
/ms: строка подключения к БД MsSql (По умолчанию: "")
/pg: строка подключения к БД PgSql (По умолчанию: "")
/p: Экспортировать/Импортировать путь папки (По умолчанию: "")
/install[+|-] установить экспортированные объекты
/clone[+|-] клонировать структуру БД
/export[+|-] экспортировать таблицу в файлы csv
/l: Ограничить число таблиц для экспортирования в один вызов (По умолчанию: "0")
/import[+|-] импортировать таблицы из файлов csv
/test[+|-] проверить подключение к базам данных
/f[+|-] нормализовать файл
/in: путь к файлу-источнику (По умолчанию: "")
/out: путь к файлу-приёмнику (По умолчанию: "")
/infolder: папка-источник с файлами csv (По умолчанию: "")
/outfolder: папка-приёмник с конвертированными файлами csv (По умолчанию: "")
/s[+|-] разделить файл
/m: максимальное число строк в файле (для разделения) (По умолчанию:
"2000")
/license: проверка лицензии
/help: справка по использованию
Подготовка исходной БД
-
Если в решении содержатся дополнительные SQL-скрипты, процедуры, представления и работы (jobs), необходимо реализовать их альтернативное поведение для Postgres.
-
Создайте резервную копию рабочей базы.
-
Оцените размер таблицы
dvsys_binaries
. -
Подготовьте файловое хранилище необходимого объема, больше, чем текущий размер таблицы
dvsys_binaries
. -
Настройте хранение всех несистемных файлов в новом файловом хранилище.
-
Так как бинарным файлам при вытеснении в файловое хранилище будет присваиваться имя, указанное в столбце
Name
таблицdvsys_files
(dvsys_files_archive
), убедитесь, что строки не содержат недопустимых символов или зеркалированных слов.-
Проверить наличие таких символов и слов можно при помощи следующего запроса:
select [FileID], [ArchiveState], [Name] from dvview_files where [Name] like '%[<>":/\|*?]%' or upper([Name]) in ('CON', 'PRN', 'AUX', 'NUL', 'COM1', 'COM2', 'COM3', 'COM4', 'COM5', 'COM6', 'COM7', 'COM8', 'COM9', 'LPT1', 'LPT2', 'LPT3', 'LPT4', 'LPT5', 'LPT6', 'LPT7', 'LPT8', 'LPT9')
-
Для выявленных файлов необходимо устранить проблемы наименования. Например, заменить знаки
?
в строке следующей командой:update [dvsys_files] set [Name] = REPLACE([Name], '?', '.') where [FileID] = '00000000-0000-0000-0000-000000000000'
-
-
Удалите созданные индексы и отключите полнотекстовый поиск, если он использовался в базе-источнике. Полнотекстовый поиск для PostgreSQL может быть установлен позднее, подробнее см. в разделе "Установить систему Elasticsearch".
-
Запустите скрипт для переноса существующих в базе несистемных файлов в созданное файловое хранилище, используя один из следующих вариантов:
-
MoveFilesToSpesificStorageScript.sql
.
Для корректной работы скрипта, в нём необходимо указать имя хранилища, в которое планируется перемещение.Скрипт выберет все файлы, не связанные со справочниками напрямую, то есть те, в которых нет ссылок на файлы из секций справочников, не указан справочник в
OwnerCardID
файла, и добавит файлы в очередь на перемещение. Непосредственное перемещение выполняется сервисомFileService
.
Часть скрипта, выбирающая файлы для перемещения, может быть переработана под специфику других задач. -
MoveFilesToSpesificStorageScript_simple.sql
Этот упрощенный скрипт позволяет не указывать целевое хранилище при условии, если приоритет правила для помещения в хранилище установлен перед всеми другими.Рисунок 1. Приоритет правил помещения в хранилище
-
-
Дождитесь завершения обработки созданной очереди. Выполните запрос:
select * from dvsys_queue_object where QueueID in (select [ID] from [dvsys_queue_queue] where [Name] = 'MoveFilesToStorage')
Когда счётчик перестал уменьшаться, обработка очереди завершена.
-
После миграции файлов на диск дождитесь удаления старых записей из таблицы
dvsys_binaries
. Система не обрабатывает очереди асинхронно. За это отвечает SQL работаDV:Binary_<имя бд>_DeleteBinaryInner
.
В противном случае старые файлы будут экспортированы в.csv
файлы, что приведёт к заполнению дополнительного места на диске и потребует дополнительного времени. -
Если в базе было включено и использовалось внешнее хранилище
FileStream
, и после вытеснения файлов на диск внешнего хранилища остались файлы, их необходимо вытеснить сFileStream
в основную БД.
Для проверки наличия файлов в хранилищеFileStream
можно использовать следующий запрос:select top 1 * from dvsys_binaries where [StreamData] is not null
Если запрос возвращает ответ, выполните обратное вытеснение:
update b set [Data] = [StreamData], [StreamData] = null from dvsys_binaries b where b.[StreamData] is not null; update f set [StorageState] = 0 from dvsys_files f where [StorageState] = 1;
-
Выполните аналогичные действия для архивной части.
Выполнение миграции
-
Перед продолжением убедитесь, что выполнены все указанные выше требования.
-
Сгенерируйте в рабочей БД вспомогательные объекты (таблицы и представления). Пример команды приведён ниже:
CloneDbUtil.exe /ms:"Initial Catalog= source_db; Data Source=server; Integrated Security = SSPI;" /install
-
Создайте папку для экспорта таблицы в
.csv
файлы на сервере Microsoft SQL.
Экспорт выполняется на сервере СУБД утилитойbcp.exe
, входящей в состав Microsoft SQL Server. Использование команды из примера ниже вызоветbcp.exe
:CloneDbUtil.exe /ms:"Initial Catalog= source_db; Data Source=server; Integrated Security = SSPI;" /p:"C\clone_db_data" /export /l:10
Ключ
/l:10
может использоваться для ограничения количества таблиц, выгружаемых за раз. Если ключ не указан, выгружаются все таблицы. Рекомендуется использовать этот ключ для порционного выполнения, контролируя доступное дисковое пространство. -
Измените кодировку
.csv
файлов.
Файлы выгружаются с кодировкой Юникод в то время как нативная кодировка PostgreSQL — UTF8, поэтому у файлов потребуется сменить кодировку и нормализовать определенные символы. Для этого предусмотрен следующий этап и режим работы утилиты.Чтобы изменить кодировку файлов, созданных при экспорте, необходимо перенести их на сервер, где создана БД Postgres, а затем на этом сервере запустить утилиту и выполнить перекодировку:
CloneDbUtil.exe /f /infolder:"C:\clone_db_data" /outfolder:"C:\clone_db_data2"
Команда выше перекодирует и нормализует каждый
.csv
файл в директорииC:\clone_db_data
. Папка, в которой будут храниться перекодированные файлы, должна быть создана. Обработанные файлы сохраняются в директорииC:\clone_db_data2
. Для работы этого этапа необходимо предусмотреть дисковое пространство.Перекодировку можно выполнить и для отдельного файла, например так:
CloneDbUtil.exe /f /in:"C:\clone_db_data\dvsys_instances.cvs" /out:"C:\clone_db_data2\dvsys_instances.cvs"
-
Создайте структуры БД PostgreSQL для импорта таблиц.
Утилита использует метаданные из базы-источника для генерации скриптов библиотек карточек и сгенерирует таблицы необходимой структуры в базе PostgreSQL.CloneDbUtil.exe /ms:"Initial Catalog= source_db; Data Source=server; Integrated Security = SSPI;" /pg:"Server=127.0.0.1; Port=5432; Database=target_db; User ID=postgres; Password=password;" /clone
-
Выполните импорт
.csv
файлов:CloneDbUtil.exe /ms:"Initial Catalog= source_db; Data Source=server; Integrated Security = SSPI;" /pg:"Server=127.0.0.1; Port=5432; Database=target_db; User ID=postgres; Password=password;" /import /p:"C:\clone_db_data2" /l:25
Список таблиц для обработки хранится в базе-источнике в таблице
dvexport_commands
. В ней же записаны команды для импорта и экспорта. При необходимости текст команд может быть исправлен SQL-запросом, и уже исправленные команды будут выполняться утилитой в режимах/export
или/import
. Кроме того, в столбцеStatus
для каждой таблицы предусмотрен статус обработки. Всего их пять:-
0
— not exported; Таблица не обрабатывалась -
1
— export started; Запущен экспорт в csv файл, процесс выполняется -
2
— export finished; Процесс экспорта успешно завершен. -
3
— import started; Запущен процесс импорта csv файла в базу pg -
4
— import finished; Процесс импорта успешно завершенЕсли процесс импорта или экспорта не завершается успешно, запись остается в соответствующем статусе. Для возобновления процесса после устранения причин неудачи нужно запросом скорректировать статус на предыдущий и повторить запуск утилиты. Утилита продолжит работу с этой таблицы.
-
-
Выполните полное обновление базы Postgres через консоль настройки Docsvision.
Рекомендуется понизить версию базы и библиотек карточек запросом. Например, если версия базы-источника была
4352
, перед обновлением следует выполнить команды:update dvsys_globalinfo set "Version" = 4350; update dvsys_libraries set "SysVersion" = 4350 where "SysVersion" = 4352; update dvsys_carddefs set "SysVersion" = 4350 where "SysVersion" = 4352;
При переходе к шагу загрузки библиотек карточек и настроек дополнительных модулей выполните перезапуск IIS.
-
Назначьте PostgreSQL базу основной и отключите базу Microsoft SQL в Консоли настройки Docsvision.
-
Заново выполните настройки модуля Управление процессами, настройки почты см. в документации модуля Управление процессами версии 5.5.3. Также выполните настройки почты и подключения к БД в Консоли управления Docsvision, см. "Настройка соединения с почтовым сервером".
-
Запустите все остановленные сервисы.
-
При повторном экспорте, например в другую папку потребуется сменить статус БД:
(update [alias_migrationpg].[dbo].[dvexport_commands] set [status] = 0)
В противном случае экспорт не будет выполнен, т.к. утилита определит, что экспорт уже прошел и повторно его не выполнит.