スナップショット レプリケーションを使用した SQL Server 2017 から Cloud SQL for SQL Server へのデータの移行


このチュートリアルでは、Compute Engine で稼働している Microsoft SQL Server 2017 Enterprise からデータを Cloud SQL for SQL Server 2017 Enterprise に移行する方法について説明します。このチュートリアルは、システム管理者、デベロッパー、エンジニア、データベース管理者、または DevOps エンジニアの方を対象としています。SQL Server ディストリビュータの設定方法を示し、SQL Server エージェントを使用して Cloud SQL for SQL Server 2017 にスナップショットを複製し、データが正常にインポートされたことを確認します。

このチュートリアルでは、スナップショット レプリケーションを使用して、ソースとターゲットの同期を維持します。スナップショット レプリケーションは、各記事(つまり、公開されたデータベース オブジェクト)の完全なコピーをサブスクライバーに送信します。Cloud SQL は、トランザクション レプリケーションもサポートしており、これによって増分データのみが送信されます。トランザクション レプリケーションの制限として、テーブルに主キーが必要になります。SQL Server のレプリケーション タイプの詳細については、SQL Server のドキュメントをご覧ください。

わかりやすくするために、このチュートリアルでは、ソース SQL Server を使用してディストリビュータをホストしています。本番環境シナリオでは、データが Google Cloud の外部からレプリケーションされている場合は、Compute Engine インスタンスの Google Cloud 側でディストリビューションをホストすることをおすすめします。

このチュートリアルは、読者が次の内容を理解していることを前提としています。

目標

  • Compute Engine でサンプル データベースをホストする SQL Server 仮想マシン(VM)インスタンスを作成します。
  • サンプル データベースにデータを入力します。
  • Cloud SQL for SQL Server インスタンスを作成します。
  • ディストリビュータを作成します。
  • パブリケーションとサブスクリプションを設定します。
  • SQL Server から Cloud SQL へのレプリケーションを開始します。
  • インポートされたデータを検証します。

料金

このドキュメントでは、Google Cloud の次の課金対象のコンポーネントを使用します。

料金計算ツールを使うと、予想使用量に基づいて費用の見積もりを生成できます。 新しい Google Cloud ユーザーは無料トライアルをご利用いただける場合があります。

始める前に

  1. Google Cloud アカウントにログインします。Google Cloud を初めて使用する場合は、アカウントを作成して、実際のシナリオでの Google プロダクトのパフォーマンスを評価してください。新規のお客様には、ワークロードの実行、テスト、デプロイができる無料クレジット $300 分を差し上げます。
  2. Google Cloud Console の [プロジェクト セレクタ] ページで、Google Cloud プロジェクトを選択または作成します。

    プロジェクト セレクタに移動

  3. Google Cloud プロジェクトで課金が有効になっていることを確認します

  4. Cloud SQL Admin and Compute Engine API API を有効にします。

    API を有効にする

  5. Google Cloud Console の [プロジェクト セレクタ] ページで、Google Cloud プロジェクトを選択または作成します。

    プロジェクト セレクタに移動

  6. Google Cloud プロジェクトで課金が有効になっていることを確認します

  7. Cloud SQL Admin and Compute Engine API 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 ゾーンにブートディスク サイズが 100 GB のインスタンスを作成します。詳細については、クラウドのロケーションをご覧ください。

  2. Windows パスワードを生成します。

    gcloud compute reset-windows-password sqlserver --zone=us-central1-f
    
  3. Google Cloud コンソールで [VM インスタンス] ページに移動します。

    [VM インスタンス] に移動

  4. Google Cloud コンソールの [Compute Engine] セクションで、[RDP] プルダウンをクリックして、[RDP ファイルをダウンロード] オプションを選択し、インスタンスの RDP ファイルをダウンロードします。

    このファイルを RDP クライアントで使用することで、インスタンスに接続できます。詳細については、Microsoft リモート デスクトップ クライアントをご覧ください。

  5. [ユーザー名] フィールドと [パスワード] フィールドに、SQL Server VM インスタンス用に作成したユーザー名とパスワードを入力します。[ドメイン] フィールドは空白のままにして、[OK] をクリックして 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 で、Cloud SQL for SQL Server 2017 Enterprise インスタンスを作成します。

    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
    

    root ユーザーは sqlserver で、パスワードは sqlserver12@ です。また、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 コマンドラインで、Cloud SQL for SQL Server への接続を確認します。

    $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 ディストリビュータとして SQL Server VM を構成します。実際には、ディストリビュータは別のマシンで実行できますが、このチュートリアルでは同じ VM で実行します。

  1. 管理者として起動した PowerShell コマンドラインから、SQL Server のローカル インスタンス名を VM ホスト名と一致するように更新します。

    $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 Agent を有効にして起動します。

    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 時間ごとに 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 データベースには多くのテーブルが含まれていますが、このチュートリアルではわかりやすくするために、AddressCustomerCustomerAddress の 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]"
    

    このコマンドから 417450847 と出力されます。

クリーンアップ

チュートリアルが終了したら、作成したリソースをクリーンアップして、割り当ての使用を停止し、課金されないようにできます。次のセクションで、リソースを削除または無効にする方法を説明します。

プロジェクトの削除

  1. Google Cloud コンソールで、[リソースの管理] ページに移動します。

    [リソースの管理] に移動

  2. プロジェクト リストで、削除するプロジェクトを選択し、[削除] をクリックします。
  3. ダイアログでプロジェクト ID を入力し、[シャットダウン] をクリックしてプロジェクトを削除します。

次のステップ