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

Azure Database Migration Service можно использовать для переноса баз данных из локального экземпляра PostgreSQL в Базу данных Azure для PostgreSQL с минимальным временем простоя. Другими словами, миграцию можно выполнить с минимальным временем простоя для приложения. В этом руководстве выполняется миграция примера базы данных Прокат DVD из локального экземпляра 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 9.6 можно выполнить миграцию только в Базу данных Azure для PostgreSQL 9.6, 10 или 11, но не в Базу данных Azure для PostgreSQL 9.5.

  • Создайте экземпляр Базы данных Azure для PostgreSQL или сервер базы данных Azure для PostgreSQL (Гипермасштабирование (Citus)).

  • Создайте виртуальную сеть 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 Server. По умолчанию это 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.

    Дополнительные сведения о подключении к базе данных и о создании базы данных см. в кратких руководствах Создание сервера Базы данных Azure для PostgreSQL с помощью портала Azure или Создание серверной группы Гипермасштабирования (Citus) на портале Azure.

  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 97181df2-909d-420b-ab93-1bff15acb6b7
      
  2. Подготовьте к работе экземпляр DMS, выполнив следующую команду.

    az dms create -l <location> -n <newServiceName> -g <yourResourceGroupName> --sku-name Premium_4vCores --subnet/subscriptions/{vnet subscription id}/resourceGroups/{vnet resource group}/providers/Microsoft.Network/virtualNetworks/{vnet name}/subnets/{subnet name} –tags tagName1=tagValue1 tagWithNoValue
    

    Ниже приведен пример команды и службы, которую она создает.

    • Расположение: восточная часть США 2.
    • Подписка: 97181df2-909d-420b-ab93-1bff15acb6b7.
    • Имя группы ресурсов: PostgresDemo.
    • Имя службы DMS: PostgresCLI.
    az dms create -l eastus2 -g PostgresDemo -n PostgresCLI --subnet /subscriptions/97181df2-909d-420b-ab93-1bff15acb6b7/resourceGroups/ERNetwork/providers/Microsoft.Network/virtualNetworks/AzureDMS-CORP-USC-VNET-5044/subnets/Subnet-1 --sku-name Premium_4vCores
    

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

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

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

    Например:

    az network nic list -g PostgresDemo --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>
    

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

    • Расположение: центрально-западная часть США.
    • Имя группы ресурсов: PostgresDemo.
    • Имя службы: PostgresCLI.
    • Имя проекта: PGMigration.
    • Платформа источника: PostgreSQL.
    • Целевая платформа: AzureDbForPostgreSql.
    az dms project create -l westcentralus -n PGMigration -g PostgresDemo --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-файл параметров базы данных с одной записью для каждой базы данных, указав имена базы данных-источника и целевой базы данных, а также список таблиц, выбранных для переноса. Для заполнения массива selectedTables можно использовать выходные данные приведенного выше SQL-запроса. Обратите внимание на то, что если список выбранных таблиц пустой, то служба перенесет все таблицы, схемы и имена которых соответствуют указанным параметрам.

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

      az dms project task create -g PostgresDemo --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 PostgresDemo --name runnowtask
      
    • Просмотр подробных сведений о состоянии задачи, включая сведения о ходе миграции.

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

      az dms project task show --service-name PostgresCLI --project-name PGMigration --resource-group PostgresDemo --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
    

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

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

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

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

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

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

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

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

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

    az dms delete -g ProgresDemo -n PostgresCLI
    

Следующие шаги