연습: 온-프레미스 PostgreSQL 데이터베이스를 Azure Database for PostgreSQL로 마이그레이션

완료됨

이 연습에서는 PostgreSQL 데이터베이스를 Azure로 마이그레이션합니다. 가상 머신에서 실행되는 기존 PostgreSQL 데이터베이스를 Azure Database for PostgreSQL로 마이그레이션합니다.

AdventureWorks 조직의 데이터베이스 개발자로 근무하고 있다고 가정해 보겠습니다. AdventureWorks는 10년 넘게 자전거 및 자전거 부품을 최종 소비자 및 배포자에게 직접 판매했습니다. 이 조직의 시스템은 현재 Azure VM에서 PostgreSQL을 사용하여 실행되는 데이터베이스에 정보를 저장합니다. 하드웨어 합리화 연습의 일부로 AdventureWorks는 데이터베이스를 Azure 관리형 데이터베이스로 이동하려고 합니다. 이 마이그레이션을 수행하라는 요청을 받았습니다.

중요

Azure Data Migration Service는 체험용 Azure 샌드박스 환경에서 지원되지 않습니다. 자신의 개인 구독에서 이러한 단계를 수행할 수도 있고 단순히 다음 내용을 보고 데이터베이스 마이그레이션 방법을 알아볼 수도 있습니다.

환경 설정

Cloud Shell에서 다음 Azure CLI 명령을 실행하여 AdventureWorks 데이터베이스 복사본으로 PostgreSQL을 실행하는 가상 머신을 생성합니다. 마지막 명령은 새 가상 머신의 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 Database for PostgreSQL 유연한 서버 만들기

  1. 웹 브라우저를 사용하여 새 탭을 열고 Azure Portal로 이동합니다.

  2. 검색 창에 Azure Database for PostgreSQL 유연한 서버를 입력합니다.

  3. Azure Database for PostgreSQL 유연한 서버 페이지에서 + 만들기를 선택합니다.

  4. 유연한 서버 페이지에서 다음 세부 정보를 입력한 다음 검토 + 생성을 선택합니다.

    속성
    Resource group migrate-postgresql
    서버 이름 adventureworksnnn, 여기서 nnn은 서버 이름을 고유하게 생성 위해 선택한 접미사
    위치 가장 가까운 위치를 선택합니다.
    PostgreSQL 버전 13
    컴퓨팅 + 스토리지 서버 구성을 선택하고 기본 가격 책정 계층을 선택한 다음, 확인을 선택합니다.
    관리자 사용자 이름 awadmin
    암호 Pa55w.rdDemo
    암호 확인 Pa55w.rdDemo
  5. 리뷰 + 생성 페이지에서 생성를 선택합니다. 서비스가 만들어질 때까지 기다린 다음, 계속합니다.

  6. 서비스가 만들어지면 리소스로 이동을 선택합니다.

  7. 연결 보안을 선택합니다.

  8. 연결 보안 페이지에서 Azure 서비스에 대한 액세스 허용로 설정합니다.

  9. 방화벽 규칙 목록에서 VM이라는 규칙을 추가하고 시작 IP 주소종료 IP 주소를 앞서 생성된 PostgreSQL 서버를 실행하는 가상 머신의 IP 주소로 설정합니다.

  10. 현재 클라이언트 IP 주소 추가를 선택하여 클라이언트 머신도 데이터베이스에 연결할 수 있도록 합니다.

  11. 저장하고 방화벽 규칙이 업데이트될 때까지 기다립니다.

  12. Cloud Shell 프롬프트에서 다음 명령을 실행하여 Azure Database for PostgreSQL 서비스에서 새 데이터베이스를 생성합니다. [nnn]을 Azure Database for 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"
    }
    

대상 데이터베이스에서 사용할 스키마 내보내기

이제 Cloud Shell을 사용하는 기존 PostgreSQL VM에 연결하여 데이터베이스 스키마를 내보내겠습니다.

  1. 다음 Azure CLI 명령을 실행하여 기존 VM의 IP 주소를 확인합니다.

    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. 다음 명령을 실행하여 가상 머신의 데이터베이스에 연결합니다. 가상 머신에서 실행 중인 PostgreSQL 서버의 azureuser 사용자 암호는 Pa55w.rd입니다.

    psql adventureworks
    
  4. 다음과 같이 azureuser에 대한 복제 권한을 부여합니다.

    ALTER ROLE azureuser REPLICATION;
    
  5. \q 명령을 사용하여 psql 유틸리티를 닫습니다.

  6. bash 프롬프트에서 다음 명령을 실행하여 adventureworks 데이터베이스의 스키마를 adventureworks_schema.sql이라는 파일로 내보내기

    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. \q 명령을 사용하여 psql 유틸리티를 닫습니다.

  4. adventureworks 데이터베이스의 스키마를 Azure Database for PostgreSQL 서비스에서 실행 중인 azureadventureworks 데이터베이스로 가져옵니다. 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 스크립트는 azureadventureworks 데이터베이스의 테이블에서 모든 외래 키를 제거할 dropkeys.sql이라는 또 다른 SQL 스크립트를 생성합니다. 이제 dropkeys.sql 스크립트를 실행합니다.

    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 스크립트는 모든 외래 키를 만들 addkeys.sql이라는 또 다른 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. \q 명령을 사용하여 psql 유틸리티를 닫습니다.

Database Migration Service를 사용하여 온라인 마이그레이션 수행

  1. Azure Portal로 다시 전환합니다.

  2. 모든 서비스를 선택하고 구독을 선택한 다음 사용자의 구독을 선택합니다.

  3. 구독 페이지의 설정에서 리소스 공급자를 선택합니다.

  4. 이름으로 필터링 상자에 DataMigration을 입력한 다음, Microsoft.DataMigration을 선택합니다.

  5. Microsoft.DataMigration이 등록되어 있지 않은 경우 등록을 선택하고 상태등록됨으로 변경될 때까지 기다립니다. 상태 변경을 보려면 새로 고침을 선택해야 할 수도 있습니다.

  6. 리소스 생성를 선택하고 Marketplace 검색 상자에 Azure Database Migration Service를 입력한 다음 Enter 키를 누릅니다.

  7. Azure Database Migration Service 페이지에서 생성를 선택합니다.

  8. 마이그레이션 서비스 생성 페이지에서 다음 세부 정보를 입력한 후 다음: 네트워킹 >>을 선택합니다.

    속성
    리소스 그룹 선택 migrate-postgresql
    서비스 이름 adventureworks_migration_service
    위치 가장 가까운 위치를 선택합니다.
    서비스 모드 Azure
    가격 책정 계층 프리미엄, vCore 4개
  9. 네트워킹 페이지에서 postgresqlvnet/posgresqlvmSubnet 가상 네트워크를 선택합니다. 이 네트워크는 설정의 일부로 만들었습니다.

  10. 검토 + 생성를 선택한 다음, 생성를 선택합니다. Database Migration Service를 만드는 동안 기다립니다. 이 작업은 몇 분 정도 걸립니다.

  11. 서비스가 만들어지면 리소스로 이동을 선택합니다.

  12. 새 마이그레이션 프로젝트를 선택합니다.

  13. 새 마이그레이션 프로젝트 페이지에서 다음 세부 정보를 입력한 다음, 작업 생성 및 실행을 선택합니다.

    속성
    프로젝트 이름 adventureworks_migration_project
    원본 서버 유형 PostgreSQL
    PostgreSQL의 대상 데이터베이스 Azure Database for PostgreSQL
    활동 유형 선택 온라인 데이터 마이그레이션
  14. 마이그레이션 마법사가 시작되면 원본 선택 페이지에서 다음 세부 정보를 입력하고 다음: 대상 선택>>을 선택합니다.

    속성
    원본 서버 이름 nn.nn.nn.nn (PostgreSQL을 실행하는 Azure 가상 머신의 IP 주소)
    서버 포트 5432
    데이터베이스 adventureworks
    사용자 이름 azureuser
    암호 Pa55w.rd
    서버 인증서 신뢰 Selected
    연결 암호화 Selected
  15. 대상 선택 페이지에서 다음 세부 정보를 입력한 다음 다음: 데이터베이스 선택 >>을 선택합니다.

    속성
    Azure PostgreSQL adventureworks[nnn]
    데이터베이스 azureadventureworks
    사용자 이름 azureuser@adventureworks[nnn]
    암호 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 Database for PostgreSQL의 대상 데이터베이스에서 이 제약 조건을 수동으로 복구할 수 있습니다.

    다른 오류가 없어야 합니다.

데이터 수정 및 새 데이터베이스로 단독 마이그레이션

  1. Azure Portal의 AdventureWorks_Migration_Activity 페이지로 돌아갑니다.

  2. adventureworks 데이터베이스를 선택합니다.

  3. adventureworks 페이지에서 전체 로드 완료 값이 66이고 다른 모든 값이 0인지 확인합니다.

  4. Cloud Shell로 다시 전환합니다.

  5. 다음 명령을 실행하여 가상 머신에서 PostgreSQL을 사용하여 실행 중인 adventureworks 데이터베이스에 연결합니다.

    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. \q 명령을 사용하여 psql 유틸리티를 닫습니다.

  8. Azure Portal의 adventureworks 페이지로 돌아가서 새로 고침을 선택합니다. 32개의 변경 내용이 적용되었는지 확인합니다.

  9. 전환 시작을 선택합니다.

  10. 전환 완료 페이지에서 확인을 선택한 후 적용을 선택합니다. 상태가 완료로 변경될 때까지 기다립니다.

  11. Cloud Shell로 돌아갑니다.

  12. 다음 명령을 실행하여 Azure Database for PostgreSQL 서비스를 통해 실행 중인 azureadventureworks 데이터베이스에 연결합니다.

    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. 다음 SQL 문을 실행하여 명령 및 43659, 43660, 43661 명령에 대한 세부 정보를 표시합니다.

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

    두 쿼리 모두 0개의 행을 반환합니다.

  15. \q 명령을 사용하여 psql 유틸리티를 닫습니다.

생성된 리소스 정리

중요

자신의 개인 구독에서 이러한 단계를 수행한 경우 리소스를 개별적으로 삭제할 수도 있고 리소스 그룹을 삭제하여 전체 리소스 세트를 삭제할 수도 있습니다. 계속 실행되는 리소스에는 요금이 부과될 수 있습니다.

  1. Cloud Shell에서 다음 명령을 실행하여 리소스 그룹을 삭제합니다.
az group delete --name migrate-postgresql