스냅샷 복제를 사용하여 SQL Server 2017에서 SQL Server용 Cloud SQL로 데이터 마이그레이션


이 가이드에서는 Compute Engine에서 실행되는 Microsoft SQL Server 2017 Enterprise에서 SQL Server용 Cloud SQL 2017 Enterprise로 데이터를 마이그레이션하는 방법을 보여줍니다. 이 가이드는 시스템 관리자, 개발자, 엔지니어, 데이터베이스 관리자, DevOps 엔지니어에게 유용합니다. 이 가이드에서는 SQL Server 배포자를 설정하고, SQL Server용 Cloud SQL 2017로 스냅샷 복제를 위해 SQL Server 에이전트를 사용하고, 데이터를 성공적으로 가져왔는지 검사하는 방법을 보여줍니다.

이 가이드에서는 스냅샷 복제를 사용하여 소스 및 대상을 동기화 상태로 유지합니다. 스냅샷 복제는 각 자료의 전체 복사본 즉, 게시된 데이터베이스 객체를 구독자에게 전송합니다. Cloud SQL은 또한 증분 데이터만 전송하는 트랜잭션 복제를 지원합니다. 트랜잭션 복제의 한 가지 제한은 테이블에 기본 키가 있어야 한다는 것입니다. SQL Server 복제 유형에 대한 자세한 내용은 SQL Server 문서를 참조하세요.

간단한 설명을 위해 이 가이드에서는 소스 SQL Server를 사용하여 배포자를 호스팅합니다. 프로덕션 시나리오에서 데이터가 Google Cloud 외부에서 복제되는 경우 Compute Engine 인스턴스의 Google Cloud 측면에서 배포를 호스팅하는 것이 좋을 수 있습니다.

이 가이드에서는 사용자가 다음 항목에 익숙하다고 가정합니다.

목표

  • Compute Engine에서 샘플 데이터베이스를 호스팅하기 위한 SQL Server 가상 머신(VM) 인스턴스를 만듭니다.
  • 샘플 데이터베이스를 채웁니다.
  • SQL Server용 Cloud SQL 인스턴스를 만듭니다.
  • 배포자를 만듭니다.
  • 게시물 및 구독을 설정합니다.
  • SQL Server에서 Cloud SQL로의 복제를 시작합니다.
  • 가져온 데이터를 검증합니다.

비용

이 문서에서는 비용이 청구될 수 있는 다음과 같은 Google Cloud 구성요소를 사용합니다.

프로젝트 사용량을 기준으로 예상 비용을 산출하려면 가격 계산기를 사용하세요. Google Cloud를 처음 사용하는 사용자는 무료 체험판을 사용할 수 있습니다.

시작하기 전에

  1. Google Cloud 계정에 로그인합니다. Google Cloud를 처음 사용하는 경우 계정을 만들고 Google 제품의 실제 성능을 평가해 보세요. 신규 고객에게는 워크로드를 실행, 테스트, 배포하는 데 사용할 수 있는 $300의 무료 크레딧이 제공됩니다.
  2. In the Google Cloud console, on the project selector page, select or create a Google Cloud project.

    Go to project selector

  3. Google Cloud 프로젝트에 결제가 사용 설정되어 있는지 확인합니다.

  4. API Cloud SQL Admin and Compute Engine API 사용 설정

    API 사용 설정

  5. In the Google Cloud console, on the project selector page, select or create a Google Cloud project.

    Go to project selector

  6. Google Cloud 프로젝트에 결제가 사용 설정되어 있는지 확인합니다.

  7. API Cloud SQL Admin and Compute Engine API 사용 설정

    API 사용 설정

  8. Google Cloud 콘솔에서 Cloud Shell을 활성화합니다.

    Cloud Shell 활성화

    Google Cloud 콘솔 하단에서 Cloud Shell 세션이 시작되고 명령줄 프롬프트가 표시됩니다. Cloud Shell은 Google Cloud CLI가 사전 설치된 셸 환경으로, 현재 프로젝트의 값이 이미 설정되어 있습니다. 세션이 초기화되는 데 몇 초 정도 걸릴 수 있습니다.

  9. 선택한 원격 데스크톱 프로토콜(RDP) 클라이언트를 설치합니다. 자세한 내용은 Microsoft 원격 데스크톱 클라이언트를 참조하세요. 이미 RDP 클라이언트가 설치되어 있으면 이 태스크를 건너뛰어도 됩니다.

이 문서에 설명된 태스크를 완료했으면 만든 리소스를 삭제하여 청구가 계속되는 것을 방지할 수 있습니다. 자세한 내용은 삭제를 참조하세요.

SQL Server VM 만들기

첫 번째 단계는 Compute Engine의 Windows 2016 VM에 SQL Server 2017 인스턴스를 만들고 RDP를 사용하여 연결하는 것입니다.

  1. Cloud Shell에서 Windows Server 2016에 SQL Server 2017 Standard 인스턴스를 만듭니다. 하위 계층에 데이터베이스 게시자 기능이 포함되지 않기 때문에 소스 데이터베이스가 SQL Server Standard 또는 Enterprise 데이터베이스여야 합니다.

    gcloud compute instances create sqlserver --machine-type=n1-standard-4 \
        --boot-disk-size=100GB \
        --image-project=windows-sql-cloud \
        --image-family=sql-std-2017-win-2016 \
        --zone=us-central1-f  \
        --scopes=https://www.googleapis.com/auth/cloud-platform
    

    이 가이드에서는 us-central1-f 영역에 부팅 디스크 크기가 100GB인 인스턴스를 만듭니다. 자세한 내용은 클라우드 위치를 참조하세요.

  2. Windows 비밀번호를 생성합니다.

    gcloud compute reset-windows-password sqlserver --zone=us-central1-f
    
  3. Google Cloud Console에서 VM 인스턴스 페이지로 이동합니다.

    VM 인스턴스로 이동

  4. Google Cloud 콘솔의 Compute Engine 섹션에서 RDP 드롭다운을 클릭하고 RDP 파일 다운로드 옵션을 선택하여 인스턴스용 RDP 파일을 다운로드합니다.

    이 파일을 사용하여 RDP 클라이언트를 사용하는 인스턴스에 연결합니다. 자세한 내용은 Microsoft 원격 데스크톱 클라이언트를 참조하세요.

  5. 사용자 이름비밀번호 필드에 SQL Server VM 인스턴스에 대해 만든 사용자 이름과 비밀번호를 입력합니다. 도메인 필드는 비워두고 확인을 클릭하여 SQL Server VM에 연결합니다.

    사용자 이름과 비밀번호를 입력하는 대화상자의 스크린샷입니다.

    메시지가 표시되면 인증서를 수락합니다.

  6. 조건에 동의하면 계속을 클릭합니다.

  7. 인스턴스의 모든 창을 최소화하고 Windows 작업 표시줄에서 시작을 클릭하고 PowerShell을 입력한 다음 Windows PowerShell 앱을 마우스 오른쪽 버튼으로 클릭하고 관리자 권한으로 실행을 선택합니다.

  8. PowerShell 프롬프트에서 데이터베이스 스토리지에 대한 디렉터리 구조를 만듭니다.

    mkdir c:\sql-server-data\adventureworks
    

샘플 데이터베이스 만들기 및 채우기

이제 Microsoft의 AdventureWorks 데이터베이스 백업 파일을 다운로드하고 이를 SQL Server 인스턴스로 복원합니다. 이 데이터베이스는 마이그레이션하려는 프로덕션 데이터베이스를 시뮬레이션합니다.

  1. PowerShell 명령줄에서 AdventureWorksLT2017.bak 백업 파일을 C 드라이브로 다운로드합니다.

    bitsadmin /transfer sampledb /dynamic /download /priority FOREGROUND "https://github.com/Microsoft/sql-server-samples/releases/download/adventureworks/AdventureWorksLT2017.bak " C:\sql-server-data\AdventureWorksLT2017.bak
    
  2. 데이터베이스를 복원합니다.

    osql -E -Q "USE [master]
    RESTORE DATABASE [AdventureWorksLT2017]
    FROM  DISK = N'C:\sql-server-data\AdventureWorksLT2017.bak' WITH  FILE = 1,
    MOVE N'AdventureWorksLT2012_Data' TO N'C:\sql-server-data\adventureworks\AdventureWorksLT2012.mdf',
    MOVE N'AdventureWorksLT2012_Log' TO N'C:\sql-server-data\adventureworks\AdventureWorksLT2012_log.ldf',
    NOUNLOAD,  STATS = 5"
    
  3. Customer 테이블의 행 수를 쿼리하여 새로 복원된 데이터베이스를 검사합니다. 출력은 847행입니다.

    osql -E -Q "select count(*) from AdventureWorksLT2017.SalesLT.Customer"
    

Cloud SQL 인스턴스 준비

  1. Cloud Shell에서 SQL Server 2017 Enterprise 인스턴스용 Cloud SQL을 만듭니다.

    gcloud sql instances create target-sqlserver  \
        --database-version=SQLSERVER_2017_STANDARD \
        --cpu=4 \
        --memory=15 \
        --storage-size=100 \
        --root-password=sqlserver12@ \
        --zone=us-central1-f
    

    루트 사용자는 sqlserver12@ 비밀번호를 사용하는 sqlserver입니다. 또한 SQL Server IP 주소를 기록해 둡니다.

  2. 환경 변수에 소스 SQL Server VM의 IP 주소를 저장합니다.

    sql_source_ip=$(gcloud compute instances describe sqlserver \
        --zone=us-central1-f | grep natIP | awk '{print $2}')
    echo $sql_source_ip
    
  3. Cloud SQL 인스턴스가 있는 SQL Server VM IP 주소를 허용 목록에 추가합니다.

    gcloud sql instances patch target-sqlserver --authorized-networks=$sql_source_ip
    
  4. 대상 데이터베이스를 만듭니다.

    gcloud sql databases create AdventureWorksTarget --instance=target-sqlserver
    
  5. 관리자로 시작한 PowerShell 명령줄에서 SQL Server용 Cloud SQL에 대한 연결을 확인합니다.

    $cloud_sql_server_ip=gcloud sql instances describe target-sqlserver --format='value(ipAddresses.ipAddress)'
    osql -S $cloud_sql_server_ip -U sqlserver -P sqlserver12@ -Q "select 'test'"
    

    이 명령어는 'test'를 출력합니다.

VM에서 Cloud SQL로 복제 시작

SQL Server 스냅샷 복제를 사용하여 데이터베이스 스냅샷을 Cloud SQL로 복제하는 작업을 만듭니다.

배포자 설정

이제 SQL Server VM이 SQL Server 배포자가 되도록 구성합니다. 실제로 배포자는 별도의 머신에서 실행할 수 있지만 이 가이드에서는 동일한 VM에서 실행합니다.

  1. 관리자로 시작한 PowerShell 명령줄에서 VM 호스트 이름이 일치하도록 SQL Server 로컬 인스턴스 이름을 업데이트합니다.

    $servername=hostname
    osql -E -Q "sp_dropserver 'INST-INSTALL-SQ';"
    osql -E -Q "sp_addserver '$servername', local;"
    Restart-Service -F MSSQLServer
    mkdir c:\sql-server-data\repldata
    

    Cannot open MSSQLServer service on computer '.'. 오류가 발생하면 PowerShell 명령줄을 관리자로 실행하지 않았을 수 있습니다.

  2. 이제 인스턴스 이름이 "sqlserver"인지 확인합니다.

    osql -E -Q "select @@servername;"
    
  3. 배포 데이터베이스를 지정합니다.

    $servername=hostname
    osql -E -Q "use master; exec sp_adddistributor @distributor = N'$servername', @password = N'';"
    osql -E -Q "exec sp_adddistributiondb @database = N'distribution', @data_folder = N'C:\Program Files\Microsoft SQL Server\MSSQL14.MSSQLSERVER\MSSQL\Data', @log_folder = N'C:\Program Files\Microsoft SQL Server\MSSQL14.MSSQLSERVER\MSSQL\Data', @log_file_size = 2, @min_distretention = 0, @max_distretention = 72, @history_retention = 48, @deletebatchsize_xact = 5000, @deletebatchsize_cmd = 2000, @security_mode = 1"
    
  4. 배포 데이터베이스를 구성합니다.

    osql -E -Q "
    use [distribution]
    if (not exists (select * from sysobjects where name = 'UIProperties' and type = 'U '))
        create table UIProperties(id int)
    if (exists (select * from ::fn_listextendedproperty('SnapshotFolder', 'user', 'dbo', 'table', 'UIProperties', null, null)))
        exec sp_updateextendedproperty N'SnapshotFolder', N'c:\sql-server-data\repldata', 'user', dbo, 'table', 'UIProperties'
    else
        exec sp_addextendedproperty N'SnapshotFolder', N'c:\sql-server-data\repldata', 'user', dbo, 'table', 'UIProperties'
    "
    
  5. 배포자가 있는 SQL Server VM 이름을 게시자로 등록합니다.

    osql -E -Q "exec sp_adddistpublisher @publisher = N'$servername',
    @distribution_db = N'distribution', @security_mode = 1, @working_directory
    = N'c:\sql-server-data\repldata', @trusted = N'false', @thirdparty_flag =
    0, @publisher_type = N'MSSQLSERVER'"
    

게시 설정

이제 배포가 설정되었으므로 게시할 테이블을 구성합니다.

  1. PowerShell 명령줄에서 SQL Server 에이전트를 사용 설정하고 시작합니다.

    Set-Service -Name SQLServerAgent -StartupType Automatic
    Start-Service -Name SQLServerAgent
    
  2. AdventureWorksLT2017 데이터베이스에 대한 게시를 만듭니다.

    $servername=hostname
    osql -E -Q "
    use [AdventureWorksLT2017]
    exec sp_replicationdboption @dbname = N'AdventureWorksLT2017', @optname = N'publish', @value = N'true'"
    
    osql -E -Q "use [AdventureWorksLT2017]
    exec sp_addpublication @publication = N'advn-pub3', @description = N'Snapshot publication of database ''AdventureWorksLT2017'' from Publisher ''$servername''.', @sync_method = N'native', @retention = 0, @allow_push = N'true', @allow_pull = N'true', @allow_anonymous = N'true', @enabled_for_internet = N'false', @snapshot_in_defaultfolder = N'true', @compress_snapshot = N'false', @ftp_port = 21, @ftp_login = N'anonymous', @allow_subscription_copy = N'false', @add_to_active_directory = N'false', @repl_freq = N'snapshot', @status = N'active', @independent_agent = N'true', @immediate_sync = N'true', @allow_sync_tran = N'false', @autogen_sync_procs = N'false', @allow_queued_tran = N'false', @allow_dts = N'false', @replicate_ddl = 1"
    
  3. 소스 스냅샷을 1시간 마다 Cloud SQL로 전송하도록 게시를 구성합니다.

    osql -E -Q "
    use [AdventureWorksLT2017]
    exec sp_addpublication_snapshot @publication = N'advn-pub3', @frequency_type = 4, @frequency_interval = 1, @frequency_relative_interval = 1, @frequency_recurrence_factor = 0, @frequency_subday = 8, @frequency_subday_interval = 1, @active_start_time_of_day = 0, @active_end_time_of_day = 235959, @active_start_date = 0, @active_end_date = 0, @job_login = null, @job_password = null, @publisher_security_mode = 1"
    
  4. 게시에 자료(테이블)를 추가합니다. AdventureWorksLT2017 데이터베이스에 여러 테이블이 포함되지만 간단한 설명을 위해 이 가이드에서는 Address, Customer, CustomerAddress의 3개 테이블을 복제합니다.

    osql -E -Q "
    use [AdventureWorksLT2017]
    exec sp_addarticle @publication = N'advn-pub3', @article = N'Address', @source_owner = N'SalesLT', @source_object = N'Address', @type = N'logbased', @description = null, @creation_script = null, @pre_creation_cmd = N'drop', @schema_option = 0x000000000803509D, @identityrangemanagementoption = N'manual', @destination_table = N'Address', @destination_owner = N'SalesLT', @vertical_partition = N'false'
    "
    
    osql -E -Q "
    use [AdventureWorksLT2017]
    exec sp_addarticle @publication = N'advn-pub3', @article = N'Customer', @source_owner = N'SalesLT', @source_object = N'Customer', @type = N'logbased', @description = null, @creation_script = null, @pre_creation_cmd = N'drop', @schema_option = 0x000000000803509D, @identityrangemanagementoption = N'manual', @destination_table = N'Customer', @destination_owner = N'SalesLT', @vertical_partition = N'false'
    "
    
    osql -E -Q "
    use [AdventureWorksLT2017]
    exec sp_addarticle @publication = N'advn-pub3', @article = N'CustomerAddress', @source_owner = N'SalesLT', @source_object = N'CustomerAddress', @type = N'logbased', @description = null, @creation_script = null, @pre_creation_cmd = N'drop', @schema_option = 0x000000000803509D, @identityrangemanagementoption = N'manual', @destination_table = N'CustomerAddress', @destination_owner = N'SalesLT', @vertical_partition = N'false'
    "
    
  5. 자료의 스냅샷을 수동으로 만듭니다. 이렇게 하지 않으면 스케줄러가 초기 스냅샷을 만들기 전에 최대 1시간까지 걸릴 수 있습니다.

    osql -E -Q "use [AdventureWorksLT2017]
    exec sp_startpublication_snapshot @publication = N'advn-pub3'"
    

구독 설정

이제 게시된 데이터를 Cloud SQL로 전송하는 구독을 만듭니다.

  1. PowerShell 명령줄에서 게시 스냅샷을 Cloud SQL로 전송하는 구독을 만듭니다.

    $cloud_sql_server_ip=gcloud sql instances describe target-sqlserver --format='value(ipAddresses.ipAddress)'
    $cloud_sql_user="sqlserver"
    $cloud_sql_password="sqlserver12@"
    $target_db_name="AdventureWorksTarget"
    osql -E -Q " use [AdventureWorksLT2017] exec sp_addsubscription @publication = N'advn-pub3', @subscriber = N'$cloud_sql_server_ip', @destination_db = N'$target_db_name', @subscription_type = N'Push', @sync_type = N'automatic', @article = N'all', @update_mode = N'read only', @subscriber_type = 0
    
    exec sp_addpushsubscription_agent @publication = N'advn-pub3', @subscriber = N'$cloud_sql_server_ip', @subscriber_db = N'$target_db_name', @job_login = null, @job_password = null, @subscriber_security_mode = 0, @subscriber_login = N'$cloud_sql_user', @subscriber_password = N'$cloud_sql_password', @frequency_type = 64, @frequency_interval = 0, @frequency_relative_interval = 0, @frequency_recurrence_factor = 0, @frequency_subday = 0, @frequency_subday_interval = 0, @active_start_time_of_day = 0, @active_end_time_of_day = 235959, @active_start_date = 20200408, @active_end_date = 99991231, @enabled_for_syncmgr = N'False', @dts_package_location = N'Distributor' "
    
  1. 데이터를 Cloud SQL 인스턴스에서 사용할 수 있는지 검사합니다.

    osql -S $cloud_sql_server_ip -U $cloud_sql_user -P $cloud_sql_password -Q "select count(*) from [AdventureWorksTarget].[SalesLT].[CustomerAddress] UNION
    select count(*) from [AdventureWorksTarget].[SalesLT].[Customer]
    UNION
    Select count(*) from [AdventureWorksTarget].[SalesLT].[Address]"
    

    이 명령어는 417, 450, 847을 출력합니다.

정리

튜토리얼을 완료한 후에는 만든 리소스를 삭제하여 할당량 사용을 중지하고 요금이 청구되지 않도록 할 수 있습니다. 다음 섹션은 이러한 리소스를 삭제하거나 사용 중지하는 방법을 설명합니다.

프로젝트 삭제

  1. Google Cloud 콘솔에서 리소스 관리 페이지로 이동합니다.

    리소스 관리로 이동

  2. 프로젝트 목록에서 삭제할 프로젝트를 선택하고 삭제를 클릭합니다.
  3. 대화상자에서 프로젝트 ID를 입력한 후 종료를 클릭하여 프로젝트를 삭제합니다.

다음 단계