Упражнение. Миграция локальных баз данных PostgreSQL в Базу данных Azure для PostgreSQL

Завершено

В этом упражнении вы перенесете базу данных PostgreSQL в Azure. Вы перенесете существующую базу данных PostgreSQL, работающую на виртуальной машине, в Базу данных Azure для PostgreSQL.

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

Важно!

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

Настройка среды

Чтобы создать виртуальную машину, на которой работает PostgreSQL с копией базы данных AdventureWorks, выполните в Cloud Shel следующие команды Azure CLI. Последние команды выводят IP-адрес новой виртуальной машины.

az account list-locations -o table

az group create \
    --name migrate-postgresql \
    --location <CHOOSE A LOCATION FROM ABOVE NEAR YOU>

az vm create \
    --resource-group migrate-postgresql \
    --name postgresqlvm \
    --admin-username azureuser \
    --admin-password Pa55w.rdDemo \
    --image Ubuntu2204 \
    --public-ip-address-allocation static \
    --public-ip-sku Standard \
    --vnet-name postgresqlvnet \
    --nsg ""

az vm run-command invoke \
    --resource-group migrate-postgresql \
    --name postgresqlvm \
    --command-id RunShellScript \
    --scripts "
# Install PostgreSQL
sudo echo deb http://apt.postgresql.org/pub/repos/apt/ bionic-pgdg main > /etc/apt/sources.list.d/pgdg.list
sudo wget --quiet -O - https://www.postgresql.org/media/keys/ACCC4CF8.asc | sudo apt-key add -
sudo apt-get -y update
sudo apt-get -y install postgresql-10
# Clone exercise code
sudo git clone https://github.com/MicrosoftLearning/DP-070-Migrate-Open-Source-Workloads-to-Azure.git /home/azureuser/workshop    
# Configure PostgreSQL
sudo service postgresql stop
sudo bash << EOF
    printf \"listen_addresses = '*'\nwal_level = logical\nmax_replication_slots = 5\nmax_wal_senders = 10\n\" >> /etc/postgresql/10/main/postgresql.conf
    printf \"host    all             all             0.0.0.0/0               md5\n\" >> /etc/postgresql/10/main/pg_hba.conf
EOF
sudo service postgresql start

# Add the azureuser role and adventure works
sudo bash << EOF
su postgres << EOC
printf \"create role azureuser with login;alter role azureuser createdb;alter role azureuser password 'Pa55w.rd';alter role azureuser superuser;create database adventureworks;grant all privileges on database adventureworks to azureuser; \" | psql
EOC
EOF

PGPASSWORD=Pa55w.rd psql -h localhost -U azureuser adventureworks -E -q -f /home/azureuser/workshop/migration_samples/setup/postgresql/adventureworks/adventureworks.sql
"

az vm open-port \
    --resource-group migrate-postgresql \
    --name postgresqlvm \
    --priority 200 \
    --port '22'

az vm open-port \
    --resource-group migrate-postgresql \
    --name postgresqlvm \
    --priority 300 \
    --port '5432'

echo Setup Complete

SQLIP="$(az vm list-ip-addresses \
    --resource-group migrate-postgresql \
    --name postgresqlvm \
    --query "[].virtualMachine.network.publicIpAddresses[*].ipAddress" \
    --output tsv)"

echo $SQLIP

Выполнение этих команд занимает около 5 минут. Ждать завершения команд не нужно, можно перейти к следующим шагам.

Создание гибкого сервера База данных Azure для PostgreSQL

  1. В веб-браузере откройте новую вкладку и перейдите на Портал Azure.

  2. В строке поиска введите База данных Azure для PostgreSQL гибкие серверы.

  3. На странице гибких серверов База данных Azure для PostgreSQL нажмите кнопку +Создать.

  4. На странице "Гибкий сервер" введите следующие сведения, а затем нажмите кнопку "Проверить и создать".

    Свойство Значение
    Группа ресурсов migrate-postgresql
    Имя сервера adventureworksnnn, где nnn — это суффикс, позволяющий сделать имя сервера уникальным
    Местонахождение Выберите ближайшее к вам расположение
    Версия PostgreSQL 13
    Вычисления и хранение Выберите Настроить сервер, ценовую категорию Базовый, а затем нажмите кнопку ОК
    Имя администратора awadmin
    Password Pa55w.rdDemo
    Подтверждение пароля Pa55w.rdDemo
  5. На странице Отзыв и создание выберите Создать. Прежде чем продолжить, дождитесь завершения операции создания службы.

  6. После создания службы щелкните Перейти к ресурсу.

  7. Выберите Безопасность подключения.

  8. На странице Безопасность подключения задайте параметру Разрешить доступ к службам Azure значение Да.

  9. В списке правил брандмауэра добавьте правило с именем VM и задайте параметрам Начальный IP-адрес и Конечный IP значение, являющееся IP-адресом виртуальной машины, на которой запущен сервер PostgreSQL, созданный ранее.

  10. Выберите Добавить текущий IP-адрес клиента, чтобы разрешить клиентскому компьютеру подключаться к базе данных.

  11. Нажмите кнопку Сохранить и дождитесь обновления правил брандмауэра.

  12. Чтобы создать новую базу данных в Базе данных Azure для PostgreSQL, в командной строке Cloud Shell выполните следующую команду. Замените [nnn] суффиксом, который использовался при создании Базы данных Azure для PostgreSQL. Замените [resource group] именем группы ресурсов, указанной для службы:

    az postgres flexible-server create \
      --name azureadventureworks \
      --resource-group migrate-postgresql
    

    После успешного создания базы данных должно появиться сообщение следующего вида:

    {
      "charset": "UTF8",
      "collation": "English_United States.1252",
      "name": "azureadventureworks",
      "resourceGroup": "migrate-postgresql",
      "type": "Microsoft.DBforPostgreSQL/servers/databases"
    }
    

Экспорт схемы для использования в целевой базе данных

Теперь вы можете подключиться к существующей виртуальной машине PostgreSQL, используя Cloud Shell для экспорта схемы базы данных.

  1. Чтобы узнать IP-адрес существующей виртуальной машины, выполните следующую команду Azure CLI.

    SQLIP="$(az vm list-ip-addresses \
        --resource-group migrate-postgresql \
        --name postgresqlvm \
        --query "[].virtualMachine.network.publicIpAddresses[*].ipAddress" \
        --output tsv)"
    
    echo $SQLIP
    
  2. Подключитесь к прежнему серверу базы данных по протоколу SSH. Введите Pa55w.rdDemo в качестве пароля.

    ssh azureuser@$SQLIP
    
  3. Чтобы подключиться к базе данных на виртуальной машине, выполните следующую команду. Укажите пароль Pa55w.rd для пользователя azureuser сервера PostgreSQL, запущенного на виртуальной машине.

    psql adventureworks
    
  4. Предоставьте пользователю azureuser разрешение для репликации.

    ALTER ROLE azureuser REPLICATION;
    
  5. Закройте служебную программу psql, выполнив команду \q.

  6. Чтобы экспортировать схему базы данных adventureworks в файл с именем adventureworks_schema.sql, в командной строке Bash выполните следующую команду.

    pg_dump -o  -d adventureworks -s > adventureworks_schema.sql
    

Импорт схемы в целевую базу данных

  1. Чтобы подключиться к серверу azureadventureworks[nnn], выполните следующую команду. Замените два экземпляра [nnn] суффиксом для службы. Обратите внимание, что в имени пользователя используется суффикс @adventureworks[nnn]. При запросе пароля введите Pa55w.rdDemo.

    psql -h adventureworks[nnn].postgres.database.azure.com -U awadmin@adventureworks[nnn] -d postgres
    
  2. Чтобы создать пользователя с именем azureuser и задать для этого пользователя пароль Pa55w.rd, выполните следующие команды. Третья инструкция предоставляет пользователю azureuser необходимые привилегии для создания объектов в базе данных azureadventureworks и управления ими. Роль azure_pg_admin позволяет пользователю azureuser устанавливать и использовать расширения в базе данных.

    CREATE ROLE azureuser WITH LOGIN;
    ALTER ROLE azureuser PASSWORD 'Pa55w.rd';
    GRANT ALL PRIVILEGES ON DATABASE azureadventureworks TO azureuser;
    GRANT azure_pg_admin TO azureuser;
    
  3. Закройте служебную программу psql, выполнив команду \q.

  4. Импортируйте схему базы данных adventureworks в базу данных azureadventureworks, работающую в Базе данных Azure для PostgreSQL. Вы выполняете импорт в качестве пользователя azureuser, поэтому при появлении запроса введите пароль Pa55w.rd.

    psql -h adventureworks[nnn].postgres.database.azure.com -U azureuser@adventureworks[nnn] -d azureadventureworks -E -q -f adventureworks_schema.sql
    

    По мере создания каждого элемента будет отображаться ряд сообщений. Скрипт должен завершиться без ошибок.

  5. Выполните следующую команду. Скрипт findkeys.sql создает еще один скрипт SQL с именем dropkeys.sql, который удаляет все внешние ключи из таблиц в базе данных azureadventureworks. Вы запустите скрипт dropkeys.sq в ближайшее время:

    psql -h adventureworks[nnn].postgres.database.azure.com -U azureuser@adventureworks[nnn] -d azureadventureworks -f workshop/migration_samples/setup/postgresql/adventureworks/findkeys.sql -o dropkeys.sql -t
    
  6. Выполните следующую команду. Скрипт createkeys.sql создает еще один скрипт SQL с именем addkeys.sql, который будет повторно создавать все внешние ключи. Вы запустите скрипт addkeys.sql после миграции базы данных:

    psql -h adventureworks[nnn].postgres.database.azure.com -U azureuser@adventureworks[nnn] -d azureadventureworks -f workshop/migration_samples/setup/postgresql/adventureworks/createkeys.sql -o addkeys.sql -t
    
  7. Выполните скрипт dropkeys.sql:

    psql -h adventureworks[nnn].postgres.database.azure.com -U azureuser@adventureworks[nnn] -d azureadventureworks -f dropkeys.sql
    

    По мере удаления внешних ключей будут отображаться ряд инструкций ALTER TABLE.

  8. Снова запустите служебную программу psql и подключитесь к базе данных azureadventureworks.

    psql -h adventureworks[nnn].postgres.database.azure.com -U azureuser@adventureworks[nnn] -d azureadventureworks
    
  9. Чтобы найти сведения обо всех оставшихся внешних ключах, выполните следующий запрос:

    SELECT constraint_type, table_schema, table_name, constraint_name
    FROM information_schema.table_constraints
    WHERE constraint_type = 'FOREIGN KEY';
    

    Этот запрос должен вернуть пустой результирующий набор. Однако если внешние ключи все еще существуют, для каждого внешнего ключа выполните следующую команду:

    ALTER TABLE [table_schema].[table_name] DROP CONSTRAINT [constraint_name];
    
  10. После удаления оставшихся внешних ключей выполните следующую инструкцию SQL, чтобы отобразить триггеры в базе данных:

    SELECT trigger_name
    FROM information_schema.triggers;
    

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

  11. Закройте служебную программу psql, выполнив команду \q.

Выполнение миграции по сети с помощью службы Azure Database Migration Service

  1. Вернитесь на портал Azure.

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

  3. На странице подписки в разделе Параметры выберите Поставщики ресурсов.

  4. В поле Фильтровать по имени введите DataMigration, а затем выберите Microsoft.DataMigration.

  5. Если поставщик Microsoft.DataMigration не зарегистрирован, щелкните Зарегистрировать и подождите, пока значение в поле Состояние изменится на Зарегистрировано. Чтобы увидеть изменение состояния, может потребоваться нажать кнопку Обновить.

  6. Выберите Создать ресурс, в поле Поиск в Marketplace введите Azure Database Migration Service и нажмите клавишу "ВВОД".

  7. На странице Azure Database Migration Service щелкните Создать.

  8. На странице Создание службы миграции введите следующие сведения, а затем нажмите кнопку Далее: сеть>>.

    Свойство Значение
    Выберите группу ресурсов migrate-postgresql
    Service name adventureworks_migration_service
    Местонахождение Выберите ближайшее к вам расположение
    Режим службы Azure
    Ценовая категория Премиум с четырьмя виртуальными ядрами
  9. На странице Сеть выберите виртуальную сеть postgresqlvnet/posgresqlvmSubnet. Эта сеть была создана в процессе установки.

  10. Выберите Просмотр и создание, а затем нажмите кнопку Создать. Дождитесь завершения операции по созданию Database Migration Service. Это займет несколько минут.

  11. После создания службы щелкните Перейти к ресурсу.

  12. Щелкните элемент Новый проект миграции.

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

    Свойство Значение
    Имя проекта adventureworks_migration_project
    Тип исходного сервера PostgreSQL
    Целевая База данных для PostgreSQL База данных Azure для PostgreSQL
    Выберите тип действия Миграция данных через Интернет
  14. После запуска мастера миграции на странице Выбор источника введите следующие сведения, а затем нажмите кнопку Далее: выбор целевого объекта>>.

    Свойство Значение
    Имя исходного сервера nn.nn.nn.nn (IP-адрес виртуальной машины Azure с PostgreSQL)
    Порт сервера 5432
    База данных adventureworks
    Имя пользователя azureuser
    Password Pa55w.rd
    Доверять сертификату сервера Выбрано
    Шифровать соединение Выбрано
  15. На странице Выбор целевого объекта введите следующие сведения, а затем нажмите кнопку Далее: выбор баз данных>>.

    Свойство Значение
    Azure PostgreSQL adventureworks[nnn]
    База данных azureadventureworks
    Имя пользователя azureuser@adventureworks[nnn]
    Password Pa55w.rd
  16. На странице Выбор баз данных выберите базу данных adventureworks и сопоставьте ее с azureadventureworks. Отмените выбор базы данных postgres. Выберите Далее: выбор таблиц>>.

  17. На странице Выбор таблиц выберите Далее: настройка параметров миграции>>.

  18. На странице Настройка параметров миграции разверните раскрывающийся список adventureworks, разверните раскрывающийся список Расширенные параметры миграции по сети, убедитесь, что параметру Максимальное число параллельно загружаемых экземпляров задано значение "5", а затем выберите Далее: сводка>>.

  19. На странице Сводка в поле Имя действия введите AdventureWorks_Migration_Activity, а затем нажмите кнопку Начать миграцию.

  20. На странице AdventureWorks_Migration_Activity щелкайте кнопку Обновить с интервалом в 15 секунд. Состояние операции миграции будет отображаться по мере выполнения. Дождитесь, пока в столбце Сведения о миграции не появится значение Все готово к прямой миграции.

  21. Вернитесь в Cloud Shell.

  22. Чтобы повторно создать внешние ключи в базе данных azureadventureworks, выполните следующую команду. Скрипт addkeys.sql был создан ранее:

    psql -h adventureworks[nnn].postgres.database.azure.com -U azureuser@adventureworks[nnn] -d azureadventureworks -f addkeys.sql
    

    По мере добавления внешних ключей вы увидите последовательность инструкций ALTER TABLE. Может появиться сообщение об ошибке, касающееся таблицы SpecialOfferProduct, которое пока можно пропустить. Это связано с ограничением UNIQUE, которое предается неправильно. В реальном мире потребуется получить сведения об этом ограничении из исходной базы данных с помощью следующего запроса:

    SELECT constraint_type, table_schema, table_name, constraint_name
    FROM information_schema.table_constraints
    WHERE constraint_type = 'UNIQUE';
    

    Затем можно будет вручную восстановить это ограничение в целевой базе данных в Базе данных Azure для PostgreSQL.

    Других ошибок быть не должно.

Изменение данных и прямая миграция на новую базу данных

  1. Вернитесь на страницу AdventureWorks_Migration_Activity на портале Azure.

  2. Выберите базу данных adventureworks.

  3. На странице adventureworks убедитесь, что для параметра Полная загрузка завершена указано значение 66 и все остальные значения равны 0.

  4. Вернитесь в Cloud Shell.

  5. Чтобы подключиться к базе данных adventureworks с PostgreSQL на виртуальной машине, выполните следующую команду:

    psql adventureworks
    
  6. Выполните следующие инструкции SQL, чтобы отобразить, а затем удалить заказы 43659, 43660 и 43661 из базы данных. Обратите внимание, что база данных применяет к таблице salesorderheader каскадное удаление, при котором автоматически удаляются соответствующие строки из таблицы salesorderdetail.

    SELECT * FROM sales.salesorderheader WHERE salesorderid IN (43659, 43660, 43661);
    SELECT * FROM sales.salesorderdetail WHERE salesorderid IN (43659, 43660, 43661);
    DELETE FROM sales.salesorderheader WHERE salesorderid IN (43659, 43660, 43661);
    
  7. Закройте служебную программу psql, выполнив команду \q.

  8. Вернитесь на страницу adventureworks на портале Azure и щелкните Обновить. Проверьте, что применены 32 изменения.

  9. Выберите Запустить прямую миграцию.

  10. На странице Завершение прямой миграции выберите Подтвердить, а затем — Применить. Подождите, пока состояние не изменится на Завершено.

  11. Вернитесь в Cloud Shell.

  12. Чтобы подключиться к базе данных azureadventureworks с помощью Базы данных Azure для PostgreSQL, выполните следующую команду:

    psql -h adventureworks[nnn].postgres.database.azure.com -U azureuser@adventureworks[nnn] -d azureadventureworks
    

    Укажите пароль Pa55w.rd.

  13. Чтобы отобразить заказы и сведения о заказах в базе данных, выполните следующие инструкции SQL. Выходите после первой страницы каждой таблицы. Эти запросы показывают, что данные были переданы:

    SELECT * FROM sales.salesorderheader;
    SELECT * FROM sales.salesorderdetail;
    
  14. Чтобы отобразить заказы 43659, 43660 и 43661 и сведения о них, выполните следующие инструкции SQL.

    SELECT * FROM sales.salesorderheader WHERE salesorderid IN (43659, 43660, 43661);
    SELECT * FROM sales.salesorderdetail WHERE salesorderid IN (43659, 43660, 43661);
    

    Оба запроса должны вернуть 0 строк.

  15. Закройте служебную программу psql, выполнив команду \q.

Очистка созданных ресурсов

Важно!

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

  1. В Cloud Shell выполните указанную ниже команду, чтобы удалить группу ресурсов.
az group delete --name migrate-postgresql