SQL Server 2017 と Cloud SQL for SQL Server 間でバックアップ ファイルを使用してデータを移行する

このチュートリアルでは、Compute Engine で実行中の SQL Server 2017 Enterprise から Cloud SQL for SQL Server 2017 Enterprise にデータを移行します。SQL Server 2017 からのデータのエクスポート、Cloud SQL for SQL Server 2017 へのインポート、データのインポートが正常であることの検証を実施する方法を説明しています。

SQL Server 2008 からデータを移行する場合は、SQL Server 2008 と Cloud SQL for SQL Server 間でのバックアップ ファイルを使用してデータを移行するをご覧ください。

このチュートリアルは、SQL Server 2017 から Cloud SQL for SQL Server へのアップグレードを希望するシステム管理者、デベロッパー、エンジニア、データベース管理者、または DevOps エンジニアの方を対象としています。

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

目標

  • Compute Engine でサンプル データベースをホストする SQL Server 仮想マシン(VM)インスタンスを作成します。
  • Cloud SQL for SQL Server インスタンスを作成します。
  • Cloud Storage バケットを作成します。
  • サンプル データベースをバックアップします。
  • Cloud SQL for SQL Server にデータベースをインポートします。
  • インポートされたデータを検証します。

料金

このチュートリアルでは、課金対象である次の Google Cloud コンポーネントを使用します。

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

このチュートリアルを終了した後、作成したリソースを削除すると、それ以上の請求は発生しません。詳しくは、クリーンアップをご覧ください。

始める前に

  1. Google アカウントにログインします。

    Google アカウントをまだお持ちでない場合は、新しいアカウントを登録します。

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

    [プロジェクトの選択] ページに移動

  3. Cloud プロジェクトに対して課金が有効になっていることを確認します。プロジェクトに対して課金が有効になっていることを確認する方法を学習する

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

    API を有効にする

  5. Cloud Console で、Cloud Shell をアクティブにします。

    Cloud Shell をアクティブにする

    Cloud Console の下部にある Cloud Shell セッションが開始し、コマンドライン プロンプトが表示されます。Cloud Shell はシェル環境です。gcloud コマンドライン ツールなどの Cloud SDK がすでにインストールされており、現在のプロジェクトの値もすでに設定されています。セッションが初期化されるまで数秒かかることがあります。

サンプル データベース用のスクリプトの作成

このセクションでは、事前に読み込まれたサンプル データベースにデータを入力するスクリプトを作成します。 次に、このデータベースを使用する SQL Server 2017 インスタンスを Compute Engine 上に作成します。

  1. Cloud Shell で、起動スクリプトとしてデプロイする PowerShell スクリプトを作成します。

    cat << 'EOF' > startup.ps1
    [Net.ServicePointManager]::SecurityProtocol = [Net.SecurityProtocolType]::Tls12
    $dataseturl = "https://opendata.maryland.gov/api/views/ryxx-aeaf/rows.csv?accessType=DOWNLOAD"
    Invoke-WebRequest -Uri $dataseturl -OutFile c:\dataset.csv
    Invoke-Sqlcmd -Query "CREATE DATABASE testdb;"
    Invoke-Sqlcmd -Query "CREATE TABLE testdb.dbo.MarylandZipCodes ( zipcode int NOT NULL PRIMARY KEY,  city varchar(255), county varchar(255))"
    Invoke-Sqlcmd -Query "BULK INSERT testdb.dbo.MarylandZipCodes FROM 'c:\dataset.csv' WITH (DATAFILETYPE='char',FIELDTERMINATOR=',' ,ROWTERMINATOR = '0x0a',  FIRSTROW=2);"
    EOF
    

    この起動スクリプトでは、MarylandZipCodes というテーブルがある testdb という名前のローカル データベースを作成します。次に、このスクリプトはメリーランドの公開郵便番号レジストリをダウンロードし、レジストリをテーブルにインポートします。

  2. Windows Server 2016 用の SQL Server 2017 Enterprise インスタンスを作成します。

    gcloud compute instances create sql-server --machine-type n1-highmem-4 \
        --boot-disk-size 50GB \
      --image-project windows-sql-cloud --image-family sql-ent-2017-win-2016 \
      --zone us-central1-f  \
      --scopes=https://www.googleapis.com/auth/cloud-platform \
      --metadata-from-file windows-startup-script-ps1=startup.ps1
    

    このチュートリアルでは、us-central1-f ゾーンにブートディス クサイズが 50 GB のインスタンスを作成します。ゾーンの詳細については、クラウドのロケーションをご覧ください。--metadata-from-file フラグでは、インスタンスの起動スクリプトとして PowerShell スクリプトを設定します。

Cloud SQL インスタンスと Cloud Storage バケットの作成

  1. Cloud Shell で、Cloud SQL for SQL Server 2017 Enterprise インスタンスを作成し、その後データベースをそこに移行します。

    gcloud beta sql instances create target  \
        --database-version=SQLSERVER_2017_ENTERPRISE \
        --cpu=2 \
        --memory=5GB \
        --root-password=sqlserver12@ \
        --zone=us-central1-f
    

    インスタンスの作成には数分かかることがあります。デフォルトの root ユーザー名は sqlserver で、デフォルトのパスワードは sqlserver12@ です。このチュートリアルでは、インスタンスを us-central1-f ゾーンに作成します。ゾーンの詳細については、クラウドのロケーションをご覧ください。

  2. データを Cloud SQL にインポートする前に、バックアップ ファイルを格納する Cloud Storage バケットを作成します。

    gsutil mb -l US "gs://${DEVSHELL_PROJECT_ID}-sql-backups"
    

サンプル データベースのバックアップ

このセクションでは、SQL Server 仮想マシン(VM)に接続し、データベースのバックアップを作成して、Cloud Storage にバックアップ データベースをアップロードします。

  1. Cloud Shell で、SQL Server VM インスタンスのパスワードをリセットします。

    gcloud compute reset-windows-password sql-server --zone=us-central1-f
    

    ユーザーの新しいパスワードをメモしておきます。

  2. ブラウザで、Google Cloud 拡張機能用の Chrome RDP をインストールします。

  3. Cloud Console で、[VM インスタンス] ページに移動します。

    [VM インスタンス] ページに移動

  4. Chrome RDP 拡張機能を開くには、接続する sql-server VM インスタンスの [RDP] ボタンをクリックします。

  5. [ユーザー名] フィールドと [パスワード] フィールドに、SQL Server VM インスタンス用にメモしておいたユーザー名とパスワードを入力します。

  6. [ドメイン] フィールドは空白のままにして、[OK] をクリックして SQL Server VM に接続します。

    プロンプトが表示されたら、証明書を受け入れます。

  7. 利用規約に同意する場合は、[続行] をクリックします。

  8. ブラウザで、すべてのウィンドウを最小化し、PowerShell コマンドライン ツールを起動します。

  9. バックアップ フォルダを作成します。

    mkdir c:\backup
    
  10. ブラウザで、バックアップ フォルダにデータベースのバックアップを作成します。

    osql -E -Q "BACKUP DATABASE testdb TO DISK='c:\backup\testdb.bak'"
    
  11. インスタンスのシェルで、バックアップ ファイルを Cloud Storage バケットにコピーします。

    $PROJECT_ID=(gcloud config get-value core/project)
    
    gsutil cp -n c:\backup\testdb.bak gs://$PROJECT_ID-sql-backups
    

バックアップ ファイルを Cloud SQL にインポートする

  1. Cloud Shell で、Cloud SQL インスタンスに関連付けられたサービス アカウントを取得し、変数に保存します。

    SVC_EMAIL_ADDRESS=$(gcloud sql instances describe target \
        --format='value(serviceAccountEmailAddress)')
    echo $SVC_EMAIL_ADDRESS
    

    Google Cloud は、Cloud SQL インスタンスの作成時にサービス アカウントを作成します。サービス アカウントを使用して、Cloud SQL インスタンスに必要なリソースへのアクセス権を付与します。

  2. ライター権限を持つ Cloud Storage バケットのアクセス制御リスト(ACL)に、サービス アカウントを追加します。

    gsutil acl ch -u ${SVC_EMAIL_ADDRESS}:W gs://${DEVSHELL_PROJECT_ID}-sql-backups
    
  3. リーダー権限を持つインポート ファイルに、サービス アカウントを追加します。

    gsutil acl ch -u $SVC_EMAIL_ADDRESS:R gs://${DEVSHELL_PROJECT_ID}-sql-backups/testdb.bak
    
  4. バックアップ ファイルを Cloud SQL データベースにインポートします。

    gcloud beta sql import bak target \
        gs://${DEVSHELL_PROJECT_ID}-sql-backups/testdb.bak --database testdb
    

データのインポートを検証する

このセクションでは、サンプルデータが正常にインポートされたことを確認します。

  1. Cloud Shell で、以下のように SQL Server ツールキットをインストールします。

    sudo apt-get install -y mssql-tools
    

    ライセンス条項に同意する場合は、プロンプトが表示されたら「yes」と入力します。

  2. Cloud SQL インスタンスに安全にアクセスするために、Cloud SQL Proxy をダウンロードします。

    wget https://dl.google.com/cloudsql/cloud_sql_proxy.linux.amd64 -O cloud_sql_proxy
    
  3. Cloud SQL Proxy を起動します。

    CONNECTION_NAME=$(gcloud sql instances describe target --format='value(connectionName)')
    ./cloud_sql_proxy -instances=${CONNECTION_NAME}=tcp:1433 &
    
  4. Cloud SQL テーブル内の行数を読み取ります。

    /opt/mssql-tools/bin/sqlcmd -U sqlserver -S 127.0.0.1 -Q "select count(*)
    from testdb.dbo.MarylandZipCodes"
    

    プロンプトが表示されたら、sqlserver12@ パスワードを入力します。出力で、結果が 619 であることを確認します。

クリーンアップ

課金を停止する最も簡単な方法は、チュートリアル用に作成した Cloud プロジェクトを削除することです。

プロジェクトを削除する

  1. Cloud Console で [リソースの管理] ページに移動します。

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

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

次のステップ