Утилита миграции с БД Microsoft на Postgres

Процесс миграции с БД типа Microsoft SQL на PostgreSQL состоит из нескольких этапов. Это позволяет лучше контролировать каждый шаг миграции, а также позволяет продолжить миграцию с места остановки, например, при возникновении ошибки. Т.к. PostgreSQL не поддерживает Сателлитные БД, миграция в PostgreSQL подразумевает перенос архивных данных и журналов из соответствующих БД Microsoft SQL (_Archive и _Log) в основную.

Для использования утилиты миграции необходима опция лицензии Docsvision Утилита миграции на PostgreSQL.

Требования перед началом миграции:
  • Ознакомьтесь с разделом "Сравнение возможностей Docsvision при использовании БД Microsoft SQL Server и PostgreSQL".

  • Убедитесь, что на сервере PostgreSQL БД достаточно свободного места.

  • Выполните рекомендации по подготовке исходной базы.

  • Обновите модуль Платформа до версии 5.5.5, сборка 7876 и выше, поддерживающей миграцию и обновите рабочую БД.

  • Создайте новую пустую БД на сервере PostgreSQL.

  • Остановите работу всех сервисов Docsvision на рабочих серверах, включая кластеры.

  • Остановите работу всех SQL работ на рабочей БД.

  • Выполните резервное копирование рабочей базы.

  • Если миграция архивов и/или журналов из сателлитных БД не требуется, можно предварительно удалить настройки UseOuterArchive и/или UseOuterLog из таблицы dvsys_settings.

Краткая справка по миграцию:
  1. Подготовьте исходную БД Microsoft SQL.

  2. Вытесните файлы в файловое хранилище.

  3. Экспортируйте исходную БД в .csv файлы.

  4. Конвертируйте экспортированные .csv файлы.

  5. Подготовьте БД Postgres для миграции.

  6. Выполните миграцию .csv файлов в БД Postgres.

Описание утилиты миграции

Утилита миграции выполнена в виде консольного приложения.

Утилита может использоваться в режиме тестирования соединения, например, для проверки возможности установления соединения с базой-источником Microsoft SQL и базой-приёмником PostgreSQL. Примеры использования приведены ниже:

Проверка подключения к БД PostgreSQL
CloneDbUtil.exe /pg:"Server=127.0.0.1; Port=5432; Database=target_db; User ID=postgres; Password=password;" /test
Проверка подключения к БД Microsoft SQL
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: справка по использованию

Подготовка исходной БД

  1. Если в решении содержатся дополнительные SQL-скрипты, процедуры, представления и работы (jobs), необходимо реализовать их альтернативное поведение для Postgres.

  2. Создайте резервную копию рабочей базы.

  3. Оцените размер таблицы dvsys_binaries.

  4. Подготовьте файловое хранилище необходимого объема, больше, чем текущий размер таблицы dvsys_binaries.

  5. Настройте хранение всех несистемных файлов в новом файловом хранилище.

  6. Так как бинарным файлам при вытеснении в файловое хранилище будет присваиваться имя, указанное в столбце Name таблиц dvsys_files (dvsys_files_archive), убедитесь, что строки не содержат недопустимых символов или зеркалированных слов.

    1. Проверить наличие таких символов и слов можно при помощи следующего запроса:

      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')
    2. Для выявленных файлов необходимо устранить проблемы наименования. Например, заменить знаки ? в строке следующей командой:

      update [dvsys_files]
      set [Name] = REPLACE([Name], '?', '.')
      where [FileID] = '00000000-0000-0000-0000-000000000000'
  7. Удалите созданные индексы и отключите полнотекстовый поиск, если он использовался в базе-источнике. Полнотекстовый поиск для PostgreSQL может быть установлен позднее, подробнее см. в разделе "Установить систему Elasticsearch".

  8. Запустите скрипт для переноса существующих в базе несистемных файлов в созданное файловое хранилище, используя один из следующих вариантов:

    • MoveFilesToSpesificStorageScript.sql.
      Для корректной работы скрипта, в нём необходимо указать имя хранилища, в которое планируется перемещение.

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

    • MoveFilesToSpesificStorageScript_simple.sql
      Этот упрощенный скрипт позволяет не указывать целевое хранилище при условии, если приоритет правила для помещения в хранилище установлен перед всеми другими.

      Приоритет правил помещения в хранилище
      Рисунок 1. Приоритет правил помещения в хранилище
  9. Дождитесь завершения обработки созданной очереди Docsvision 5.5 File Service. Выполните запрос:

    select * from dvsys_queue_object where QueueID in (select [ID] from [dvsys_queue_queue] where [Name] = 'MoveFilesToStorage')

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

  10. После миграции файлов на диск дождитесь удаления старых записей из таблицы dvsys_binaries. Docsvision 5.5 File Service не обрабатывает очереди асинхронно. За это отвечает SQL работа DV:Binary_<имя бд>_DeleteBinaryInner.
    В противном случае старые файлы будут экспортированы в .csv файлы, что приведёт к заполнению дополнительного места на диске и потребует дополнительного времени.

  11. Если в базе было включено и использовалось внешнее хранилище 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;
  12. Выполните аналогичные действия для архивной части.

Выполнение миграции

  1. Перед продолжением убедитесь, что выполнены все указанные выше требования.

  2. Сгенерируйте в рабочей БД вспомогательные объекты (таблицы и представления). Пример команды приведён ниже:

    CloneDbUtil.exe /ms:"Initial Catalog= source_db; Data Source=server; Integrated Security = SSPI;" /install
  3. Создайте папку для экспорта таблицы в .csv файлы на сервере Microsoft SQL.
    Экспорт выполняется на сервере СУБД утилитой bcp.exe, входящей в состав Microsoft SQL Server. Использование команды из примера ниже вызовет bcp.exe:

    CloneDbUtil.exe /ms:"Initial Catalog= source_db; Data Source=server; Integrated Security = SSPI;" /p:"D:\clone_db_data" /export /l:10

    Ключ /l:10 может использоваться для ограничения количества таблиц, выгружаемых за раз. Если ключ не указан, выгружаются все таблицы. Рекомендуется использовать этот ключ для порционного выполнения, контролируя доступное дисковое пространство.

    Экспорт таблиц в .csv файлы предполагает работу с функцией xp_cmdshell, которая может быть выключена для Microsoft SQL Server, что приведет к ошибке вида SQL Server blocked access to procedure 'sys.xp_cmdshell'. Если это произошло, следует включить параметр конфигурации сервера xp_cmdshell.

      -- To allow advanced options to be changed.
    EXECUTE sp_configure 'show advanced options', 1;
    GO
    -- To update the currently configured value for advanced options.
    RECONFIGURE;
    GO
    -- To enable the feature.
    EXECUTE sp_configure 'xp_cmdshell', 1;
    GO
    -- To update the currently configured value for this feature.
    RECONFIGURE;
    GO
    -- To set "show advanced options" back to false
    EXECUTE sp_configure 'show advanced options', 0;
    GO
    -- To update the currently configured value for advanced options.
    RECONFIGURE;
    GO

    Выполните экспорт, а затем снова выключите функцию xp_cmdshell:

      -- To allow advanced options to be changed.
    EXECUTE sp_configure 'show advanced options', 1;
    GO
    -- To update the currently configured value for advanced options.
    RECONFIGURE;
    GO
    -- To disable the feature.
    EXECUTE sp_configure 'xp_cmdshell', 0;
    GO
    -- To update the currently configured value for this feature.
    RECONFIGURE;
    GO
    -- To set "show advanced options" back to false
    EXECUTE sp_configure 'show advanced options', 0;
    GO
    -- To update the currently configured value for advanced options.
    RECONFIGURE;
    GO

    Экспорт данных требует указывать папку, в которую будут выгружены .csv файлы на той же машине, на которой установлен Microsoft SQL Server. Например, может быть так: \\server\Backups\Migration.

  4. Измените кодировку .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"

    Для импорта .csv файлов в базу Postgres их необходимо разместить на диск той машины, где развернут PostgreSQL. При этом PostgreSQL должен иметь доступ (соответствующие права у соответствующего пользователя) к этой папке. Поэтому можно задать, например, такой путь: C:\Program Files\PostgreSQL\12\share\Migration. До выполнения команды необходимо обеспечить наличие всех подпапок в пути. В противном случае возникнет ошибка вида Не удалось обнаружить часть пути).

  5. Создайте структуры БД 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
  6. Выполните импорт .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; Процесс импорта успешно завершен

      Если процесс импорта или экспорта не завершается успешно, запись остается в соответствующем статусе. Для возобновления процесса после устранения причин неудачи нужно запросом скорректировать статус на предыдущий и повторить запуск утилиты. Утилита продолжит работу с этой таблицы.

  7. Выполните полное обновление базы 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.

  8. Назначьте PostgreSQL базу основной и отключите базу Microsoft SQL в Консоли настройки Docsvision.

  9. Заново выполните настройки модуля Управление процессами, настройки почты см. в документации модуля Управление процессами версии 5.5.3. Также выполните настройки почты и подключения к БД в Консоли управления Docsvision, см. "Настройка соединения с почтовым сервером".

  10. Запустите все остановленные сервисы.

  11. При повторном экспорте, например в другую папку потребуется сменить статус БД:

    (update [alias_migrationpg].[dbo].[dvexport_commands] set [status] = 0)

    В противном случае экспорт не будет выполнен, т.к. утилита определит, что экспорт уже прошел и повторно его не выполнит.

Проверка работы

Проверьте работу всех клиентов:

  1. Открытие клиента.

  2. Открытие различных папок.

  3. Открытие всех видов карточек.

  4. Открытие файлов приложенных к карточкам.

  5. Создание различных файлов.

  6. Прикладывание файлов.

  7. Запуск и работу БП.