온-프레미스 PostgreSQL 데이터베이스를 Azure로 마이그레이션

완료됨

회사에서 Azure Database for PostgreSQL로 이동하기로 결정했다면 다음 단계는 온-프레미스 데이터베이스 마이그레이션 방법을 계획하고 데이터를 이동할 도구를 선택하는 것입니다.

Azure Database for PostgreSQL이 Azure의 PostgreSQL을 지원하고 스케일링하는 방법을 살펴보았으므로 이제 기존 온-프레미스 데이터베이스를 마이그레이션할 방법을 고려하는 것이 좋습니다.

이 단원에서는 Azure Portal을 사용하여 Azure Database for PostgreSQL 서비스의 인스턴스를 만드는 방법을 알아봅니다. 이 서비스의 여러 인스턴스를 만들어야 하는 경우 Azure CLI를 사용하여 프로세스를 스크립팅할 수 있습니다.

Azure Database for PostgreSQL 유연한 서버 만들기

Azure Portal에서 검색 상자에 Azure Database for PostgreSQL 유연한 서버를 입력하고 Azure Database for PostgreSQL 유연한 서버를 선택합니다.

Azure Portal의 Azure Database for PostgreSQL 유연한 서버 항목을 보여 주는 스크린샷

유연한 서버 기본 블레이드에서 만들기를 선택하고 서비스에 대한 세부 정보를 입력합니다. 세부 정보에는 다음이 포함됩니다.

  • 리소스 그룹. 서버의 리소스 그룹.

  • 서버 이름. 소문자, 숫자, 하이픈만 포함된 3자에서 63자 사이의 고유한 이름이어야 합니다.

  • 지역. 서버의 지역.

  • PostgreSQL 버전: 마이그레이션할 온-프레미스 데이터베이스에 해당하는 버전을 선택합니다.

  • 워크로드 유형. 워크로드에 따라 옵션을 선택합니다.

    • 컴퓨팅 + 스토리지. 서버 구성을 선택하여 가격 책정 계층을 설정하고 서비스에 필요한 리소스를 지정합니다. 이 옵션은 1단원에서 설명했습니다. 범용 또는 메모리 최적화 가격 책정 계층을 선택하는 경우 나중에 가상 프로세서 코어 수를 스케일 업 및 스케일 다운할 수 있습니다. 하지만 스토리지 크기는 줄일 수 없습니다. 서버를 생성된 후 늘릴 수만 있습니다.
  • 관리자 사용자 이름. 관리자 권한으로 만들 사용자 계정의 이름입니다. Azure는 자체 용도에 맞는 계정을 생성합니다. azure_superuser, azure_pg_admin, admin, administrator, root, guest, public이라는 이름 또는 pg_로 시작하는 모든 이름을 사용할 수 없습니다.

  • 암호. 8~128자여야 합니다. 대문자, 소문자, 숫자 및 영숫자가 아닌 문자를 혼합하여 포함해야 합니다.

Azure Portal의 Azure Database for PostgreSQL 유연한 서버에 대한 샘플 구성을 보여 주는 이미지

검토 + 생성를 클릭하여 서비스를 배포합니다. 배포하는 데는 시간이 몇 분 정도 걸립니다.

서비스를 배포한 후 1단원의 클라이언트 연결 항목에 설명된 대로 연결 보안 옵션을 선택하고 클라이언트에서 연결할 수 있도록 적절한 방화벽 규칙을 추가합니다. Azure 서비스에 대한 액세스 허용 옵션도 선택해야 합니다.

Azure CLI를 사용하여 Azure Database for PostgreSQL 인스턴스 생성

Azure Database for PostgreSQL 인스턴스는 az postgres flexible-server create 명령을 사용하여 만들 수 있습니다. 아래의 명령문은 유연한 서버 인스턴스를 만드는 예를 보여줍니다. 대부분의 매개 변수는 다음 경우를 제외하고는 설명 없이도 쉽게 이해할 수 있습니다.

  • sku-name. 이 매개 변수는 가격 책정 계층(기본의 경우 B, 범용의 경우 GP, 메모리 최적화의 경우 MO), 컴퓨팅 세대(Gen4 또는 Gen5), 가상 CPU 코어 수의 조합으로 구성됩니다. 아래 예에서는 Gen5 세대의 CPU 코어가 4개인 범용 가격 책정 계층을 사용하여 서버가 만들어집니다.
  • storage-size. 메가바이트 단위로 지정된, 필요한 디스크 스토리지 크기입니다. 다음 예에서는 10GB를 할당합니다.
    az postgres flexible-server create \
    --location northeurope --resource-group testGroup \
    --name testserver --admin-user username --admin-password password \
    --sku-name Standard_B1ms --tier Burstable --public-access 153.24.26.117 --storage-size 128 \
    --tags "key=value" --version 13 --high-availability Enabled --zone 1 \
    --standby-zone 3
    

온라인 마이그레이션 수행

Azure Database Migration Service를 사용하여 온-프레미스 PostgreSQL 설치에서 Azure Database for PostgreSQL로 온라인 마이그레이션을 수행할 수 있습니다.

이 온라인 시나리오에서는 Azure Database Migration Service에서 모든 기존 데이터를 Azure에 복사한 후 계속 원본 데이터베이스에서 동기화 작업을 수행합니다. 온-프레미스 시스템에 대해 수행되는 모든 새 트랜잭션은 Azure의 새 데이터베이스에 복사됩니다. Azure에서 새 데이터베이스를 사용하도록 클라이언트 애플리케이션을 다시 구성할 때까지 이 프로세스는 계속됩니다. 이때 동기화 작업이 종료됩니다.

원본 서버 구성 및 스키마 내보내기

온라인 마이그레이션을 수행하는 첫 번째 단계는 원본 서버에서 전체 미리 쓰기 로깅을 지원하도록 준비하는 것입니다. 원본 서버에서 postgresql.config 파일을 편집하고 다음 미리 쓰기 로깅 매개 변수를 구성합니다. 이 매개 변수를 변경하려면 서버를 다시 시작합니다. 이 작업은 시스템 정지가 예상되는 경우에만 수행합니다.

wal_level = logical
max_replication_slots = 5
max_wal_senders = 10

서버를 다시 시작한 후 pg_dump 유틸리티를 사용하여 원본 데이터베이스에 대한 스키마를 내보냅니다.

pg_dump -o -h [server host] -U [user name] -d [database name] -s > db_schema.sql

마지막으로 데이터베이스에서 사용하는 모든 확장 목록을 생성합니다. 대상 데이터베이스에서 이 확장을 사용하도록 설정해야 합니다. 그러려면 \dx plsql 명령을 사용하거나 다음 쿼리를 실행합니다.

SELECT *
FROM pg_extension;

대상 데이터베이스 생성 및 스키마 가져오기

다음 단계는 Azure Database for PostgreSQL 서비스에서 대상 데이터베이스를 만드는 것입니다. pgAdmin과 같은 익숙한 도구를 사용하여 서버에 연결하거나 다음 예제에서 Azure CLI를 사용할 수 있습니다.

az postgres db create \
  --name [database name] \
  --server-name [server name] \
  --resource-group [azure resource group]

대상 데이터베이스에서 원본 데이터베이스에 사용되는 모든 확장을 사용하도록 설정합니다.

대상 데이터베이스로 스키마를 가져오세요. db_schema.sql 파일이 있는 머신에서 다음 명령을 실행합니다.

psql -h [Azure Database for PostgreSQL host] -U [user name] -d [database name] -f db_schema.sql

대상 데이터베이스에서 모든 외래 키 참조를 제거합니다. 데이터가 특정 순서로 반드시 마이그레이션되는 것은 아니므로 마이그레이션 프로세스의 실패를 초래하는 참조 무결성 위반이 발생할 수 있으므로 이 단계가 필요합니다. 하지만 모든 외래 키는 나중에 다시 만들어야 하므로 기록해야 합니다. psql 유틸리티로 다음 SQL 문을 실행하여 데이터베이스에서 모든 외래 키를 찾은 다음, 해당 키를 제거하는 스크립트를 생성합니다.

SELECT Queries.tablename
       ,concat('alter table ', Queries.tablename, ' ', STRING_AGG(concat('DROP CONSTRAINT ', Queries.foreignkey), ',')) as DropQuery
            ,concat('alter table ', Queries.tablename, ' ',
                                            STRING_AGG(concat('ADD CONSTRAINT ', Queries.foreignkey, ' FOREIGN KEY (', column_name, ')', 'REFERENCES ', foreign_table_name, '(', foreign_column_name, ')' ), ',')) as AddQuery
    FROM
    (SELECT
    tc.table_schema,
    tc.constraint_name as foreignkey,
    tc.table_name as tableName,
    kcu.column_name,
    ccu.table_schema AS foreign_table_schema,
    ccu.table_name AS foreign_table_name,
    ccu.column_name AS foreign_column_name
FROM
    information_schema.table_constraints AS tc
    JOIN information_schema.key_column_usage AS kcu
      ON tc.constraint_name = kcu.constraint_name
      AND tc.table_schema = kcu.table_schema
    JOIN information_schema.constraint_column_usage AS ccu
      ON ccu.constraint_name = tc.constraint_name
      AND ccu.table_schema = tc.table_schema
WHERE constraint_type = 'FOREIGN KEY') Queries
  GROUP BY Queries.tablename;

대상 데이터베이스에서 모든 트리거를 사용하지 않도록 설정합니다. 이 작업을 수행하는 이유는 다음 두 가지입니다.

  • 데이터가 복사될 때 마이그레이션 프로세스를 최적화하는 데 도움이 됩니다.
  • 트리거는 종종 복잡한 형태의 참조 무결성을 구현하는 데 사용되며 앞서 설명한 이유로 인해 데이터가 전송되는 동안 이 유형의 무결성 검사가 실패할 수 있습니다. 다음 SQL 문을 사용하여 데이터베이스의 모든 트리거를 찾고 해당 트리거를 사용하지 않도록 설정하는 스크립트를 생성합니다.
    SELECT concat ('alter table ', event_object_table, ' disable trigger ', trigger_name)
    FROM information_schema.triggers;
    

참고 항목

psql의 \df+ 명령을 사용하여 트리거할 텍스트를 찾을 수 있습니다.

Azure Database Migration Service 인스턴스 생성

이제 Azure Portal에서 Azure Database Migration Service 인스턴스를 만들 수 있습니다.

Azure Database Migration Service 인스턴스를 생성 전에 구독을 통해 Microsoft.DataMigration 리소스 공급자를 등록해야 합니다. 다음과 같이 이 작업을 수행할 수 있습니다.

  1. Azure Portal의 왼쪽 메뉴 모음에서 모든 서비스를 선택합니다.
  2. 모든 서비스 페이지에서 구독을 선택합니다.
  3. 구독 페이지에서 구독을 선택합니다.
  4. 구독 페이지의 설정에서 리소스 공급자를 선택합니다.
  5. 이름으로 필터링 상자에 DataMigration을 입력한 다음, Microsoft.DataMigration을 선택합니다.
  6. 등록을 선택하고 상태등록됨으로 변경될 때까지 기다립니다. 상태가 변경되는 것을 확인하려면 새로 고침을 선택해야 할 수도 있습니다.
    리소스 공급자 페이지를 보여 주는 이미지. 이 사용자는 Microsoft.DataMigration 리소스 공급자를 등록하고 있습니다.

리소스 공급자가 등록된 경우 서비스를 만들 수 있습니다. 왼쪽 메뉴 모음에서 리소스 생성 명령을 선택하고 Azure Database Migration Service를 검색합니다.

Azure Database Migration Service를 만드는 경우의 초기 페이지를 보여 주는 이미지

마이그레이션 서비스 생성 페이지에서 서비스 인스턴스 이름을 입력하고 구독(리소스 공급자를 등록한 것과 동일한 구독), 리소스 그룹 및 위치를 지정합니다. 가상 네트워크도 제공해야 합니다. Database Migration Service는 이 가상 네트워크에 대해 만들어진 방화벽에 따라 필요한 보호를 제공하기 때문입니다. Azure 가상 머신에서 데이터베이스를 마이그레이션하는 경우 이러한 가상 머신에서 사용하는 것과 동일한 가상 네트워크에 Database Migration Service를 배치할 수도 있습니다. 가격 책정 계층에 따라 서비스에 사용할 수 있는 가상 프로세서 코어 수가 결정됩니다. 온라인 마이그레이션을 수행하려면 프리미엄 계층을 선택해야 합니다. 표준 계층은 오프라인 마이그레이션만 지원합니다.

Azure Database Migration Service 구성을 보여 주는 이미지. 이 사용자는 프리미엄 가격 책정 계층을 선택했습니다.

서비스가 배포될 때까지 기다린 다음, 계속합니다. 이 작업은 시간이 몇 분 정도 걸릴 수 있습니다.

Database Migration Service를 사용하여 마이그레이션 프로젝트 생성

이제 온라인 마이그레이션을 수행하는 데 Database Migration Service 인스턴스를 사용할 수 있습니다. 이렇게 하려면 새 데이터베이스 마이그레이션 프로젝트를 생성합니다. 마이그레이션 서비스 인스턴스 페이지로 이동하여 새 마이그레이션 프로젝트를 선택합니다.

새로 생성된 Azure Database Migration Service를 보여 주는 이미지.

새 마이그레이션 프로젝트 페이지에서 원본 서버 유형을 PostgreSQL로 설정하고 대상 서버 유형을 Azure Database for PostgreSQL로 설정한 후 온라인 데이터 마이그레이션을 선택합니다. 작업 유형 페이지에는 온라인 마이그레이션을 사용하기 위해 원본 서버에서 수행해야 하는 단계가 나열됩니다. 새 마이그레이션 프로젝트 페이지 맨 아래의 텍스트는 대상으로 스키마를 마이그레이션하는 프로세스를 설명합니다.

마이그레이션 프로젝트 속성 및 지침을 보여 주는 이미지.

이 단계를 완료했는지 확인한 후 작업 생성 및 실행을 선택합니다.

마이그레이션 작업 생성 및 실행

새 마이그레이션 프로젝트는 프로세스를 안내하는 마법사를 시작합니다. 다음 세부 정보를 제공하세요.

  • 원본 세부 정보 추가 페이지에서 원본 서버 주소, 원본 데이터베이스 및 이 데이터베이스에 연결하여 데이터를 검색할 수 있는 계정을 제공합니다. 이 계정에는 마이그레이션을 수행할 수 있는 SUPERUSER 권한이 있어야 합니다.
  • 대상 세부 정보 페이지에서 Azure Database for PostgreSQL 서비스 주소, 데이터를 마이그레이션하려는 데이터베이스, 관리 권한이 있는 계정의 세부 정보를 지정합니다.
  • 대상 데이터베이스에 매핑 페이지에서 원본 데이터베이스와 대상 데이터베이스를 선택합니다. 단일 데이터베이스나 여러 데이터베이스를 마이그레이션할 수 있습니다.
  • 마이그레이션 설정 페이지에서 병렬로 로드할 최대 테이블 수와 같은 구성할 추가 설정을 지정합니다.
  • 마이그레이션 요약 페이지에서 작업의 이름을 입력하고 마이그레이션 실행을 선택합니다.
    마이그레이션 요약 페이지를 보여 주는 이미지

마이그레이션 진행률과 발생한 모든 오류를 보여 주는 작업 상태 페이지가 표시됩니다. 마이그레이션이 실패하면 문제를 해결하고 작업을 다시 시도합니다. 온라인 마이그레이션을 수행하는 경우 기존 데이터가 전송되고 나면 상태가 전환 준비 완료로 변경됩니다. 하지만 애플리케이션이 원래 데이터베이스를 계속 활성 상태로 사용하고 있는 동안 나타나는 추가 변경 내용을 전송하도록 작업은 계속 실행됩니다.

마이그레이션 작업의 작업 상태 페이지를 보여 주는 이미지. 이 마이그레이션은 모든 현재 데이터를 전송했으며 새 데이터베이스로 전환할 준비가 완료되어 있습니다.

외래 키 및 트리거 복구

이제 데이터를 전송했으므로 애플리케이션에서 데이터 사용을 시작할 수 있습니다. 데이터를 마이그레이션하기 전에 제거한 외래 키를 다시 만들고 트리거를 복구해야 합니다. 일부 애플리케이션이 여전히 원래 데이터베이스에 연결된 경우 미리 쓰기 로깅을 통해 Azure의 대상 데이터베이스가 최신 상태로 유지되도록 합니다. 미리 쓰기 로깅은 외래 키 및 트리거에 의해 부정적인 영향을 받지 않습니다.

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

모든 애플리케이션이 새 데이터베이스로 전환되면 마이그레이션 프로세스를 완료하고 새 데이터베이스로 단독 마이그레이션합니다. 작업 상태 페이지에서 마이그레이션되는 데이터베이스의 이름을 선택하여 수행된 작업에 대한 요약을 확인합니다.

마이그레이션 작업에 대한 통계를 보여 주는 이미지.

전환 시작을 선택합니다. 작업이 완료되었는지 확인하는 페이지가 표시됩니다. 이때 원본 데이터베이스에 대한 미리 쓰기 로그의 나머지 항목은 모두 드레이닝되며 업데이트가 중지됩니다. 원본 데이터베이스에 대한 추가 변경 내용은 전파되지 않습니다.

단독형 마이그레이션 완료 페이지 이미지

오프라인 마이그레이션 수행

오프라인 마이그레이션은 특정 시점에 원본 데이터베이스의 “스냅샷”을 생성하고 대상 데이터베이스에 해당 데이터를 복사합니다. 스냅샷이 생성된 후 원본 데이터를 변경하면 대상 데이터베이스에 변경 내용이 반영되지 않습니다.

Azure Database for PostgreSQL 또는 Azure 가상 머신과 같은 다른 위치에서 실행되는 PostgreSQL 서버로 오프라인 마이그레이션을 수행하려는 경우 다음과 같이 두 가지 이상의 옵션이 있습니다.

  • pg_dump 유틸리티를 사용하여 원본 데이터베이스에서 스키마와 데이터를 내보내고 psql 유틸리티를 사용하여 스키마와 데이터를 대상 데이터베이스로 가져옵니다. 이 기법을 사용하면 스키마와 데이터를 대상 데이터베이스로 전송하기 전에 필요한 경우 수정, 서식 다시 지정 및 정리할 수 있습니다.
  • 다시 pg_dump를 사용하여 원본 데이터베이스에서 데이터를 덤프하고 pg_restore를 사용하여 데이터를 대상 데이터베이스로 복원합니다. 이 기법은 내보내기 및 가져오기를 사용하는 것보다 빠르지만 데이터가 쉽게 변경할 수 없는 형식으로 덤프됩니다. 스키마 또는 데이터를 조정할 필요가 없는 경우 이 접근 방식을 사용합니다.

참고

현재 Azure Database Migration Service를 사용하여 PostgreSQL 데이터베이스의 오프라인 마이그레이션을 수행할 수 없습니다.

내보내기 및 가져오기를 사용하여 마이그레이션

내보내기 및 가져오기 접근 방식을 사용하여 데이터베이스를 마이그레이션하려면 다음 단계를 수행합니다.

  1. bash 프롬프트에서 pg_dump 명령을 사용하여 스키마를 내보냅니다.

    pg_dump -o -h [source database server] -U [user name] -d [database] -s > db_schema.sql
    
  2. pg_dump 명령을 사용하여 데이터를 다른 파일로 내보냅니다.

    pg_dump -o -h [source database server] -U [user name] -d [database] -a > db_data.sql
    

    이때 db_schema.sql 및 db_data.sql은 텍스트 편집기를 사용하여 수정하는 SQL 스크립트입니다.

  3. Azure Database for PostgreSQL에 대상 데이터베이스를 생성합니다. 이 작업은 Azure CLI를 사용하여 수행합니다.

    az postgres db create \
        --name [database name] \
        --server-name [server name] \
        --resource-group [azure resource group]
    
  4. psql 명령을 사용하여 스키마를 대상 데이터베이스로 가져옵니다.

    psql -d [target database name] -h [server name in Azure Database for PostgreSQL] -U [user name] -f db_schema.sql
    
  5. psql 명령을 사용하여 데이터를 대상 데이터베이스로 가져옵니다.

    psql -d [target database name] -h [server name in Azure Database for PostgreSQL] -U [user name] -f db_data.sql
    

백업 및 복원을 사용하여 마이그레이션

이 단계에서는 백업 및 복원을 사용하여 데이터베이스를 마이그레이션하는 프로세스를 설명합니다.

  1. bash 프롬프트에서 데이터베이스를 백업하고 다음 명령을 실행합니다. 데이터베이스를 백업하는 데 필요한 권한이 있는 사용자 이름을 지정합니다.

    pg_dump [database name] -h [source database server] -U [user name] -Fc > database_backup.bak
    
  2. Azure Database for PostgreSQL에 대상 데이터베이스를 생성합니다.

    az postgres db create \
        --name [database name] \
        --server-name [server name] \
        --resource-group [azure resource group] \
    
  3. bash 프롬프트에서 pg_restore 명령을 사용하여 백업을 새 데이터베이스로 복원합니다. Azure Database for PostgreSQL 서비스에서 관리 권한이 있는 사용자의 이름을 지정합니다.

    pg_restore -d [target database name] -h [server name in Azure Database for PostgreSQL] -Fc -U [user name] database_backup.bak