연습: 온-프레미스 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 유연한 서버 만들기
웹 브라우저를 사용하여 새 탭을 열고 Azure Portal로 이동합니다.
검색 창에 Azure Database for PostgreSQL 유연한 서버 입력합니다.
Azure Database for PostgreSQL 플렉시블 서버 페이지에서 + 생성을 선택합니다.
유연한 서버 페이지에서 다음 세부 정보를 입력한 다음 검토 + 만들기를 선택합니다.
재산 가치 리소스 그룹 migrate-postgresql 서버 이름 adventureworksnnn, 여기서 nnn 은 서버 이름을 고유하게 만들기 위해 선택한 접미사입니다. 위치 가장 가까운 위치를 선택합니다. PostgreSQL 버전 13 컴퓨팅 + 스토리지 서버 구성을 선택하고 기본 가격 책정 계층을 선택한 다음 확인을 선택합니다. 관리자 사용자 이름 awadmin 암호 Pa55w.rdDemo 암호 확인 Pa55w.rdDemo 검토 + 만들기 페이지에서 만들기를 선택합니다. 서비스가 만들어질 때까지 기다린 다음, 계속합니다.
서비스가 만들어지면 리소스로 이동을 선택합니다.
연결 보안을 선택합니다.
연결 보안 페이지에서Azure 서비스에 대한 액세스 허용을예로 설정합니다.
방화벽 규칙 목록에서 VM이라는 규칙을 추가하고 START IP 주소 및 끝 IP 주소를 이전에 만든 PostgreSQL 서버를 실행하는 가상 머신의 IP 주소로 설정합니다.
클라이언트 컴퓨터가 데이터베이스에 연결할 수 있도록 하려면 현재 클라이언트 IP 주소 추가를 선택합니다.
저장하고 방화벽 규칙이 업데이트될 때까지 기다리십시오.
Cloud Shell 프롬프트에서 다음 명령을 실행하여 Azure Database for PostgreSQL 서비스에 새 데이터베이스를 만듭니다. [nnn]을 Azure Database for PostgreSQL 서비스를 만들 때 사용한 접미사로 바꿉니다. [리소스 그룹]을 서비스에 대해 지정한 리소스 그룹의 이름으로 바꿉니다.
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에 연결하여 데이터베이스 스키마를 내보냅니다.
다음 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
SSH를 사용하여 이전 데이터베이스 서버에 연결합니다. 암호 에 Pa55w.rdDemo 를 입력합니다.
ssh azureuser@$SQLIP
다음 명령을 실행하여 가상 머신의 데이터베이스에 연결합니다. 가상 머신에서 실행되는 PostgreSQL 서버의 azureuser 사용자 암호는 Pa55w.rd입니다.
psql adventureworks
azureuser에 복제 권한을 부여합니다.
ALTER ROLE azureuser REPLICATION;
\q 명령을 사용하여 psql 유틸리티를 닫습니다.
bash 프롬프트에서 다음 명령을 실행하여 adventureworks 데이터베이스의 스키마를 adventureworks_schema.sql 파일로 내보냅니다.
pg_dump -o -d adventureworks -s > adventureworks_schema.sql
대상 데이터베이스로 스키마 가져오기
다음 명령을 실행하여 azureadventureworks[nnn] 서버에 연결합니다. [nnn]의 두 인스턴스를 서비스의 접미사로 바꿉니다. 사용자 이름에는 @adventureworks[nnn] 접미사가 있습니다. 암호 프롬프트에서 Pa55w.rdDemo를 입력합니다.
psql -h adventureworks[nnn].postgres.database.azure.com -U awadmin@adventureworks[nnn] -d postgres
다음 명령을 실행하여 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;
\q 명령을 사용하여 psql 유틸리티를 닫습니다.
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
각 항목이 만들어질 때 일련의 메시지가 표시됩니다. 스크립트는 오류 없이 완료되어야 합니다.
다음 명령을 실행합니다. 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
다음 명령을 실행합니다. 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
dropkeys.sql 스크립트를 실행합니다.
psql -h adventureworks[nnn].postgres.database.azure.com -U azureuser@adventureworks[nnn] -d azureadventureworks -f dropkeys.sql
외세의 키가 삭제되면 일련의 ALTER TABLE 메시지가 표시됩니다.
psql 유틸리티를 다시 통계하고 azureadventureworks 데이터베이스에 연결합니다.
psql -h adventureworks[nnn].postgres.database.azure.com -U azureuser@adventureworks[nnn] -d azureadventureworks
다음 쿼리를 실행하여 나머지 외신 키의 세부 정보를 찾습니다.
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];
나머지 외신 키를 제거한 후 다음 SQL 문을 실행하여 데이터베이스에 트리거를 표시합니다.
SELECT trigger_name FROM information_schema.triggers;
또한 이 쿼리는 데이터베이스에 트리거가 없음을 나타내는 빈 결과 집합을 반환해야 합니다. 데이터베이스에 트리거가 포함된 경우 데이터를 마이그레이션하기 전에 트리거를 사용하지 않도록 설정하고 나중에 다시 사용하도록 설정해야 합니다.
\q 명령을 사용하여 psql 유틸리티를 닫습니다.
Database Migration Service를 사용하여 온라인 마이그레이션 수행
Azure Portal로 다시 전환합니다.
모든 서비스를 선택하고 구독을 선택한 다음 구독을 선택합니다.
구독 페이지의 설정에서 리소스 공급자를 선택합니다.
이름별 필터 상자에 DataMigration을 입력한 다음, Microsoft.DataMigration을 선택합니다.
Microsoft.DataMigration이 등록되지 않은 경우 등록을 선택하고 상태가등록됨으로 변경될 때까지 기다립니다. 상태 변경을 보려면 새로 고침 을 선택해야 할 수 있습니다.
리소스 만들기를 선택하고 Marketplace 검색 상자에서 Azure Database Migration Service를 입력한 다음 Enter 키를 누릅니다.
Azure Database Migration Service 페이지에서 만들기를 선택합니다.
마이그레이션 서비스 만들기 페이지에서 다음 세부 정보를 입력한 다음, 다음: 네트워킹을>> 선택합니다.
재산 가치 리소스 그룹 선택 migrate-postgresql 서비스 이름 adventureworks_migration_service 위치 가장 가까운 위치를 선택합니다. 서비스 모드 Azure 가격 책정 계층 프리미엄, vCore 4개 네트워킹 페이지에서 postgresqlvnet/posgresqlvmSubnet 가상 네트워크를 선택합니다. 이 네트워크는 설정의 일부로 만들었습니다.
검토 + 만들기를 선택한 다음 만들기를 선택합니다. Database Migration Service를 만드는 동안 기다립니다. 이 작업은 몇 분 정도 걸립니다.
서비스가 만들어지면 리소스로 이동을 선택합니다.
새 마이그레이션 프로젝트를 선택합니다.
새 마이그레이션 프로젝트 페이지에서 다음 세부 정보를 입력한 다음 만들기 및 실행 작업을 선택합니다.
재산 가치 프로젝트 이름 adventureworks_migration_project 원본 서버 유형 PostgreSQL PostgreSQL용 대상 데이터베이스 Azure Database for PostgreSQL 활동 유형 선택 온라인 데이터 마이그레이션 마이그레이션 마법사가 시작되면 원본 선택 페이지에서 다음 세부 정보를 입력한 다음 다음을 선택합니다. 대상>>을 선택합니다.
재산 가치 원본 서버 이름 nn.nn.nn.nn (PostgreSQL을 실행하는 Azure 가상 머신의 IP 주소) 서버 포트 5432 데이터베이스 adventureworks 사용자 이름 azureuser 암호 Pa55w.rd 서버 인증서 신뢰 선택됨 연결 암호화 선택됨 대상 선택 페이지에서 다음 세부 정보를 입력한 다음, 다음을 선택합니다. 데이터베이스를>> 선택합니다.
재산 가치 Azure PostgreSQL adventureworks[nnn] 데이터베이스 azureadventureworks 사용자 이름 azureuser@adventureworks[nnn] 암호 Pa55w.rd 데이터베이스 선택 페이지에서 adventureworks 데이터베이스를 선택하고 azureadventureworks에 매핑합니다. postgres 데이터베이스의 선택을 취소합니다. 다음 선택: 테이블을>> 선택합니다.
테이블 선택 페이지에서 다음: 마이그레이션 설정>> 구성을 선택합니다.
마이그레이션 설정 구성 페이지에서 adventureworks 드롭다운을 확장하고, 고급 온라인 마이그레이션 설정 드롭다운을 확장하고, 병렬로 로드할 최대 인스턴스 수가 5로 설정되어 있는지 확인한 다음, 다음: 요약>>을 선택합니다.
요약 페이지의 작업 이름 상자에 AdventureWorks_Migration_Activity 입력한 다음 마이그레이션 시작을 선택합니다.
AdventureWorks_Migration_Activity 페이지에서 15초 간격으로 새로 고침을 선택합니다. 마이그레이션 작업이 진행됨에 따라 상태가 표시됩니다. 마이그레이션 세부 정보 열이 전환 준비로 변경될 때까지 기다립니다.
Cloud Shell로 다시 전환합니다.
다음 명령을 실행하여 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의 대상 데이터베이스에서 이 제약 조건을 수동으로 복원할 수 있습니다.
다른 오류는 없어야 합니다.
데이터 수정 및 새 데이터베이스로 잘라내기
Azure Portal의 AdventureWorks_Migration_Activity 페이지로 돌아갑니다.
adventureworks 데이터베이스를 선택합니다.
adventureworks 페이지에서 전체 로드 완료 값이 66이고 다른 모든 값이 0인지 확인합니다.
Cloud Shell로 다시 전환합니다.
다음 명령을 실행하여 가상 머신에서 PostgreSQL을 사용하여 실행되는 adventureworks 데이터베이스에 연결합니다.
psql adventureworks
다음 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);
\q 명령을 사용하여 psql 유틸리티를 닫습니다.
Azure Portal의 adventureworks 페이지로 돌아가 서 새로 고침을 선택합니다. 32개 변경 내용이 적용되었는지 확인합니다.
잘라내기 시작을 선택합니다.
완전 전환 페이지에서 확인을 선택한 다음 적용을 선택합니다. 상태가 완료됨으로 변경될 때까지 기다립니다.
Cloud Shell로 돌아갑니다.
다음 명령을 실행하여 Azure Database for PostgreSQL 서비스를 사용하여 실행되는 azureadventureworks 데이터베이스에 연결합니다.
psql -h adventureworks[nnn].postgres.database.azure.com -U azureuser@adventureworks[nnn] -d azureadventureworks
암호는 Pa55w.rd .
다음 SQL 문을 실행하여 데이터베이스의 주문 및 주문 세부 정보를 표시합니다. 각 테이블의 첫 번째 페이지 후에 종료합니다. 이러한 쿼리는 데이터가 전송되었음을 보여 주기 위한 것입니다.
SELECT * FROM sales.salesorderheader; SELECT * FROM sales.salesorderdetail;
다음 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개의 행을 반환해야 합니다.
\q 명령을 사용하여 psql 유틸리티를 닫습니다.
생성된 리소스 정리
중요합니다
자신의 개인 구독에서 이러한 단계를 수행한 경우 리소스를 개별적으로 삭제할 수도 있고 리소스 그룹을 삭제하여 전체 리소스 세트를 삭제할 수도 있습니다. 리소스를 실행 상태로 남겨두면 비용이 발생할 수 있습니다.
- Cloud Shell에서 다음 명령을 실행하여 리소스 그룹을 삭제합니다.
az group delete --name migrate-postgresql