このチュートリアルでは、Compute Engine で実行されている Microsoft SQL Server データベースのクローンを作成する 2 つの方法について説明します。1 つ目の方法では、永続ディスクのスナップショットを使用します。2 つ目の方法では、ネイティブの SQL Server バックアップと復元を使用し、Cloud Storage を使用してバックアップを転送します。Cloud Storage は Google Cloudのオブジェクト ストレージ サービスです。セキュリティと可用性が高く、耐久性があり、わかりやすいファイルの保存手段です。
クローンは、オンライン データベースを別のサーバーにコピーするプロセスです。データベースのコピーは、既存のデータベースから独立し、ポイントインタイム スナップショットとして保存されます。本番環境サーバーに負荷をかけることや、本番環境データの整合性を損なうことなく、作成したデータベースのクローンをさまざまな目的に使用できます。その目的には、次のようなものがあります。
- 分析クエリの実行。
- アプリの負荷テストや統合テスト。
- データ ウェアハウスに入力するデータの抽出。
- データに対するテストの実施。
このチュートリアルで説明するクローンの作成方法には、それぞれにメリットとデメリットがあります。目的に適した方法は状況によって異なります。次の表に、重要な検討事項をいくつか示します。
| 検討事項 | 方法 1: ディスクのスナップショット | 方法 2: Cloud Storage を使用したバックアップと復元 |
|---|---|---|
| SQL Server インスタンスに必要なディスク容量の追加 | 追加のディスク容量は不要 | バックアップ ファイルの作成時および復元時に追加容量が必要 |
| クローン作成時のソース SQL Server インスタンスへの追加の負荷あり | 追加の負荷なし | バックアップ ファイルの作成時とアップロード時に CPU と I/O への追加の負荷あり |
| クローン作成にかかる時間 | 大規模なデータベースの場合は比較的短い | 大規模なデータベースの場合は比較的長い |
| Google Cloudの外部にある SQL Server インスタンスからクローンを作成できるか | × | ○ |
| 複雑さ | クローン作成したディスクの接続に複雑なコマンド シーケンスあり | クローン作成用のコマンドセットは比較的簡単 |
| 既存のバックアップ システムを活用できるか | ○(バックアップ システムが Google Cloud ディスクのスナップショットを使用している場合) | ○(バックアップ システムがネイティブの SQL Server バックアップ ファイルを Cloud Storage に書き込む場合) |
| クローン作成の粒度 | ディスク全体のクローン作成のみ | 指定したデータベースのクローン作成のみ |
| データの整合性 | スナップショット時点での整合性 | バックアップ時点での整合性 |
このチュートリアルは、Microsoft Windows のシステム管理、PowerShell、Microsoft SQL Server Management Studio を使用した Microsoft SQL Server の管理に精通していることを前提としています。
目標
- Google Cloudで SQL Server インスタンスを実行する方法を学習します。
- セカンダリ ディスク上にデモ データベースを作成する方法を習得します。
- Compute Engine ディスク スナップショットを使用して SQL Server データベースのクローンを作成する方法を習得します。
- Cloud Storage を使用してバックアップを転送し、SQL Server データベースのクローンを作成する方法を習得します。
費用
このドキュメントでは、課金対象である次の Google Cloudコンポーネントを使用します。
- Compute Engine
- Cloud Storage
- Microsoft Windows and SQL server licenses
料金計算ツールを使うと、予想使用量に基づいて費用の見積もりを生成できます。
このドキュメントに記載されているタスクの完了後、作成したリソースを削除すると、それ以上の請求は発生しません。詳細については、クリーンアップをご覧ください。
始める前に
- 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.
Roles required to select or create a project
- Select a project: Selecting a project doesn't require a specific IAM role—you can select any project that you've been granted a role on.
-
Create a project: To create a project, you need the Project Creator
(
roles/resourcemanager.projectCreator), which contains theresourcemanager.projects.createpermission. Learn how to grant roles.
-
Verify that billing is enabled for your Google Cloud project.
-
In the Google Cloud console, on the project selector page, select or create a Google Cloud project.
Roles required to select or create a project
- Select a project: Selecting a project doesn't require a specific IAM role—you can select any project that you've been granted a role on.
-
Create a project: To create a project, you need the Project Creator
(
roles/resourcemanager.projectCreator), which contains theresourcemanager.projects.createpermission. Learn how to grant roles.
-
Verify that billing is enabled for your Google Cloud project.
- Compute Engine API を有効にします。 API を有効にする
- Google Chrome ブラウザを使用している。
- リモート デスクトップ プロトコル(RDP)クライアントをインストールします。詳細については、Microsoft リモート デスクトップ クライアントをご覧ください。RDP クライアントがすでにインストールされている場合は、このタスクをスキップできます。
次の追加要件を満たしていることを確認します。
環境の設定
このチュートリアルを最後まで進めるには、お使いのコンピューティング環境に次のものを設定する必要があります。
- 本番環境データベース サーバーを表す Compute Engine 上の SQL Server インスタンス(名前は
sql-server-prodとします)。 - 本番環境データベースの保存用として本番環境サーバーにアタッチする追加ディスク(名前は
sql-server-prod-dataとします)。 - クローンを作成する本番環境データベースをシミュレートするための Wide World Importers SQL Server サンプル データベースのコピー。
- テスト環境データベース サーバーを表す Compute Engine 上の SQL Server インスタンス(名前は
sql-server-testとします)。このサーバー上にデータベースのクローンを作成します。
次の図は、このアーキテクチャを表しています。
本番環境 VM インスタンスを作成する
本番環境をシミュレートするには、Windows Server 上で SQL Server を実行する Compute Engine VM インスタンスを設定します。
このチュートリアルの VM インスタンスは、OS とユーザー アカウント用に 50 GB ディスク、データベース ストレージ用に 100 GB ディスクの 2 つのディスクを使用します。
Compute Engine では、ディスクを分けることによるパフォーマンス上のメリットはありません。ディスクのパフォーマンスは、インスタンスにアタッチされているすべてのディスクの合計ストレージ容量と、VM インスタンスの vCPU の合計数によって決まります。したがって、データベースとログファイルは同じディスク上に存在できます。
コンソール
Google Cloud コンソールで、[VM インスタンス] ページに移動します。
[作成] をクリックします。
[名前] フィールドに「
sql-server-prod」と入力します。[リージョン] で [us-east1] を選択します。
[ゾーン] で us-east1-b を選択します。
[マシンの構成] で [マシンタイプ] を [n1-standard-2](2 vCPU)に変更します。
[ブートディスク] の説明の横にある [変更] をクリックします。
[ブートディスク] パネルで、[公開イメージ] タブをクリックします。
[オペレーティング システム] プルダウン リストで [Windows Server 上の SQL Server] を選択します。
[バージョン] プルダウン リストで [Windows Server 2022 Datacenter 上の SQL Server 2022 Standard] を選択します。
次の値が設定されていることを確認します。
- [ブートディスクの種類] が [標準永続ディスク] に設定されている。
- [サイズ(GB)] が [50] に設定されている。
[選択] をクリックします。
[ID と API へのアクセス] で [アクセス スコープ] を [すべての Cloud API に完全アクセス権を許可] に設定します。
[管理、セキュリティ、ディスク、ネットワーク、単一テナンシー] を開きます。
[ディスク] タブをクリックします。
[新しいディスクを追加] add をクリックします。
[名前] フィールドに「
sql-server-prod-data」と入力します。[サイズ(GB)] フィールドに「
100」と入力します。[完了] をクリックします。
[作成] をクリックします。
Cloud Shell
Cloud Shell を開きます。
次の変数を初期化します。
VPC_NAME=
VPC_NAMESUBNET_NAME=SUBNET_NAMEここで
VPC_NAME: VPC の名前SUBNET_NAME: サブネットの名前
デフォルトのプロジェクト ID を設定します。
gcloud config set project
PROJECT_IDPROJECT_IDは、 Google Cloud プロジェクトの ID に置き換えます。デフォルトのリージョンを設定します。
gcloud config set compute/region
REGIONREGIONは、デプロイするリージョンの ID に置き換えます。デフォルト ゾーンを設定します。
gcloud config set compute/zone
ZONEZONEは、デプロイするゾーンの ID に置き換えます。Windows Server 2022 Datacenter で SQL Server 2022 Standard のアプリイメージを使用して、Compute Engine インスタンスを作成します。
REGION=$(gcloud config get-value compute/region) ZONE=$(gcloud config get-value compute/zone) gcloud compute instances create sql-server-prod \ --machine-type=n1-standard-2 \ --scopes=cloud-platform \ --image-family=sql-std-2022-win-2022 \ --image-project=windows-sql-cloud \ --boot-disk-size=50GB \ --boot-disk-device-name=sql-server-prod \ --create-disk="mode=rw,size=100,type=pd-standard,name=sql-server-prod-data,device-name=sql-server-prod-data" \ --subnet=$SUBNET_NAMEこのコマンドは、インスタンスに Google Cloud API への完全アクセス権を付与します。さらに、100 GB のセカンダリ ディスクを作成して、インスタンスにアタッチします。このチュートリアルでは高いパフォーマンスを必要としないため、ディスク パフォーマンスの警告は無視してください。
VM インスタンスに接続する
Google Cloud コンソールで、[VM インスタンス] ページに移動します。
VM インスタンスの準備が完了するまで 5 分ほど待ちます。
VM の初期化プロセスをモニタリングするには、Cloud Shell でシリアルポート出力を表示します。
gcloud compute instances tail-serial-port-output sql-server-prod次のメッセージが表示されたら、初期化は完了です。
Instance setup finished. sql-server-prod is ready to use.
シリアルポートのモニタリングを停止するには、Ctrl + C を押します。
インスタンス名
sql-server-prodをクリックして [VM インスタンスの詳細] ページを開きます。[リモート アクセス] で [Windows パスワードを設定] をクリックし、[設定] をクリックしてリモートマシンにアカウントを作成します。
この手順ではパスワードが生成されます。パスワードをメモするか、安全な一時ファイルにコピーします。
Google Cloud コンソールの [Compute Engine] セクションで、[RDP] プルダウンをクリックし、[RDP ファイルをダウンロード] オプションを選択して、インスタンスの RDP ファイルをダウンロードします。
このファイルを RDP クライアントで使用することで、インスタンスに接続できます。詳細については、Microsoft リモート デスクトップ クライアントをご覧ください。
プロンプトが表示されたら、生成したパスワードを入力して [OK] をクリックします。
サーバー証明書を受け入れてリモート Windows インスタンスにログインするには、[続行] をクリックします。
使用中のパソコンをネットワーク上の他のパソコンやデバイスから検出可能にするかどうかを確認するメッセージが表示されたら、[いいえ] をクリックします。
追加ディスクを設定する
本番環境インスタンスにアタッチされている 2 番目のディスクは、本番環境データベースを保存するためのものです。このディスクは空のため、パーティション分割、フォーマット、マウントを行う必要があります。
sql-server-prodインスタンスに接続された RDP セッションで、Windows タスクバーの [スタート] ボタンをクリックします。「diskpart」と入力し、[diskpart] をクリックして DiskPart を開きます。- アプリに変更を許可するよう求められたら、[はい] をクリックします。
インスタンスにアタッチされているディスクのリストを表示します。
list disk次のような出力が表示されます。
Disk ### Status Size Free Dyn Gpt -------- ------------- ------- ------- --- --- Disk 0 Online 50 GB 0 B Disk 1 Online 100 GB 100 GB
ディスク 1(100 GB)はデータディスクです。
データディスクを選択します。
select disk 1ディスクを初期化します。
cleanGUID パーティション テーブルを作成します。
convert gptディスク全体を使用してデータ パーティションを作成します。
create partition primary使用可能なボリュームを一覧表示します。
list volume次のような出力が表示されます。
Volume ### Ltr Label Fs Type Size Status Info ---------- --- ----------- ----- ---------- ------- --------- -------- Volume 0 C NTFS Partition 49 GB Healthy Boot Volume 1 FAT32 Partition 100 MB Healthy System Volume 2 RAW Partition 99 GB Healthy
ボリューム 2(99 GB)はデータディスクです。
ボリュームを選択します。
select volume 2パーティションを NTFS ファイル システムでフォーマットし、
dataというラベルを付けます。format quick fs=ntfs label=dataディスクをドライブ D としてマウントします。
assign letter=dDiskPart を終了します。
exit
サンプル データベースをダウンロードする
このクローン作成の演習用に環境を設定するには、次の手順を実行する必要があります。
- ドライブ D(
data)にディレクトリ構造を作成して、データベースを保存する。 - Wide World Importers SQL Server サンプル データベースのフル バックアップ ファイルをダウンロードする。このデータベースは、クローンを作成する本番環境データベースをシミュレートします。
ディレクトリを作成してバックアップ ファイルをダウンロードする方法は、次のとおりです。
RDP セッションで、Windows タスクバーの [スタート] ボタンをクリックし、「
PowerShell」と入力してから Windows PowerShell アプリを選択します。PowerShell プロンプトで、データベース ストレージのディレクトリ構造を作成します。
mkdir D:\sql-server-data\wideworldimportersバックアップ ファイルをドライブ D にダウンロードします。
bitsadmin /transfer sampledb /dynamic /download /priority FOREGROUND ` https://github.com/Microsoft/sql-server-samples/releases/download/wide-world-importers-v1.0/WideWorldImporters-Full.bak ` D:\sql-server-data\WideWorldImporters-Full.bak
サンプル データベースを復元する
Microsoft SQL Server Management Studio(SSMS)ウィザードを使用してインタラクティブに、または Transact-SQL コマンドを実行して直接的に、サンプル データベースをドライブ D(data)に復元する必要があります。
SSMS ウィザード
- RDP セッションで、Windows タスクバーの [スタート] ボタンをクリックし、「
ssms」と入力して [Microsoft SQL Server Management Studio(管理者として実行)] を選択します。 - アプリが起動したら、[接続] をクリックし、Windows 認証を使用して
sql-server-prodデータベース エンジンに接続します。 - オブジェクト エクスプローラーで [データベース] を右クリックし、[データベースの復元] を選択します。
- [ソース] で [デバイス] を選択し、デバイス名の横にある [...] ボタンをクリックします。
- [バックアップ デバイスの選択] ダイアログで、[バックアップ メディアの種類] に [ファイル] が選択されていることを確認し、[追加] をクリックします。
- ファイル セレクタで、
D:\sql-server-dataを参照し、WideWorldImporters-Full.bakファイルをクリックして、[OK] をクリックします。 [OK] をクリックして [バックアップ デバイスの選択] ダイアログを閉じます。
[データベースの復元] ダイアログに、Wide World Importers のデータベース バックアップに関するデータが入力されました。
[ページの選択] で [ファイル] をクリックします。
[すべてのファイルをフォルダーに移動する] チェックボックスをオンにします。
[データ ファイル フォルダー] フィールドと [ログ ファイルのフォルダー] フィールドのどちらにも「
D:\sql-server-data\wideworldimporters」と入力します。![[データベースの復元] ダイアログのスクリーンショット。](https://cloud.google.com/static/architecture/images/cloning-a-microsoft-sql-server-database-on-compute-engine-restore-database.png?hl=ja)
[OK] をクリックして復元オペレーションを開始します。
数分後に、データベースが復元されたことが通知されます。
Transact-SQL
- RDP セッションで、Windows タスクバーの [スタート] ボタンをクリックし、「
ssms」と入力して [Microsoft SQL Server Management Studio(管理者として実行)] を選択します。 - アプリが起動したら、[接続] をクリックし、Windows 認証を使用して
sql-server-prodデータベース エンジンに接続します。 - [ファイル] > [新規作成] > [クエリを現在の接続で実行] を選択して新しいクエリ ウィンドウを開きます。
ダウンロードしたバックアップ ファイルから復元を開始します。
USE [master] GO RESTORE DATABASE [WideWorldImporters] FROM DISK = N'D:\SQL-SERVER-DATA\WideWorldImporters-Full.bak' WITH FILE = 1, MOVE N'WWI_Primary' TO N'D:\SQL-SERVER-DATA\WideWorldImporters\WideWorldImporters.mdf', MOVE N'WWI_UserData' TO N'D:\SQL-SERVER-DATA\WideWorldImporters\WideWorldImporters_UserData.ndf', MOVE N'WWI_Log' TO N'D:\SQL-SERVER-DATA\WideWorldImporters\WideWorldImporters.ldf', MOVE N'WWI_InMemory_Data_1' TO N'D:\SQL-SERVER-DATA\WideWorldImporters\WideWorldImporters_InMemory_Data_1', NOUNLOAD, STATS = 5 GOこのコマンドは、データベースとログファイルを
D:\sql-server-data\wideworldimportersディレクトリに復元します。クエリコードを右クリックし、[実行] をクリックします。
データベースの復元が完了するまで数分かかります。オブジェクト エクスプローラーで [更新] refresh をクリックすると、データベースがデータベース ツリーに表示されているかどうかを確認できます。データベースの復元が完了したら、保存せずにクエリ ウィンドウを閉じることができます。
サンプル データベースが機能していることを確認するには、クエリを実行します。
Microsoft SQL Server Management Studio で、[ファイル] > [新規作成] > [クエリを現在の接続で実行] を選択して、新しいクエリ ウィンドウを開いてから次のコードをコピーします。
SELECT top(100) i.InvoiceDate, i.InvoiceID, i.CustomerID, c.CustomerName, i.ConfirmedDeliveryTime, i.ConfirmedReceivedBy FROM WideWorldImporters.Sales.Invoices i JOIN WideWorldImporters.Sales.Customers c ON i.CustomerID=c.CustomerID WHERE i.ConfirmedDeliveryTime IS NOT NULL ORDER BY i.InvoiceDate desc;このクエリは、最近配信された 100 件の請求書から概要情報を取得します。
クエリ ウィンドウを右クリックし、[実行] をクリックします。
[結果] ペインに概要情報が表示されます。

テスト VM インスタンスを作成する
このセクションでは、作成したデータベースのクローンの宛先として、sql-server-test という名前の SQL Server インスタンスを作成します。このインスタンスの構成は、本番環境インスタンスと同じです。ただし、2 番目のデータディスクは作成しません。代わりに、このチュートリアルの後半でデータディスクをアタッチします。
コンソール
[VM インスタンス] ページに移動します。
[作成] をクリックします。
[名前] フィールドに「
sql-server-test」と入力します。[リージョン] で [us-east1] を選択します。
[ゾーン] で us-east1-b を選択します。
[マシンの構成] で [マシンタイプ] を [n1-standard-2](2 vCPU)に変更します。
[ブートディスク] イメージの横にある [変更] をクリックします。
[ブートディスク] パネルで、[公開イメージ] タブをクリックします。
[オペレーティング システム] プルダウン リストで [Windows Server 上の SQL Server] を選択します。
[バージョン] プルダウン リストで [Windows Server 2022 Datacenter 上の SQL Server 2022 Standard] を選択します。
次の値が設定されていることを確認します。
- [ブートディスクの種類] が [標準永続ディスク] に設定されている。
- [サイズ(GB)] が [50] に設定されている。
[選択] をクリックします。
[ID と API へのアクセス] で [アクセス スコープ] を [すべての Cloud API に完全アクセス権を許可] に設定します。
[作成] をクリックします。
Cloud Shell
Cloud Shell を開きます。
テスト用の SQL Server インスタンスを作成します。
gcloud compute instances create sql-server-test \ --machine-type=n1-standard-2 \ --scopes=cloud-platform \ --image-family=sql-std-2022-win-2022 \ --image-project=windows-sql-cloud \ --boot-disk-size=50GB \ --boot-disk-device-name=sql-server-test \ --subnet=$SUBNET_NAMEこのチュートリアルでは高いパフォーマンスを必要としないため、ディスク パフォーマンスの警告は無視してかまいません。
VM インスタンスに接続する
Google Cloud コンソールで、[VM インスタンス] ページに移動します。
VM インスタンスの準備が完了するまで 5 分ほど待ちます。
VM の初期化プロセスをモニタリングするには、Cloud Shell でシリアルポート出力を表示します。
gcloud compute instances tail-serial-port-output sql-server-prod次のメッセージが表示されたら、初期化は完了です。
Instance setup finished. sql-server-test is ready to use.
シリアルポートのモニタリングを停止するには、Ctrl + C を押します。
インスタンス名
sql-server-testをクリックして、[VM インスタンスの詳細] ページを表示します。[リモート アクセス] で [Windows パスワードを設定] をクリックし、[設定] をクリックしてリモートマシンにアカウントを作成します。
この手順ではパスワードが生成されます。パスワードをメモするか、安全な一時ファイルにコピーします。
Google Cloud コンソールの [Compute Engine] セクションで、[RDP] プルダウンをクリックし、[RDP ファイルをダウンロード] オプションを選択して、インスタンスの RDP ファイルをダウンロードします。
このファイルを RDP クライアントで使用することで、インスタンスに接続できます。詳細については、Microsoft リモート デスクトップ クライアントをご覧ください。
プロンプトが表示されたら、生成したパスワードを入力して [OK] をクリックします。
サーバー証明書を受け入れてリモート Windows インスタンスにログインするには、[続行] をクリックします。
PC を検出可能にするかどうかを尋ねられたら、[いいえ] をクリックします。
Compute Engine のディスク スナップショットを使用してデータベースのクローンを作成する
Compute Engine で実行されている SQL Server データベースのクローンを作成するには、データベースを別のデータディスクに保存し、永続ディスク スナップショットを使用してそのディスクのクローンを作成します。
永続ディスクのスナップショットを使用すると、ディスク上のデータのポイントインタイム コピーを取得できます。ディスク スナップショットのスケジュールを設定すると、データを自動的にバックアップできます。
このセクションでは、次の操作を行います。
- 本番環境サーバーのデータディスクのスナップショットを作成します。
- スナップショットから新しいディスクを作成します。
- 新しいディスクをテストサーバーにマウントします。
- このディスク上のデータベースをテスト インスタンスの SQL Server にアタッチします。
次の図は、ディスク スナップショットを使用してデータベースのクローンを作成する方法を示しています。
ディスク スナップショットを作成する
コンソール
Google Cloud コンソールで、[VM インスタンス] ページに移動します。
sql-server-prodインスタンスの名前をクリックします。[VM インスタンスの詳細] ページで、ディスク
sql-server-prod-dataをクリックします。[スナップショットを作成] をクリックします。
スナップショットに
sql-server-prod-data-snapshotという名前を付けます。[ロケーション] で [リージョン] を選択します。
リージョンが [
us-east1](VM インスタンスと同じ)に設定されていることを確認します。[VSS を有効にする] オプションをオンにします。
このオプションでは、Microsoft Windows のボリューム シャドウ コピー サービスを使用して一貫性のあるスナップショットを作成します。
[作成] をクリックします。
スナップショットの作成には、数分かかります。
Cloud Shell
Cloud Shell を開きます。
VM インスタンスと同じゾーンにデータディスクのスナップショットを作成します。
gcloud compute disks snapshot sql-server-prod-data \ --snapshot-names=sql-server-prod-data-snapshot \ --guest-flush \ --zone="${ZONE}"--guest-flushオプションでは、Microsoft Windows のボリューム シャドウ コピー サービスを使用して、一貫性のあるスナップショットを作成します。スナップショットの作成には、数分かかります。
ディスク スナップショットをテスト インスタンスにアタッチする
作成したスナップショットから新しいデータディスクを作成し、sql-server-test インスタンスにアタッチする必要があります。
コンソール
次の手順では、新しい永続ディスクを作成し、その内容に本番環境ディスクのスナップショットを使用してから、ディスクをテスト インスタンスにアタッチします。
Google Cloud コンソールで、[VM インスタンス] ページに移動します。
インスタンス名
sql-server-testをクリックします。[VM インスタンスの詳細] ページで、[編集] をクリックします。
[新しいディスクを追加] add をクリックします。
新しいディスクの名前を
sql-server-test-dataとします。[ソースの種類] で、[スナップショット] を選択します。
作成した
sql-server-prod-data-snapshotインスタンスで、[ソース スナップショット] を選択します。[モード] が [読み取り / 書き込み] に設定されていることを確認します。
[完了] をクリックします。
Cloud Shell
Cloud Shell を開きます。
本番環境ディスクのスナップショットを使用して、そのコンテンツ用の新しい永続ディスクを作成します。
gcloud beta compute disks create sql-server-test-data \ --size=100GB \ --source-snapshot=sql-server-prod-data-snapshot \ --zone="${ZONE}"新しいディスクを、読み取りと書き込み権限付きで
sql-server-testインスタンスにアタッチします。gcloud compute instances attach-disk sql-server-test \ --disk=sql-server-test-data --mode=rw
Windows で新しいデータディスクをマウントする
作成したディスクは VM インスタンスにアタッチされていますが、オフラインです。また、ボリュームは読み取り専用に設定されています。ボリュームを読み取り / 書き込み可能かつマウント可能に構成するには、次の手順を行います。
sql-server-testインスタンスに接続されている RDP クライアント ウィンドウで、Windows タスクバーの [スタート] ボタンをクリックします。「diskpart」と入力して [diskpart] をクリックし、DiskPart を開きます。- アプリに変更を許可するよう求められたら、[はい] をクリックします。
インスタンスにアタッチされているディスクのリストを表示します。
list disk次のような出力が表示されます。
Disk ### Status Size Free Dyn Gpt -------- ------------- ------- ------- --- --- Disk 0 Online 50 GB 0 B Disk 1 Offline 100 GB 0 B *
データディスク(ディスク 1、100 GB)がオフラインです。
データディスクを選択します。
select disk 1ディスクをオンラインにします。
online disk使用可能なボリュームを一覧表示します。
list volume次のような出力が表示されます。
Volume ### Ltr Label Fs Type Size Status Info ---------- --- ----------- ----- ---------- ------- --------- -------- Volume 0 C NTFS Partition 49 GB Healthy Boot Volume 1 FAT32 Partition 100 MB Healthy System Volume 2 RAW Partition 99 GB Healthy
ボリューム 2(99 GB)はデータ ボリュームです。ドライブ文字が割り当てられていない状態で [Hidden] と表示されます。
ボリュームを選択します。
select volume 2スナップショットからボリュームを作成したときに設定された属性を消去します。
attr volume clear readonly hidden nodefaultdriveletter shadowcopyこのコマンドによって、ボリュームをマウントできるようになります。
ボリュームをドライブ D としてマウントします。
assign letter=dDiskPart を終了します。
exit
ファイルの所有権と権限をリセットする
データディスクは sql-server-prod インスタンスでのスナップショットに基づいて作成したものであるため、ファイルの所有権と権限を示すユーザー ID は sql-server-test インスタンスでの ID とは異なります。ファイルの所有権を sql-server-test インスタンスのユーザーに変更し、ローカル ユーザーと MSSQLSERVER ユーザーがファイルを読み取れるように権限を更新する必要があります。
sql-server-testインスタンスに接続されている RDP クライアント ウィンドウで、Windows タスクバーの [スタート] ボタンをクリックし、「cmd」と入力します。- 管理者としてコマンド プロンプト アプリを開きます。
sql-server-dataフォルダ内のファイルのオーナーをMSSQLSERVERサービス ユーザーに設定します。icacls d:\sql-server-data /setowner "nt service\mssqlserver" /t最上位の
sql-server-dataフォルダにあるすべてのファイルのすべての権限をリセットします。icacls d:\sql-server-data /reset /tsql-server-dataフォルダのアクセス制御リスト(ACL)を更新します。icacls d:\sql-server-data /grant Administrators:(oi)(ci)f "nt service\mssqlserver":(oi)(ci)f "owner rights":(oi)(ci)f %USERNAME%:(oi)(ci)fドライブのルートフォルダからの継承を無効にして、上記の権限のみが適用されるようにします。
icacls d:\sql-server-data /inheritancelevel:rコマンド プロンプト アプリを終了します。
exit
これで、SQL Server インスタンスと sql-server-test インスタンスのローカル ユーザーがデータベース ファイルにアクセスできるようになります。
作成したデータベースのクローンをアタッチする
これで、ドライブ D(data)上のクローン データベースをテスト用の SQL Server インスタンスにアタッチできます。Microsoft SQL Server Management Studio ウィザードを使用してインタラクティブに、または Transact-SQL コマンドを実行して直接的に、データベースをアタッチします。
SSMS ウィザード
sql-server-testインスタンスに接続されている RDP セッションで、Windows タスクバーの [スタート] ボタンをクリックし、「ssms」と入力して [Microsoft SQL Server Management Studio(管理者として実行)] を選択します。- [接続] をクリックし、Windows 認証を使用して
sql-server-testデータベース エンジンに接続します。 - オブジェクト エクスプローラーで、[データベース] を右クリックし、[アタッチ] を選択します。
- [データベースのアタッチ] ウィザードで、[追加] をクリックします。
- ディレクトリ
D:\sql-server-data\wideworldimportersを参照してWideWorldImporters.mdfファイルをクリックし、[OK] をクリックします。 [OK] をクリックしてデータベースをアタッチします。
しばらくすると、作成したデータベースのクローンがアタッチされます。オブジェクト エクスプローラーで [更新] refresh をクリックすると、データベースがデータベース ツリーに表示されているかどうかを確認できます。
Transact-SQL
sql-server-testインスタンスに接続されている RDP セッションで、Windows タスクバーの [スタート] ボタンをクリックし、「ssms」と入力して [Microsoft SQL Server Management Studio(管理者として実行)] を選択します。- [接続] をクリックし、Windows 認証を使用して
sql-server-prodデータベース エンジンに接続します。 - [ファイル] > [新規作成] > [クエリを現在の接続で実行] を選択して新しいクエリ ウィンドウを開きます。
D:\sql-server-data\wideworldimportersディレクトリ内のデータとログファイルをアタッチします。USE [master] GO CREATE DATABASE [WideWorldImporters] ON ( FILENAME = N'D:\sql-server-data\wideworldimporters\WideWorldImporters.mdf' ), ( FILENAME = N'D:\sql-server-data\wideworldimporters\WideWorldImporters.ldf' ), ( FILENAME = N'D:\sql-server-data\wideworldimporters\WideWorldImporters_UserData.ndf' ) FOR ATTACH GOクエリコードを右クリックし、[実行] をクリックします。
しばらくすると、作成したデータベースのクローンがアタッチされます。オブジェクト エクスプローラーで [更新] refresh をクリックすると、データベースがデータベース ツリーに表示されているかどうかを確認できます。データベースがアタッチされたら、保存せずにクエリ ウィンドウを閉じることができます。
サンプル データベースが機能していることを確認するには、クエリを実行します。
SQL Server Management Studio で、[ファイル] > [新規作成] > [クエリを現在の接続で実行] を選択して、新しいクエリ ウィンドウを開いてから次のコードをコピーします。
SELECT top(100) i.InvoiceDate, i.InvoiceID, i.CustomerID, c.CustomerName, i.ConfirmedDeliveryTime, i.ConfirmedReceivedBy FROM WideWorldImporters.Sales.Invoices i JOIN WideWorldImporters.Sales.Customers c ON i.CustomerID=c.CustomerID WHERE i.ConfirmedDeliveryTime IS NOT NULL ORDER BY i.InvoiceDate desc;このクエリは、最近配信された 100 件の請求書から概要情報を取得します。
クエリを実行するには、クエリ ウィンドウを右クリックして [実行] を選択します。
[結果] ペインに概要情報が表示されます。

これで、永続ディスクのスナップショットを使用してデータベースのクローンを作成する方法は以上です。次は、バックアップと復元を使用してデータベースのクローンを作成する方法について説明します。この 2 番目の方法のチュートリアルを完了するには、sql-server-test インスタンスからクローン作成したデータベースを削除する必要があります。
作成したデータベースのクローンを削除する
ディスク スナップショットを使用して作成したデータベースのクローンを削除するには、次の手順を行います。
SSMS ウィザード
sql-server-testインスタンスに接続されている RDP セッションで、Microsoft SQL Server Management Studio を開き、sql-server-testデータベース エンジンに接続します。- オブジェクト エクスプローラーで [データベース] を展開し、
WorldWideImportersデータベースを右クリックして [削除] を選択します。 - [オブジェクトの削除] ウィザードで [既存の接続を閉じる] チェックボックスがオンになっていることを確認します。
- [OK] をクリックします。
Transact-SQL
sql-server-testインスタンスに接続されている RDP セッションで、Microsoft SQL Server Management Studio を開き、sql-server-testデータベース エンジンに接続します。WideWorldImportersデータベースへのすべての接続を閉じて削除するには、次のスクリプトを新しいクエリ ウィンドウにコピーし、コードを右クリックしてから [実行] をクリックします。USE [master] GO ALTER DATABASE [WideWorldImporters] SET SINGLE_USER WITH ROLLBACK IMMEDIATE GO DROP DATABASE [WideWorldImporters] GOデータベースが削除されたら、保存せずにクエリ ウィンドウを閉じることができます。オブジェクト エクスプローラーで [更新] refresh をクリックすると、データベースが削除されたことを確認できます。
バックアップと復元を使用したクローン作成
Compute Engine で実行されている SQL Server データベースのクローンを作成する 2 つ目の方法は、SQL Server のネイティブ バックアップと復元です。この方法では、Cloud Storage を使用してバックアップを転送します。
このセクションでは、このチュートリアルの Compute Engine のディスク スナップショットを使用してデータベースのクローンを作成するセクションで作成したリソースを使用します。そのセクションの手順を完了していない場合は、続行する前に完了する必要があります。
このセクションでは、次の操作を行います。
- Cloud Storage バケットを作成します。
- 本番環境サーバーでデータベースのバックアップを作成します。
- 本番環境サーバーから Cloud Storage にバックアップ ファイルをコピーします。
- バックアップ ファイルを Cloud Storage からテスト用サーバーにコピーします。
- テスト インスタンスでバックアップを復元します。
次の図は、Cloud Storage を使用してバックアップを転送して、データベースのクローンを作成する方法を示しています。
Google Cloud 外のシステムにも Cloud Storage へのアクセス権を付与できるため、この方法で外部の SQL Server インスタンスからデータベースのクローン作成が可能です。
Cloud Storage バケットを作成する
バックアップ ファイルを sql-server-prod インスタンスから sql-server-test インスタンスに転送する間に、バックアップ ファイルを保存する Cloud Storage バケットを作成する必要があります。
コンソール
Google Cloud コンソールで Cloud Storage の [ブラウザ] ページに移動します。
[バケットを作成] をクリックします。
バケットに
project-name-bucket という名前を付けます。次のように置き換えます。
project-name: 実際の Google Cloudプロジェクト ID。
[デフォルトのストレージ クラスを選択する] を開き、[リージョン] を選択します。
[ロケーション] で [us-east1] を選択します。
[作成] をクリックします。
Cloud Shell
Cloud Shell を開きます。
VM インスタンスと同じリージョンに Cloud Storage バケットを作成します。
gcloud storage buckets create "gs://$(gcloud config get-value project)-bucket" --location="${REGION}"
データベースの完全なポイントインタイム バックアップを作成する
本番環境では、すでにバックアップが作成されている可能性があります。このようなバックアップは、データベースのクローン作成のベースとして使用できます。このチュートリアルでは、既存の完全バックアップまたは増分バックアップのスケジュールに影響を与えないように、コピー専用バックアップを作成します。
SSMS ウィザード
sql-server-prodインスタンスに接続されている RDP セッションで、Microsoft SQL Server Management Studio を開き、sql-server-prodデータベース エンジンに接続します。- オブジェクト エクスプローラーで、[データベース] を展開し、
WorldWideImportersデータベースを右クリックして、[タスク] > [バックアップ] の順に選択します。 - [データベースのバックアップ] ウィザードで、次の値が設定されていることを確認します。
- [バックアップの種類] が [完全] に設定されている。
- [コピーのみのバックアップ] が選択されている。
- [バックアップ先] が [ディスク] に設定されている。
- バックアップ ファイルを追加するには、[追加] をクリックします。
[バックアップ先] フィールドに「
D:\sql-server-data\WideWorldImporters-copy.bak」と入力します。![[データベースのバックアップ] ダイアログのスクリーンショット。](https://cloud.google.com/static/architecture/images/cloning-a-microsoft-sql-server-database-on-compute-engine-back-up-database.png?hl=ja)
[メディア オプション] ページを選択し、[既存のすべてのバックアップ セットを上書きする] を選択します。
[バックアップ オプション] ページを選択し、[バックアップ圧縮の既定] を [バックアップを圧縮する] に変更します。
バックアップを作成するには、[OK] をクリックします。
バックアップの作成には数分かかります。
Transact-SQL
sql-server-prodインスタンスに接続されている RDP セッションで、Microsoft SQL Server Management Studio を開き、sql-server-prodデータベース エンジンに接続します。WideWorldImportersデータベースのコピー専用圧縮バックアップをファイルd:\sql-server-data\WideWorldImporters-copy.bakに実行するには、次のスクリプトを新しいクエリ ウィンドウにコピーし、コードを右クリックしてから [実行] をクリックします。BACKUP DATABASE [WideWorldImporters] TO DISK = N'd:\sql-server-data\WideWorldImporters-copy.bak' WITH COPY_ONLY, NOFORMAT, INIT, NAME = N'WideWorldImporters-Full Database Backup', SKIP, NOREWIND, NOUNLOAD, COMPRESSION, STATS = 10 GOサーバーがバックアップを作成するまで数分かかります。データベースのバックアップが完了したら、保存せずにクエリ ウィンドウを閉じることができます。
バックアップ ファイルを Cloud Storage にコピーする
sql-server-prodインスタンスに接続されている RDP セッションで、Windows PowerShell ウィンドウを開きます。前の手順で作成した Cloud Storage バケットにバックアップ ファイルをコピーします。
gcloud storage cp d:\sql-server-data\WideWorldImporters-copy.bak "gs://$(gcloud config get-value project)-bucket/" --no-clobberPowerShell を終了します。
exit
バックアップ ファイルを Cloud Storage から sql-server-test にコピーする
sql-server-testインスタンスに接続されている RDP セッションで、Windows PowerShell ウィンドウを開きます。前の手順で作成した Cloud Storage バケットにバックアップ ファイルをコピーします。
gcloud storage cp "gs://$(gcloud config get-value project)-bucket/WideWorldImporters-copy.bak" d:\sql-server-data\PowerShell を終了します。
exit
これで、テスト インスタンスのローカル ディスクに、データベースの完全なコピーのバックアップが作成されました。
バックアップを復元する
完全なコピーのバックアップを sql-server-test インスタンスのドライブ D(data)に復元します。
SSMS ウィザード
sql-server-testインスタンスに接続されている RDP セッションで、Microsoft SQL Server Management Studio を開き、sql-server-testデータベース エンジンに接続します。- オブジェクト エクスプローラーで [データベース] を右クリックし、[データベースの復元] を選択します。
- [ソース] で [デバイス] を選択し、デバイス名の横にある [...] ボタンをクリックします。
- [バックアップ デバイスの選択] ダイアログで、[バックアップ メディアの種類] リストから [ファイル] を選択し、[追加] をクリックします。
- ファイル セレクタで、
D:\sql-server-dataを参照し、WideWorldImporters-copy.bakファイルをクリックして、[OK] をクリックします。 [OK] をクリックして [バックアップ デバイスの選択] ダイアログを閉じます。
[データベースの復元] ダイアログに、
WideWorldImportersデータベース バックアップに関するデータが入力されました。[ページの選択] で [ファイル] をクリックします。
[すべてのファイルをフォルダーに移動する] を選択します。
[データ ファイル フォルダー] フィールドと [ログ ファイルのフォルダー] フィールドで「
D:\sql-server-data\wideworldimporters」と入力します。![[データベースの復元] ダイアログのスクリーンショット。](https://cloud.google.com/static/architecture/images/cloning-a-microsoft-sql-server-database-on-compute-engine-restore-database.png?hl=ja)
復元オペレーションを開始するには、[OK] をクリックします。
プロセスが完了すると、
Database 'WideWorldImporters' restored successfullyというメッセージが表示されます。
Transact-SQL
sql-server-testインスタンスに接続されている RDP セッションで、Microsoft SQL Server Management Studio を開き、sql-server-testデータベース エンジンに接続します。- [ファイル] > [新規作成] > [クエリを現在の接続で実行] を選択して新しいクエリ ウィンドウを開きます。
次の T-SQL コマンドをコピーして、Cloud Storage からコピーしたバックアップ ファイルから復元を開始し、データベースとログファイルを
D:\sql-server-data\wideworldimportersディレクトリに復元します。USE [master] GO RESTORE DATABASE [WideWorldImporters] FROM DISK = N'D:\SQL-SERVER-DATA\WideWorldImporters-copy.bak' WITH FILE = 1, MOVE N'WWI_Primary' TO N'D:\SQL-SERVER-DATA\WideWorldImporters\WideWorldImporters.mdf', MOVE N'WWI_UserData' TO N'D:\SQL-SERVER-DATA\WideWorldImporters\WideWorldImporters_UserData.ndf', MOVE N'WWI_Log' TO N'D:\SQL-SERVER-DATA\WideWorldImporters\WideWorldImporters.ldf', MOVE N'WWI_InMemory_Data_1' TO N'D:\SQL-SERVER-DATA\WideWorldImporters\WideWorldImporters_InMemory_Data_1', NOUNLOAD, STATS = 5 GOコードを右クリックし、[実行] をクリックします。
数分後にデータベースの復元が完了します。オブジェクト エクスプローラーで [更新] refresh をクリックすると、データベースがデータベース ツリーに表示されているかどうかを確認できます。データベースの復元が完了したら、保存せずにクエリ ウィンドウを閉じることができます。
データベースが機能していることを確認するには、クエリを実行します。
Microsoft SQL Management Studio で、[ファイル] > [新規作成] > [クエリを現在の接続で実行] を選択して、新しいクエリ ウィンドウを開いてから次のコードをコピーします。
SELECT top(100) i.InvoiceDate, i.InvoiceID, i.CustomerID, c.CustomerName, i.ConfirmedDeliveryTime, i.ConfirmedReceivedBy FROM WideWorldImporters.Sales.Invoices i JOIN WideWorldImporters.Sales.Customers c ON i.CustomerID=c.CustomerID WHERE i.ConfirmedDeliveryTime IS NOT NULL ORDER BY i.InvoiceDate desc;このクエリは、最近配信された 100 件の請求書から概要情報を取得します。
クエリ ウィンドウを右クリックし、[実行] をクリックします。
[結果] ペインに概要情報が表示されます。

クローン作成先としての Cloud SQL の使用
クローン作成先のデータベースが Cloud SQL でホストされており、元のデータベースが Compute Engine にある場合、サポートされている唯一のクローンの作成方法は、データベースを Cloud Storage にバックアップした後、Cloud SQL に復元する方法です。
このチュートリアルでは、前のセクションで作成したバックアップを再利用します。
Cloud SQL for SQL Server インスタンスの作成
Cloud Shell を開きます。
sql-server-prodインスタンスと同じデータベース バージョンを実行している Cloud SQL for SQL Server インスタンスを作成します。gcloud sql instances create sqlserver-cloudsql \ --database-version=SQLSERVER_2022_STANDARD \ --cpu=2 \ --memory=5GB \ --root-password=sqlserver12@ \ --region=${REGION}これにより、root ユーザーが
sqlserver、パスワードがsqlserver12@のインスタンスが作成されます。
オブジェクト権限を更新する
Cloud SQL サービス アカウントが Cloud Storage バケットとバックアップ オブジェクトを読み取れるようにするには、そのどちらにも適切な権限を設定する必要があります。この権限は、 Google Cloud コンソールを使用してオブジェクトをインポートするときに自動的に設定されるか、gcloud コマンドを使用して設定できます。
Cloud Shell を開きます。
Cloud SQL インスタンスのサービス アカウントのアドレスを格納する環境変数を設定します。
CLOUDSQL_SA="$(gcloud sql instances describe sqlserver-cloudsql --format='get(serviceAccountEmailAddress)')"サービス アカウントをバケット IAM ポリシーにリーダーおよびライターとして追加します。
gcloud storage buckets add-iam-policy-binding "gs://$(gcloud config get-value project)-bucket/" \ --member=user:"${CLOUDSQL_SA}" --role=roles/storage.objectUser
エクスポートしたデータベースをインポートする
Cloud Shell を開きます。
エクスポートしたファイルを Cloud SQL インスタンスにインポートします。
gcloud sql import bak sqlserver-cloudsql \ "gs://$(gcloud config get-value project)-bucket/WideWorldImporters-copy.bak" \ --database WideWorldImportersプロンプトが表示されたら、「
y」と入力します。SQL Server ツール パッケージをインストールします。
sudo apt install -y mssql-toolsライセンス規約に同意する場合は、表示されたプロンプトで「
yes」と入力します。これらのツールを使用して Cloud Shell から Cloud SQL に接続し、Cloud SQL インスタンスでクエリを実行できるようにします。
Cloud SQL プロキシを SQL Server インスタンスに接続します。
CONNECTION_NAME=$(gcloud sql instances describe sqlserver-cloudsql --format='value(connectionName)') cloud_sql_proxy -instances=${CONNECTION_NAME}=tcp:1433 &クローンを作成したデータベースが機能していることを確認するには、次のコマンドを実行します。
/opt/mssql-tools/bin/sqlcmd -U sqlserver -S 127.0.0.1 -Q \ 'SELECT top(100) i.InvoiceDate, i.InvoiceID, i.CustomerID, LEFT(c.CustomerName,20) CustomerName, i.ConfirmedDeliveryTime, LEFT(i.ConfirmedReceivedBy,20) ConfirmedReceivedBy FROM WideWorldImporters.Sales.Invoices i JOIN WideWorldImporters.Sales.Customers c ON i.CustomerID=c.CustomerID WHERE i.ConfirmedDeliveryTime IS NOT NULL ORDER BY i.InvoiceDate desc;'プロンプトが表示されたら、
sqlserver-cloudsqlデータベース サーバーのsqlserverユーザーのパスワードを入力します(sqlserver12@)。このクエリは、最近配信された 100 件の請求書から概要情報を取得します。
次のような出力が表示されます。
InvoiceDate InvoiceID CustomerID CustomerName ConfirmedDeliveryTime ConfirmedReceivedBy ---------------- ----------- ----------- -------------------- -------------------------------------- -------------------- 2016-05-30 70349 581 Wingtip Toys (Munich 2016-05-31 07:05:00.0000000 Youssef Eriksson 2016-05-30 70350 123 Tailspin Toys (Roe P 2016-05-31 07:10:00.0000000 Ella Zvirbule 2016-05-30 70351 175 Tailspin Toys (San A 2016-05-31 07:15:00.0000000 Julio Correa 2016-05-30 70352 1029 Veronika Necesana 2016-05-31 07:20:00.0000000 Veronika Necesana 2016-05-30 70353 1014 Narendra Tickoo 2016-05-31 07:25:00.0000000 Narendra Tickoo 2016-05-30 70354 930 Shantanu Huq 2016-05-31 07:30:00.0000000 Shantanu Huq 2016-05-30 70355 963 Be Trang 2016-05-31 07:35:00.0000000 Be Trang 2016-05-30 70356 567 Wingtip Toys (Jerome 2016-05-31 07:40:00.0000000 Severins Polis 2016-05-30 70357 510 Wingtip Toys (Grabil 2016-05-31 07:45:00.0000000 Manish Ghosh ...
クリーンアップ
このチュートリアルで使用したリソースについて、 Google Cloud アカウントに課金されないようにするには、このチュートリアルで作成した Google Cloud プロジェクトを削除します。
- 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 インスタンスを Compute Engine で実行するためのベスト プラクティスを学習する。
- Google Cloud に関するリファレンス アーキテクチャ、図、ベスト プラクティスを確認する。Cloud アーキテクチャ センターをご覧ください。