Microsoft SQL Server のバックアップを使用して Compute Engine でポイントインタイム リカバリを行う

Last reviewed 2023-06-27 UTC

このチュートリアルでは、Compute Engine SQL Server インスタンスでバックアップを実行します。これらのバックアップを管理して Cloud Storage に保存する方法と、データベースを特定の時点に復元する方法について説明します。

このチュートリアルは、SQL Server のデータをバックアップするシステム管理者、デベロッパー、エンジニア、データベース管理者または DevOps エンジニアの方に役立ちます。

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

  • Microsoft Windows
  • Microsoft SQL Server
  • SQL Server の完全バックアップ、差分バックアップ、トランザクション ログのバックアップ
  • Compute Engine
  • Cloud Storage

目標

  • SQL Server インスタンスを起動してデータベースを作成する。
  • 完全バックアップ、差分バックアップ、トランザクション ログのバックアップを行う。
  • Cloud Storage にバックアップをアップロードする。
  • Cloud Storage のバックアップからデータベースを復元する。

料金

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

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

始める前に

  1. 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.
  2. Google Cloud Console の [プロジェクト セレクタ] ページで、Google Cloud プロジェクトを選択または作成します。

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

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

  4. Compute Engine API を有効にします。

    API を有効にする

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

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

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

  7. Compute Engine API を有効にします。

    API を有効にする

  8. 任意の Remote Desktop Protocol(RDP)クライアントをインストールします。詳細については、Microsoft リモート デスクトップ クライアントをご覧ください。RDP クライアントがすでにインストールされている場合は、このタスクをスキップできます。

このドキュメントに記載されているタスクの完了後、作成したリソースを削除すると、それ以上の請求は発生しません。詳細については、クリーンアップをご覧ください。

SQL Server インスタンスの準備

このセクションでは、SQL Server インスタンスを起動し、データベースを準備して暗号鍵を構成します。

SQL Server インスタンスを起動する

最初の作業は、SQL Server インスタンスを起動してバックアップ フォルダを作成することです。

  1. Cloud Shell を開きます。

    Cloud Shell に移動

  2. SQL Server インスタンスを起動します。

    gcloud compute instances create sqlserver \
        --zone=us-central1-c \
        --machine-type=n1-standard-1 \
        --image-family=sql-std-2019-win-2019 \
        --image-project=windows-sql-cloud \
        --boot-disk-size=50GB \
        --boot-disk-type=pd-standard \
        --tags=sqlserver \
        --scopes=https://www.googleapis.com/auth/cloud-platform
    
  3. Google Cloud コンソールで [VM インスタンス] ページに移動し、接続する Windows インスタンスを探します。

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

  4. インスタンスに初期パスワードを設定します。パスワードは安全な場所に保管してください。

  5. Google Cloud コンソールの [Compute Engine] セクションで、[RDP] プルダウンをクリックして、[RDP ファイルをダウンロード] オプションを選択し、インスタンスの RDP ファイルをダウンロードします。このファイルを RDP クライアントで使用することで、インスタンスに接続できます。詳細については、Microsoft リモート デスクトップ クライアントをご覧ください。

SQL Server Management Studio をインストールする

次の手順で Microsoft SQL Server Management Studio(SSMS)をインストールします。

  1. RDP セッションで、すべてのウィンドウを最小化し、Windows PowerShell ISE アプリを起動します。

  2. PowerShell プロンプトで、SSMS インストーラをダウンロードして実行します。

    Start-BitsTransfer `
        -Source "https://aka.ms/ssmsfullsetup" `
        -Destination "$env:Temp\ssms-setup.exe"
    & $env:Temp\ssms-setup.exe
    
  3. プロンプトの内容に同意して、変更を許可します。

  4. SSMS インストーラで [インストール] をクリックします。

  5. インストールが完了したら、[再起動] をクリックしてリモートマシンを再起動します。これで RDP セッションが終了します。

  6. 再接続するには、RDP ウィンドウで [接続] をクリックします。リモートマシンの再起動が完了していない場合は、しばらくしてからもう一度接続を試みてください。

  7. 先ほど保存したユーザー名とパスワードを入力します([ドメイン] フィールドは空白のままにします)。[OK] をクリックして再接続します。

バックアップ フォルダと復元フォルダを準備する

  1. RDP セッションで、すべてのウィンドウを最小化してから、Windows デスクトップで Google Cloud SDK Shell を開きます(Cloud Shell ではありません)。

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

    mkdir c:\backup
    
  3. 復元フォルダを作成します。

    mkdir c:\restore
    

データベースを準備する

  1. Cloud Shell で、インスタンスにテスト データベースを作成します。

    osql -E -Q "create database testdb"
    
  2. テストテーブルを作成します。

    osql -E -Q "create table testdb.dbo.testtable(status varchar(255))"
    

暗号鍵を構成する

  1. Cloud Shell で、プライマリ データベース キーを作成します。

    osql -E -Q "USE master;CREATE MASTER KEY ENCRYPTION BY PASSWORD = 'MyPassword!';"
    
  2. バックアップ証明書を作成します。

    osql -E -Q "USE master; CREATE CERTIFICATE testdbcert WITH SUBJECT = 'testdb certificate';"
    

バックアップの実行

SQL Server 2019 以前

このセクションでは、異なるデータベースに対して完全バックアップ、差分バックアップ、トランザクション ログのバックアップを作成します。

  1. テストテーブルに行を追加します。

    osql -E -Q "insert into testdb.dbo.testtable ([status]) VALUES ('Initial')"
    
  2. Cloud Shell で、完全バックアップを実行します。

    osql  -E -Q "BACKUP DATABASE testdb TO DISK='c:\backup\testdb.bak' WITH INIT,
        COMPRESSION,
        ENCRYPTION
        (
            ALGORITHM = AES_256,
            SERVER CERTIFICATE = testdbcert
        )  "
    
  3. テストテーブルに行を追加します。

    osql -E -Q "insert into testdb.dbo.testtable ([status]) VALUES ('After Full Backup')"
    
  4. 差分バックアップを実行します。

    osql  -E -Q "BACKUP DATABASE testdb TO DISK='c:\backup\testdb-diff.bak' WITH DIFFERENTIAL,
    COMPRESSION,
    ENCRYPTION
        (
        ALGORITHM = AES_256,
        SERVER CERTIFICATE = testdbcert
        ) "
    
  5. テストテーブルに行を追加します。

    osql -E -Q "insert into testdb.dbo.testtable ([status]) VALUES ('After Diff Backup')"
    
  6. トランザクション ログのバックアップを実行します。

    osql  -E -Q "BACKUP LOG testdb TO DISK='c:\backup\testdb-log.bak' WITH COMPRESSION,
    ENCRYPTION
        (
        ALGORITHM = AES_256,
        SERVER CERTIFICATE = testdbcert
        ) "
    
  7. テストテーブルに行を追加します。

    osql -E -Q "insert into testdb.dbo.testtable ([status]) VALUES ('Bad Row')"
    
  8. テーブル内の行を確認します。

    osql -E -Q "select * from testdb.dbo.testtable"
    

    出力は次のようになります。

    Initial
    
    After Full Backup
    
    After Diff Backup
    
    Bad Row
    

SQL Server 2022

このセクションでは、異なるデータベースに対して完全バックアップ、差分バックアップ、トランザクション ログのバックアップを作成します。Cloud Storage では、組み込みのバックアップ コマンドと復元コマンドを使用します。

SQL Server 2022(16.x)では、REST API を使用して S3 互換のオブジェクト ストレージのプロバイダに接続する新しいコネクタを導入することで、拡張オブジェクト ストレージの統合をサポートしています。SQL Server 2022 の BACKUP TO URL コマンドと RESTORE FROM URL コマンドでは、S3 互換ストレージの宛先を URL として使用できます。

SQL Server は証明書を使用して SQL Server の外部のリソースに接続します。証明書は認証情報を含むレコードです。Cloud Storage S3 インターフェースへのアクセスを認証および承認するには、アクセスキーとシークレット キーを作成して使用する必要があります。次に、これらの鍵を SQL Server の証明書に保存します。

  1. Cloud Storage バケットに対して、ユーザー アカウントのアクセスキーとシークレット キーを作成します。

    1. [Cloud Storage] に移動します。
    2. [設定] に移動します。
    3. [相互運用性] に移動します。
    4. [ユーザー アカウントのアクセスキー] に移動します。
    5. 下にスクロールして [鍵を作成] をクリックし、新しいアクセスキーとシークレット キーを作成します。
  2. SQL Server 2022 インスタンスで証明書を作成します。

    次のコードサンプルを実行して、証明書を作成します。証明書の名前を選択します。ACCESS_KEY フィールドと SECRET フィールドは、前の手順で生成した値に置き換えます。

    osql -E -Q "
        CREATE CREDENTIAL [CREDENTIAL_NAME]
        WITH
            IDENTITY = 'S3 Access Key',
            SECRET = 'ACCESS_KEY:SECRET'
        "
    
  3. テストテーブルに行を追加します。

    osql -E -Q "insert into testdb.dbo.testtable ([status]) VALUES ('Initial')"
    
  4. Cloud Storage バケットに対して BACKUP オペレーションを実行します。

    Cloud Storage バケット URI を URL パラメータ値として設定し、以前に定義した証明書の名前を WITH CREDENTIAL オプションの値として設定したバックアップ データベース コマンドを実行します。このコマンドにより、SQL Server はバックアップ ファイルを作成し、同時に Cloud Storage バケットにアップロードできます。追加のローカル ディスク領域は必要ありません。

    osql -E -Q "
        BACKUP DATABASE testdb
        TO URL = 's3://storage.googleapis.com/BUCKET_NAME/FOLDER_NAME/testdb.bak'
        WITH
            CREDENTIAL = 'CREDENTIAL_NAME',
            FORMAT,
            STATS = 10,
            MAXTRANSFERSIZE = 10485760,
            BLOCKSIZE = 65536,
            COMPRESSION;
        "
    

WITH ステートメントのパラメータは以下のとおりです。

  • FORMAT: 既存のバックアップを上書きして新しいメディアセットを作成します。
  • STATS: SQL Server にバックアップの進行状況に関する情報を提供するよう指示します。
  • COMPRESSION: SQL Server にバックアップ ファイルを圧縮するよう指示します。これにより、Cloud Storage にアップロードする際に少量かつ高速になります。
  • MAXTRANSFERSIZE = 10485760BLOCKSIZE = 65536 オプションを使用すると、サイズの大きいバックアップ ファイルによる I/O デバイスエラーを回避できます。
  1. テストテーブルに行を追加します。

    osql -E -Q "insert into testdb.dbo.testtable ([status]) VALUES ('After Full Backup')"
    
  2. 差分バックアップを実行します。

    osql -E -Q "
        BACKUP DATABASE testdb
        TO URL = 's3://storage.googleapis.com/BUCKET_NAME/FOLDER_NAME/testdb-diff.bak'
        WITH
            DIFFERENTIAL,
            CREDENTIAL = 'CREDENTIAL_NAME',
            STATS = 10,
            MAXTRANSFERSIZE = 10485760,
            BLOCKSIZE = 65536,
            COMPRESSION;
        "
    
  3. テストテーブルに行を追加します。

    osql -E -Q "insert into testdb.dbo.testtable ([status]) VALUES ('After Diff Backup')"
    
  4. トランザクション ログのバックアップを実行します。

    osql -E -Q "
        BACKUP LOG testdb
        TO URL = 's3://storage.googleapis.com/BUCKET_NAME/FOLDER_NAME/testdb-log.bak'
        WITH
            CREDENTIAL = 'CREDENTIAL_NAME',
            STATS = 10,
            MAXTRANSFERSIZE = 10485760,
            BLOCKSIZE = 65536,
            COMPRESSION;
        "
    
  5. テストテーブルに行を追加します。

    osql -E -Q "insert into testdb.dbo.testtable ([status]) VALUES ('Bad Row')"
    
  6. テーブル内の行を確認します。

    osql -E -Q "select * from testdb.dbo.testtable"
    

    出力は次のようになります。

    Initial
    
    After Full Backup
    
    After Diff Backup
    
    Bad Row
    

バックアップの管理

このセクションでは、バックアップをリモートの Cloud Storage に保存します。また、古いバックアップを自動的に整理するように Cloud Storage バケットを構成し、バックアップのスケジュールを設定します。複数のデータベース サーバーを実行している場合は、Cloud Storage バケットでサーバーごとにディレクトリを作成することを検討してください。

Cloud Storage にバックアップをアップロードする

SQL Server 2019 以前

いくつかのバックアップ ファイルが作成されているので、バックアップを Cloud Storage にアップロードできます。

  1. Cloud Shell で、Cloud Storage バケットを作成します。バケット名は、Google Cloud 全体で重複しないようにする必要があります。バケット名が確実に重複しないようにするには、次のように、プロジェクト名を含む名前空間を設定してください。

    gsutil mb "gs://${DEVSHELL_PROJECT_ID}-sql-backups"
    
  2. RDP セッションのシェル ウィンドウで、Cloud Storage バケットにファイルをコピーします。次のコマンドで、BUCKET_NAME は作成したバケット名で置き換えます。

    gsutil cp -n c:\backup\testdb*.bak gs://BUCKET_NAME
    

    gsutil cp コマンドを使用すると、ディレクトリ構造全体を作成できます。また、一度に複数のファイルをアップロードすることもできます。

SQL Server 2022

SQL Server 2022 は Cloud Storage への直接バックアップをサポートしているため、バックアップ ファイルはすでにバケット上に存在します。

Cloud Storage に自動ファイル プルーニングを設定する

古いバックアップは、最終的には削除する必要があります。このプロセスを自動化するため、Cloud Storage にはライフサイクル管理メカニズムが用意されています。これにより、バックアップ ファイルのライフサイクルを管理できます。

バケット内のオブジェクトのライフサイクル管理を構成するには:

  1. Cloud Shell で、JSON ライフサイクル構成ファイルを作成します。このファイルで、30 日後にファイルを削除するように Cloud Storage に指示します。

    bash -c 'cat <<EOF >  lifecycle.json
    {
        "lifecycle": {
            "rule": [{
                "action": { "type": "Delete" },
                "condition": { "age": 30 }
            }]
        }
    }
    EOF'
    
  2. Cloud Storage バケットのライフサイクル構成を設定します。BUCKET_NAME は、実際のバケット名に置き換えます。

    gsutil lifecycle set lifecycle.json gs://BUCKET_NAME
    

バックアップのスケジュールを設定する

フル バックアップを定期的に実行し、次のフル バックアップまでに差分バックアップを実行することをおすすめします。Windows では、スケジュール タスクを使用してバックアップのスケジュールを設定できます。

一連のバックアップを取得するバックアップ スクリプトを作成する場合は、各ポイントに論理的な検証手順を含め、正常に完了しているかどうか確認する必要があります。検証で不合格だった場合にスクリプトが Windows のアラートを生成するようにします。 また、ローカル ディスクがいっぱいにならないように、Cloud Storage に正常にアップロードされたバックアップ ファイルをローカルから削除するようにします。

バックアップの復元

このセクションでは、Cloud Storage に保存したバックアップ ファイルから SQL Server データベースを復元します。

SQL Server 2019 以前

  1. RDP セッションの Cloud Shell で、Cloud Storage からバックアップ ファイルをダウンロードします。BUCKET_NAME は、SQL Server バックアップ ストレージ バケットの名前で置き換えます。

    gsutil cp gs://BUCKET_NAME/testdb*.bak c:\restore
    
  2. SQL Server 管理コンソールを開きます。

  3. [スタート] ボタンをクリックし、[Microsoft SQL Server Tools 18] > [Microsoft SQL Server Management Studio 18] の順にクリックします。

  4. [接続] フィールドはそのままにして、[接続] をクリックします。

  1. 左側のペインで、[データベース] を展開します。
  2. testdb を右クリックします。ポップアップ メニューで [タスク] > [復元] > [データベース] の順にクリックします。
  3. バックアップ ファイルをコンソールにインポートします。
    1. [ソース] で [デバイス] を選択します。
    2. [] ボタンをクリックします。
    3. 表示されたダイアログで [追加] をクリックし、C:\restore の下にあるすべてのファイルを選択して、[OK] をクリックします。
    4. [OK] をクリックします。
  4. ポイントインタイムの復元オプションを表示するには:

    1. [タイムライン] をクリックします。
    2. [復元先] で [特定の日付と時刻] をクリックします。
    3. [タイムラインの間隔] で [時間] を選択します。
    4. トランザクション ログのバックアップの範囲で時間を選択します。
    5. タイムライン画面を終了するには、[キャンセル] をクリックします。

  5. このチュートリアルでは、トランザクション ログをバックアップする前の状態にデータベースを復元します。このため、バックアップ リストでトランザクション ログの行をオフにします。

    バックアップ リストでトランザクション ログの行をオフにします。

  6. 復元プロセスを開始します。

    1. [OK] をクリックします。
    2. データベースの復元プロセスが完了するまで待ち、「Database 'testdb' restored successfully」というメッセージが表示されたら、[OK] をクリックします。
  7. テストテーブルの行を一覧表示します。

    osql -E -Q "select * from testdb.dbo.testtable;"
    

    出力には次の 2 行が表示されます。

    "Initial
    "After Full Backup"
    

    トランザクション ログのバックアップを作成する前にテーブルに挿入されたすべての行が表示されます。

SQL Server 2022

RESTORE オペレーションを実行できます。Cloud Storage ファイルのパスを URL パラメータ値として設定します。たとえば、次の T-SQL スクリプトは Cloud Storage から直接フル バックアップを復元します。

```
osql -E -Q "
RESTORE DATABASE testdb
FROM
    URL = 's3://storage.googleapis.com/BUCKET_NAME/FOLDER_NAME/testdb.bak'
WITH
    CREDENTIAL = 'CREDENTIAL_NAME';
    "
```
  1. SQL Server 管理コンソールを開きます。
  2. [スタート] ボタンをクリックし、[Microsoft SQL Server Tools 19] > [Microsoft SQL Server Management Studio 19] の順にクリックします。
  1. [接続] フィールドはそのままにして、[接続] をクリックします。
  1. 左側のペインで、[データベース] を展開します。
  2. testdb を右クリックします。ポップアップ メニューで [タスク] > [復元] > [データベース] の順にクリックします。
  3. バックアップ ファイルをコンソールにインポートします。

    1. [ソース] で [デバイス] を選択します。
    2. [] ボタンをクリックします。
    3. 表示されたダイアログで [バックアップ メディアの種類] をクリックし、[S3 URL] を選択します。
    4. 表示されたダイアログで [追加] をクリックします。Cloud Storage バケットのバックアップ ファイルの 3 つの場所と、証明書の作成時に指定したシークレット キーとアクセスキーを追加します。

    5. [OK] をクリックします。

  4. ポイントインタイムの復元オプションを表示するには:

    1. [タイムライン] をクリックします。
    2. [復元先] で [特定の日付と時刻] をクリックします。
    3. [タイムラインの間隔] で [時間] を選択します。
    4. トランザクション ログのバックアップの範囲で時間を選択します。
    5. タイムライン画面を終了するには、[キャンセル] をクリックします。

  5. このチュートリアルでは、トランザクション ログをバックアップする前の状態にデータベースを復元します。このため、バックアップ リストでトランザクション ログの行をオフにします。

    バックアップ リストでトランザクション ログの行をオフにします。

  6. 復元プロセスを開始します。

    1. [OK] をクリックします。
    2. データベースの復元プロセスが完了するまで待ち、「Database 'testdb' restored successfully」というメッセージが表示されたら、[OK] をクリックします。
  7. テストテーブルの行を一覧表示します。

    osql -E -Q "select * from testdb.dbo.testtable;"
    

    出力には次の 2 行が表示されます。

    "Initial
    "After Full Backup"
    

    トランザクション ログのバックアップを作成する前にテーブルに挿入されたすべての行が表示されます。

クリーンアップ

プロジェクトを削除する

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

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

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

次のステップ