このチュートリアルでは、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 側でディストリビューションをホストすることをおすすめします。
このチュートリアルは、読者が次の内容を理解していることを前提としています。
- SQL Server
- Microsoft PowerShell
- Compute Engine
- Cloud SQL for SQL Server
目標
- Compute Engine でサンプル データベースをホストする SQL Server 仮想マシン(VM)インスタンスを作成します。
- サンプル データベースにデータを入力します。
- Cloud SQL for SQL Server インスタンスを作成します。
- ディストリビュータを作成します。
- パブリケーションとサブスクリプションを設定します。
- SQL Server から Cloud SQL へのレプリケーションを開始します。
- インポートされたデータを検証します。
費用
このドキュメントでは、Google Cloud の次の課金対象のコンポーネントを使用します。
- Compute Engine
- Cloud SQL
- Cloud Storage
- SQL Server (premium with Compute Engine)
料金計算ツールを使うと、予想使用量に基づいて費用の見積もりを生成できます。
始める前に
- Sign in to your Google Cloud account. If you're new to Google Cloud, create an account to evaluate how our products perform in real-world scenarios. New customers also get $300 in free credits to run, test, and deploy workloads.
-
In the Google Cloud console, on the project selector page, select or create a Google Cloud project.
-
Make sure that billing is enabled for your Google Cloud project.
-
Enable the Cloud SQL Admin and Compute Engine API APIs.
-
In the Google Cloud console, on the project selector page, select or create a Google Cloud project.
-
Make sure that billing is enabled for your Google Cloud project.
-
Enable the Cloud SQL Admin and Compute Engine API APIs.
-
In the Google Cloud console, activate Cloud Shell.
At the bottom of the Google Cloud console, a Cloud Shell session starts and displays a command-line prompt. Cloud Shell is a shell environment with the Google Cloud CLI already installed and with values already set for your current project. It can take a few seconds for the session to initialize.
- 任意のリモート デスクトップ プロトコル(RDP)クライアントをインストールします。詳細については、Microsoft リモート デスクトップ クライアントをご覧ください。RDP クライアントがすでにインストールされている場合は、このタスクをスキップできます。
このドキュメントに記載されているタスクの完了後、作成したリソースを削除すると、それ以上の請求は発生しません。詳細については、クリーンアップをご覧ください。
SQL Server VM の作成
最初のステップでは、Compute Engine 上の Windows 2016 VM に SQL Server 2017 インスタンスを作成し、RDP を使用して接続します。
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 のインスタンスを作成します。詳細については、クラウドのロケーションをご覧ください。Windows パスワードを生成します。
gcloud compute reset-windows-password sqlserver --zone=us-central1-f
Google Cloud コンソールで [VM インスタンス] ページに移動します。
Google Cloud コンソールの [Compute Engine] セクションで、[RDP] プルダウンをクリックして、[RDP ファイルをダウンロード] オプションを選択し、インスタンスの RDP ファイルをダウンロードします。
このファイルを RDP クライアントで使用することで、インスタンスに接続できます。詳細については、Microsoft リモート デスクトップ クライアントをご覧ください。
[ユーザー名] フィールドと [パスワード] フィールドに、SQL Server VM インスタンス用に作成したユーザー名とパスワードを入力します。[ドメイン] フィールドは空白のままにして、[OK] をクリックして SQL Server VM に接続します。
プロンプトが表示されたら、証明書を受け入れます。
利用規約に同意する場合は、[続行] をクリックします。
インスタンスで、すべてのウィンドウを最小化し、Windows タスクバーのスタートをクリックします。「
PowerShell
」と入力してから、Windows PowerShell アプリを右クリックし、[管理者として実行] を選択します。PowerShell プロンプトで、データベース ストレージのディレクトリ構造を作成します。
mkdir c:\sql-server-data\adventureworks
サンプル データベースの作成とデータ入力
Microsoft の AdventureWorks データベースのバックアップ ファイルをダウンロードして、SQL Server インスタンスに復元します。このデータベースは、移行する本番環境データベースをシミュレートします。
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
データベースを復元します。
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"
Customer
テーブルの行数をクエリして、新しく復元されたデータベースを検証します。出力は 847 行です。osql -E -Q "select count(*) from AdventureWorksLT2017.SalesLT.Customer"
Cloud SQL インスタンスの準備
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 アドレスをメモします。ソース 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
Cloud SQL インスタンスを含む SQL Server VM の IP アドレスを許可リスト(ホワイトリスト)に追加します。
gcloud sql instances patch target-sqlserver --authorized-networks=$sql_source_ip
移行先データベースを作成します。
gcloud sql databases create AdventureWorksTarget --instance=target-sqlserver
管理者として起動した 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 で実行します。
管理者として起動した 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 コマンドラインを実行していない可能性があります。インスタンス名が
"sqlserver"
になったことを確認します。osql -E -Q "select @@servername;"
ディストリビューション データベースを指定します。
$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"
ディストリビューション データベースを構成します。
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' "
パブリッシャーとして 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'"
公開を設定する
ディストリビューションを設定したら、公開するテーブルを構成します。
PowerShell コマンドラインから、SQL Server Agent を有効にして起動します。
Set-Service -Name SQLServerAgent -StartupType Automatic Start-Service -Name SQLServerAgent
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"
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"
パブリケーションに記事(テーブル)を追加します。
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' "
記事のスナップショットを手動で作成します。そうしないと、スケジューラが最初のスナップショットを作成するまでに最長で 1 時間かかることがあります。
osql -E -Q "use [AdventureWorksLT2017] exec sp_startpublication_snapshot @publication = N'advn-pub3'"
サブスクリプションを設定する
次に、公開されたデータを Cloud SQL に送信するサブスクリプションを作成します。
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' "
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
と出力されます。
クリーンアップ
チュートリアルが終了したら、作成したリソースをクリーンアップして、割り当ての使用を停止し、課金されないようにできます。次のセクションで、リソースを削除または無効にする方法を説明します。
プロジェクトの削除
- In the Google Cloud console, go to the Manage resources page.
- In the project list, select the project that you want to delete, and then click Delete.
- In the dialog, type the project ID, and then click Shut down to delete the project.
次のステップ
- バックアップ ファイルを使用して、SQL Server 2017 から Cloud SQL for SQL Server にデータを移行する方法を学習する。
- バックアップ ファイルを使用して、SQL Server 2008 から Cloud SQL for SQL Server にデータを移行する方法を学習する。
- Google Cloud に関するリファレンス アーキテクチャ、図、ベスト プラクティスを確認する。Cloud アーキテクチャ センターをご覧ください。