Бөлісу құралы:


Руководство. Перенос PostgreSQL в База данных Azure для PostgreSQL в Интернете с помощью DMS (классической) с помощью Azure CLI

Внимание

Рекомендуется использовать новую службу миграции в База данных Azure для PostgreSQL для более эффективной и упрощенной миграции. Эта служба упрощает процесс, поддерживая различные исходные среды, обеспечивая переход на База данных Azure для PostgreSQL без хэссов.

Для переноса баз данных из локального экземпляра PostgreSQL в База данных Azure для PostgreSQL с минимальным временем простоя можно использовать Azure Database Migration Service (DMS). Другими словами, миграцию можно выполнить с минимальным временем простоя для приложения. В этом руководстве вы переносите DVD Rental образец базы данных из локального экземпляра PostgreSQL 9.6 в База данных Azure для PostgreSQL с помощью действия миграции в Сети в Службе azure Database Migration Service.

В этом руководстве описано следующее:

  • перенос примера схемы с помощью служебной программы pg_dump;
  • создание экземпляра Azure Database Migration Service;
  • создание проекта миграции с помощью Azure Database Migration Service;
  • выполнение миграции.
  • Мониторинг миграции.

Чтобы выполнить сетевую миграцию с помощью Azure Database Migration Service, требуется создать экземпляр ценовой категории "Премиум". Мы шифруем диск для защиты данных от кражи при миграции.

Внимание

Чтобы процесс миграции был выполнен без проблем, корпорация Майкрософт рекомендует создать экземпляр Azure Database Migration Service в том же регионе Azure, в котором размещена целевая база данных. Перемещение данных между регионами и географическими областями может замедлить процесс миграции и привести к ошибкам.

Необходимые компоненты

Для работы с этим руководством вам потребуется следующее:

  • Скачайте и установите PostgreSQL Community Edition 9.4, 9.5, 9.6 или 10. На исходном сервере должна быть установлена система PostgreSQL версии 9.4, 9.5, 9.6, 10, 11, 12 или 13. Дополнительные сведения см. в статье Поддерживаемые версии базы данных PostgreSQL.

    Целевая База данных Azure для PostgreSQL версия должна быть равной или более поздней версии локальной версии PostgreSQL. Например, для PostgreSQL 9.6 можно выполнить миграцию только в Базу данных Azure для PostgreSQL 9.6, 10 или 11, но не в Базу данных Azure для PostgreSQL 9.5.

  • Создайте экземпляр в База данных Azure для PostgreSQL — гибкий сервер.

  • Создайте виртуальную сеть Microsoft Azure для Azure Database Migration Service с помощью модели развертывания Azure Resource Manager. Она обеспечивает подключение "сеть — сеть" к локальным исходным серверам через ExpressRoute или VPN. Дополнительные сведения см. в статье Документация по виртуальной сети, где особое внимание стоит уделить кратким руководствам с пошаговыми инструкциями.

    Если вы используете ExpressRoute с пиринговым подключением к сети, управляемой Майкрософт, во время настройки виртуальной сети добавьте в подсеть, в которой будет подготовлена служба, следующие конечные точки:

    • Целевая конечная точка базы данных (например, конечная точка SQL, конечная точка Azure Cosmos DB и т. д.)
    • конечную точку службы хранилища;
    • конечную точку служебной шины.

    Такая конфигурация вызвана тем, что у Azure Database Migration Service нет подключения к Интернету.

  • Убедитесь, что правила группы безопасности сети для виртуальной сети не блокируют исходящий порт 443 ServiceTag для Служебной шины, службы хранилища и Azure Monitor. См. дополнительные сведения о фильтрации трафика, предназначенного для виртуальной сети, с помощью групп безопасности сети.

  • Настройте брандмауэр Windows для доступа к ядру СУБД.

  • Откройте брандмауэр Windows, чтобы разрешить Azure Database Migration Service получить доступ к исходному серверу PostgreSQL, который по умолчанию является TCP-портом 5432.

  • При использовании устройства брандмауэра перед исходными базами данных может потребоваться добавить правила брандмауэра, чтобы разрешить Azure Database Migration Service получить доступ к исходным базам данных для миграции.

  • Создайте правило брандмауэра уровня сервера для Базы данных Azure для PostgreSQL, чтобы предоставить службе Azure Database Migration Service доступ к целевым базам данных. Задайте диапазон подсети в виртуальной сети, которая используется для Azure Database Migration Service.

  • Вызвать интерфейс командной строки можно двумя способами.

    • Нажмите кнопку Cloud Shell в правом верхнем углу окна портала Azure.

      Снимок экрана: кнопка Cloud Shell в портал Azure.

    • Установите и запустите CLI локально. CLI 2.18 или более поздней версии программы командной строки требуется для управления ресурсами Azure, необходимыми для этой миграции.

      Чтобы установить CLI, следуйте инструкциям в статье об установке Azure CLI 2.0. В этой статье также указаны платформы, поддерживающие Azure CLI.

      Следуйте инструкциям в Руководстве по установке Windows 10, чтобы настроить подсистему Windows для Linux (WSL).

  • Включите логическую репликацию на исходном сервере postgresql.config , изменив файл и установив следующие параметры:

    • wal_level = logical

    • max_replication_slots = [количество слотов]. Рекомендуемый 5параметр.

    • max_wal_senders = [число параллельных задач]. Параметр max_wal_senders задает количество параллельных задач, которые могут выполняться. Рекомендуемый 10параметр.

Перенос примера схемы

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

  1. Используйте команду pg_dump -s, чтобы создать схемы файла дампа для базы данных.

    pg_dump -O -h hostname -U db_username -d db_name -s > your_schema.sql
    

    Например, как выгрузить схему файла дампа базы данных dvdrental, см. ниже.

    pg_dump -O -h localhost -U postgres -d dvdrental -s  > dvdrentalSchema.sql
    

    Дополнительные сведения об использовании программы pg_dump см. в примерах руководства о pg-dump.

  2. Создайте пустую базу данных в целевой среде, которая База данных Azure для PostgreSQL — гибкий сервер.

  3. Импортируйте схемы в целевую базу данных, созданную путем восстановления схемы файла дампа.

    psql -h hostname -U db_username -d db_name < your_schema.sql
    

    Рассмотрим пример.

    psql -h mypgserver-20170401.postgres.database.azure.com  -U postgres -d dvdrental < dvdrentalSchema.sql
    

    Примечание.

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

Подготовка экземпляра DMS с помощью Azure CLI

  1. Установите расширение синхронизации DMS:

    • Войдите в Azure, выполнив следующую команду.

      az login
      
    • По запросу откройте браузер и введите код для проверки подлинности устройства. Выполните приведенные далее инструкции.

    • Оперативная миграция PostgreSQL теперь доступна в стандартном пакете CLI (версии 2.18.0 и более поздней версии), и расширение dms-preview не требуется. Если вы установили расширение в прошлом, его можно удалить, выполнив следующие действия.

      • Чтобы проверить, установлено ли расширение dms-preview, выполните следующую команду:

        az extension list -o table
        
      • Если расширение dms-preview установлено, удалите его, выполнив следующую команду:

        az extension remove --name dms-preview
        
      • Чтобы проверить правильность dms-preview удаления расширения, выполните следующую команду и не dms-preview увидите расширение в списке:

        az extension list -o table
        

      Внимание

      dms-preview расширение может по-прежнему потребоваться для других путей миграции, поддерживаемых Azure DMS. Чтобы определить, требуется ли расширение, обратитесь к документации по конкретному способу миграции. В этой документации рассматривается расширение, необходимое для PostgreSQL в Базе данных Azure для PostgreSQL.

    • В любое время просмотрите все команды, поддерживаемые в DMS, выполнив следующее.

      az dms -h
      
    • Если у вас несколько подписок Azure, выполните следующую команду, чтобы выбрать нужную подписку, которую необходимо использовать, чтобы подготовить к работе экземпляр службы DMS.

      az account set -s <SubscriptionID>
      
  2. Подготовьте к работе экземпляр DMS, выполнив следующую команду.

    az dms create -l <location> -n <newServiceName> -g <yourResourceGroupName> --sku-name Premium_4vCores --subnet/subscriptions/<SubscriptionID>/resourceGroups/<ResourceGroupName>/providers/Microsoft.Network/virtualNetworks/<VirtualNetwork>/subnets/<SubnetName> –tags tagName1=tagValue1 tagWithNoValue
    

    Например, следующая команда создает службу. Замените , <ResourceGroupName>а также <SubscriptionID><VirtualNetwork> допустимыми значениями.

    • Расположение: восточная часть США2
    • Подписка: <SubscriptionID>
    • Имя группы ресурсов: <ResourceGroupName>
    • Имя службы DMS: PostgresCLI
    az dms create -l eastus2 -g <ResourceGroupName> -n PostgresCLI --subnet /subscriptions/<SubscriptionID>/resourceGroups/ERNetwork/providers/Microsoft.Network/virtualNetworks/<VirtualNetwork>/subnets/Subnet-1 --sku-name Premium_4vCores
    

    Создание экземпляра службы DMS занимает около 10 минут.

  3. Чтобы определить IP-адрес агента DMS, чтобы добавить его в файл Postgres pg_hba.conf , выполните следующую команду:

    az network nic list -g <ResourceGroupName> --query '[].ipConfigurations | [].privateIpAddress'
    

    Например:

    az network nic list -g <resource-group> --query '[].ipConfigurations | [].privateIpAddress'
    

    Отобразится результат, похожий на следующий адрес.

    [
      "172.16.136.18"
    ]
    
  4. Добавьте IP-адрес агента DMS в файл Postgres pg_hba.conf .

    • Запишите IP-адрес DMS после того, как завершите подготовку DMS.

    • Добавьте IP-адрес pg_hba.conf в файл в источник, как показано в следующей записи:

      host     all            all        172.16.136.18/10    md5
      host     replication    postgres   172.16.136.18/10    md5
      
  5. Создайте проект миграции PostgreSQL, выполнив следующую команду.

    az dms project create -l <location> -g <ResourceGroupName> --service-name <yourServiceName> --source-platform PostgreSQL --target-platform AzureDbforPostgreSQL -n <newProjectName>
    

    Например, следующая команда создает проект, используя следующие параметры.

    • Расположение: западная часть США
    • Имя группы ресурсов: <ResourceGroupName>
    • Имя службы: PostgresCLI
    • Имя проекта: PGMigration
    • Исходная платформа: PostgreSQL
    • Целевая платформа: AzureDbForPostgreSql
    az dms project create -l westcentralus -n PGMigration -g <ResourceGroupName> --service-name PostgresCLI --source-platform PostgreSQL --target-platform AzureDbForPostgreSql
    
  6. Создайте задачу миграции PostgreSQL, выполнив следующие действия.

    Этот шаг включает использование IP-адреса источника, идентификатора пользователя и пароля, IP-адреса назначения, UserID, пароля и типа задачи для возможности подключения.

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

      az dms project task create -h
      

      Для исходного и целевого соединений входной параметр относится к JSON-файлу, который имеет список объектов.

      Формат подключения JSON-объекта для PostgreSQL.

      {
          // if this is missing or null, you will be prompted
          "userName": "user name",
          // if this is missing or null (highly recommended) you will  be prompted
          "password": null,
          "serverName": "server name",
          // if this is missing, it will default to the 'postgres' database
          "databaseName": "database name",
          // if this is missing, it will default to 5432
          "port": 5432
      }
      

      Также имеется JSON-файл параметров базы данных, который содержит JSON-объекты. Для PostgreSQL формат объекта JSON параметров базы данных показан следующим образом:

      [
          {
              "name": "source database",
              "target_database_name": "target database",
              "selectedTables": [
                  "schemaName1.tableName1",
                  ...n
              ]
          },
          ...n
      ]
      
    • Чтобы создать JSON-файл исходного подключения, откройте Блокнот, скопируйте приведенный ниже код JSON и вставьте его в файл. Внеся в него изменения в соответствии со своим исходным сервером, сохраните этот файл как C:\DMS\source.json.

      {
          "userName": "postgres",
          "password": null,
          "serverName": "13.51.14.222",
          "databaseName": "dvdrental",
          "port": 5432
      }
      
    • Чтобы создать JSON-файл целевого подключения, откройте Блокнот, скопируйте приведенный ниже код JSON и вставьте его в файл. Внеся в него изменения в соответствии со своим целевым сервером, сохраните этот файл как C:\DMS\target.json.

      {
          "userName": " dms@builddemotarget",
          "password": null,
          "serverName": " builddemotarget.postgres.database.azure.com",
          "databaseName": "inventory",
          "port": 5432
      }
      
    • Создайте JSON-файл параметров базы данных, который содержит данные инвентаризации и сопоставление баз данных для переноса.

      • Создайте список таблиц для переноса или используйте SQL-запрос для создания списка из базы данных-источника. Ниже приведен пример запроса для создания списка таблиц. При использовании этого запроса не забудьте удалить последнюю запятую в конце последнего имени таблицы, чтобы сделать его допустимым массивом JSON.

        SELECT FORMAT('%s,', REPLACE(FORMAT('%I.%I', schemaname, tablename), '"', '\"')) AS SelectedTables
        FROM pg_tables
        WHERE schemaname NOT IN ('pg_catalog', 'information_schema');
        
      • Создайте JSON-файл параметров базы данных с одной записью для каждой базы данных с именами исходных и целевых баз данных и списком выбранных таблиц, которые необходимо перенести. Выходные данные предыдущего SQL-запроса можно использовать для заполнения массива selectedTables .

        Примечание.

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

        [
            {
                "name": "dvdrental",
                "target_database_name": "dvdrental",
                "selectedTables": [
                    "schemaName1.tableName1",
                    "schemaName1.tableName2",
                    ...
                    "schemaNameN.tableNameM"
                ]
            },
            ... n
        ]
        
    • Выполните приведенную ниже команду, которая принимает исходное подключение, целевое подключение и JSON-файлы параметров баз данных.

      az dms project task create -g <ResourceGroupName> --project-name PGMigration --source-connection-json c:\DMS\source.json --database-options-json C:\DMS\option.json --service-name PostgresCLI --target-connection-json c:\DMS\target.json --task-type OnlineMigration -n runnowtask
      

    На этом этапе вы успешно отправили задачу миграции.

  7. Чтобы показать ход выполнения задачи, выполните следующие команды.

    • Чтобы просмотреть общее состояние задачи, кратко:

      az dms project task show --service-name PostgresCLI --project-name PGMigration --resource-group <ResourceGroupName> --name runnowtask
      
    • Чтобы просмотреть подробные сведения о состоянии задачи, включая сведения о ходе миграции:

      az dms project task show --service-name PostgresCLI --project-name PGMigration --resource-group <ResourceGroupName> --name runnowtask --expand output
      
    • Вы также можете использовать формат запроса JMESPath , чтобы извлечь migrationState только из развернутых выходных данных:

      az dms project task show --service-name PostgresCLI --project-name PGMigration --resource-group <ResourceGroupName> --name runnowtask --expand output --query 'properties.output[].migrationState'
      

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

      {
          "output": [
              // Database Level
              {
                  "appliedChanges": 0, // Total incremental sync applied after full load
                  "cdcDeleteCounter": 0, // Total delete operation  applied after full load
                  "cdcInsertCounter": 0, // Total insert operation applied after full load
                  "cdcUpdateCounter": 0, // Total update operation applied after full load
                  "databaseName": "inventory",
                  "endedOn": null,
                  "fullLoadCompletedTables": 2, //Number of tables completed full load
                  "fullLoadErroredTables": 0, //Number of tables that contain migration error
                  "fullLoadLoadingTables": 0, //Number of tables that are in loading status
                  "fullLoadQueuedTables": 0, //Number of tables that are in queued status
                  "id": "db|inventory",
                  "incomingChanges": 0, //Number of changes after full load
                  "initializationCompleted": true,
                  "latency": 0,
                  //Status of migration task
                  "migrationState": "READY_TO_COMPLETE", //READY_TO_COMPLETE => the database is ready for cutover
                  "resultType": "DatabaseLevelOutput",
                  "startedOn": "2018-07-05T23:36:02.27839+00:00"
              }, {
                  "databaseCount": 1,
                  "endedOn": null,
                  "id": "dd27aa3a-ed71-4bff-ab34-77db4261101c",
                  "resultType": "MigrationLevelOutput",
                  "sourceServer": "138.91.123.10",
                  "sourceVersion": "PostgreSQL",
                  "startedOn": "2018-07-05T23:36:02.27839+00:00",
                  "state": "PENDING",
                  "targetServer": "builddemotarget.postgres.database.azure.com",
                  "targetVersion": "Azure Database for PostgreSQL"
              },
              // Table 1
              {
                  "cdcDeleteCounter": 0,
                  "cdcInsertCounter": 0,
                  "cdcUpdateCounter": 0,
                  "dataErrorsCount": 0,
                  "databaseName": "inventory",
                  "fullLoadEndedOn": "2018-07-05T23:36:20.740701+00:00", //Full load completed time
                  "fullLoadEstFinishTime": "1970-01-01T00:00:00+00:00",
                  "fullLoadStartedOn": "2018-07-05T23:36:15.864552+00:00", //Full load started time
                  "fullLoadTotalRows": 10, //Number of rows loaded in full load
                  "fullLoadTotalVolumeBytes": 7056, //Volume in Bytes in full load
                  "id": "or|inventory|public|actor",
                  "lastModifiedTime": "2018-07-05T23:36:16.880174+00:00",
                  "resultType": "TableLevelOutput",
                  "state": "COMPLETED", //State of migration for this table
                  "tableName": "public.catalog", //Table name
                  "totalChangesApplied": 0 //Total sync changes that applied after full load
              },
              //Table 2
              {
                  "cdcDeleteCounter": 0,
                  "cdcInsertCounter": 50,
                  "cdcUpdateCounter": 0,
                  "dataErrorsCount": 0,
                  "databaseName": "inventory",
                  "fullLoadEndedOn": "2018-07-05T23:36:23.963138+00:00",
                  "fullLoadEstFinishTime": "1970-01-01T00:00:00+00:00",
                  "fullLoadStartedOn": "2018-07-05T23:36:19.302013+00:00",
                  "fullLoadTotalRows": 112,
                  "fullLoadTotalVolumeBytes": 46592,
                  "id": "or|inventory|public|address",
                  "lastModifiedTime": "2018-07-05T23:36:20.308646+00:00",
                  "resultType": "TableLevelOutput",
                  "state": "COMPLETED",
                  "tableName": "public.orders",
                  "totalChangesApplied": 0
              }
          ],
          // DMS migration task state
          "state": "Running", //Running => service is still listening to any changes that might come in
          "taskType": null
      }
      

Задача прямой миграции

База данных готова к прямой миграции после завершения полной загрузки. В зависимости от того, как загружен исходный сервер новыми транзакциями, задача DMS может по-прежнему применяться к изменениям после завершения полной загрузки.

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

Database Level
"migrationState": "READY_TO_COMPLETE" => Status of migration task. READY_TO_COMPLETE means database is ready for cutover
"incomingChanges": 0 => Check for a period of 5-10 minutes to ensure no new incoming changes need to be applied to the target server

Table Level (for each table)
"fullLoadTotalRows": 10    => The row count matches the initial row count of the table
"cdcDeleteCounter": 0      => Number of deletes after the full load
"cdcInsertCounter": 50     => Number of inserts after the full load
"cdcUpdateCounter": 0      => Number of updates after the full load
  1. Выполните задачу прямой миграции базы данных с помощью следующей команды.

    az dms project task cutover -h
    

    Например, следующая команда инициирует вырезку для базы данных "Инвентаризация":

    az dms project task cutover --service-name PostgresCLI --project-name PGMigration --resource-group <ResourceGroupName> --name runnowtask  --object-name Inventory
    
  2. Запустите следующие команды, чтобы отследить ход выполнения прямой миграции.

    az dms project task show --service-name PostgresCLI --project-name PGMigration --resource-group <ResourceGroupName> --name runnowtask
    
  3. Когда состояние переноса базы данных изменится на Завершено, повторно создайте последовательности (если это необходимо) и подключите свои приложения к новому целевому экземпляру Базы данных Azure для PostgreSQL.

Службы, проект, задача очистки

Если необходимо отменить или удалить любую задачу, проект или службу DMS, выполните отмену в следующей последовательности:

  • отменить любую выполняемую задачу;
  • удалить задачу;
  • удалить проект;
  • удалить службу DMS.
  1. Чтобы отменить выполняемую задачу, используйте следующую команду.

    az dms project task cancel --service-name PostgresCLI --project-name PGMigration --resource-group <ResourceGroupName> --name runnowtask
    
  2. Чтобы удалить выполняемую задачу, используйте следующую команду.

    az dms project task delete --service-name PostgresCLI --project-name PGMigration --resource-group <ResourceGroupName> --name runnowtask
    
  3. Чтобы удалить проект, используйте следующую команду:

    az dms project delete -n PGMigration -g <ResourceGroupName> --service-name PostgresCLI
    
  4. Чтобы удалить службу DMS, используйте следующую команду.

    az dms delete -g <ResourceGroupName> -n PostgresCLI