ポイントインタイム リカバリ(PITR)を使用する

このページでは、ポイントインタイム リカバリ(PITR)を使用してプライマリ Cloud SQL インスタンスを復元する方法について説明します。

PITR の詳細については、PITR をご覧ください。

デフォルトでは、Google Cloud コンソール、gcloud CLI、Terraform、Cloud SQL Admin API のいずれを使用してインスタンスを作成した場合でも、Cloud SQL Enterprise Plus エディションのインスタンスを作成するときに PITR が有効になります。

Google Cloud コンソールで Cloud SQL Enterprise エディションのインスタンスを作成する場合、PITR はデフォルトで有効になります。それ以外の場合、gcloud CLI、Terraform、または Cloud SQL Admin API を使用してインスタンスを作成するときには、PITR を手動で有効にする必要があります。

PITR 用のログストレージ

Cloud SQL は、PITR に write-ahead log 書き込み(WAL)のアーカイブを使用します。

2023 年 1 月 9 日、Google は、PITR 用 write-ahead log の Cloud Storage への保存を開始しました。このリリース以降、次の条件が適用されます。

  • すべての Cloud SQL Enterprise Plus エディションのインスタンスは、write-ahead log を Cloud Storage に保存します。2023 年 1 月 9 日より前に Cloud SQL Enterprise エディションからアップグレードし、PITR を有効にした Cloud SQL Enterprise Plus エディションのインスタンスのみが、引き続きログをディスクに保存します。
  • 2023 年 1 月 9 日より前に PITR を有効にして作成された Cloud SQL Enterprise エディションのインスタンスは、引き続きログをディスクに保存します。
  • 2023 年 1 月 9 日以降に PITR を有効にして作成したすべての Cloud SQL Enterprise エディションのインスタンスは、Cloud Storage にログを保存します。

ディスクにのみ write-ahead log を保存するインスタンスの場合、まず PITR を無効にしてから再度有効にすることで、ログをディスクから Cloud Storage に移動できます。

ログの保持期間

インスタンスが PITR に使用されるログを Cloud Storage に保存しているかどうかを確認するには、PITR に使用されるトランザクション ログの保存場所を確認するを使用します。

psqlpgAdmin などの PostgreSQL クライアントを使用してインスタンスのデータベースに接続したら、show archive_command を実行します。Write-ahead log が Cloud Storage にアーカイブされている場合は、-async_archive -remote_storage が表示されます。

PITR が有効になっている他のすべての既存のインスタンスでは、引き続きログがディスクに保存されます。Cloud Storage にログを保存するようにする変更は、のちほど利用可能になります。

ログが Cloud Storage に保存されている場合、Cloud SQL は 5 分以内ごとにログをアップロードします。その結果、Cloud SQL インスタンスが利用可能な場合、インスタンスを直近の時間に復元できます。ただし、インスタンスが利用できない場合、目標復旧時点は通常 5 分以内です。gcloud CLI または Admin API を使用して、インスタンスを復元し、その時点までの復元を実行できる直近の時間を確認します。

PITR で使用される write-ahead log は、関連する自動バックアップによって自動的に削除されます。この削除は通常、transactionLogRetentionDays に設定された値に達すると行われます。これは、Cloud SQL が PITR のために保持するトランザクション ログの日数です。Cloud SQL Enterprise Plus エディションの場合、保持されるトランザクション ログの日数は 1~35 に設定できます。Cloud SQL Enterprise エディションの場合、値は 1~7 に設定できます。

PITR を有効にする前に Cloud SQL インスタンスでバックアップを復元すると、PITR の運用を可能にする write-ahead log が失われます。

顧客管理の暗号鍵(CMEK)対応のインスタンスの場合、write-ahead log は最新バージョンの CMEK を使用して暗号化されます。復元を実施するには、retained-transaction-log-days パラメータで構成した日数内で最も新しい鍵のすべてのバージョンが利用可能である必要があります。

write-ahead log が Cloud Storage に保存されているインスタンスの場合、ログはプライマリ インスタンスと同じリージョンに保存されます。このログストレージ(Cloud SQL Enterprise Plus エディションでは最大 35 日間、Cloud SQL Enterprise エディションでは最大 7 日間、PRTR の最大時間)では、インスタンスごとの追加コストは発生しません。

ログとディスクの使用状況

インスタンスで PITR が有効になっていて、ディスク上の write-ahead log のサイズが原因でインスタンスに問題が発生している場合は、以下のようにします。

  • PITR を無効にして再度有効にすると、新しいログがインスタンスと同じリージョンの Cloud Storage に保存されるようになります。ただし、既存の write-ahead log は削除されるため、PITR を再度有効にした時点よりも前のポイントインタイム リカバリを行うことはできません。

  • インスタンスのストレージ サイズを増やすことはできますが、ディスク使用量の write-ahead log のサイズが大きくなるのはあくまで一時的です。

  • 予期しないストレージの問題を避けるため、ストレージの自動増量を有効にすることをおすすめします。この推奨事項は、インスタンスで PITR が有効になっていて、ログがディスクに保存されている場合にのみ適用されます。

  • ログを削除してストレージを復元する場合は、PRTR を無効にします。ただし、使用する write-ahead log を減らしても、インスタンスにプロビジョニングされたディスクのサイズは縮小されません。

  • ログは継続的ではなく、1 日 1 回削除されます。ログの保持期間を 2 日に設定すると、少なくとも 2 日間、最大で 3 日間のログが保持されます。指定した日数分のログの保持を保証するために、バックアップの日数は、ログを保持する日数よりも 1 日長く設定することをおすすめします。

PITR を有効にする

Google Cloud コンソールで新しいインスタンスを作成すると、[自動バックアップ] と [ポイントインタイム リカバリを有効にする] の両方が自動的に有効になります。

次の手順では、既存のプライマリ インスタンスで PITR を有効にします。

コンソール

  1. Google Cloud コンソールで Cloud SQL の [インスタンス] ページに移動します。

    Cloud SQL の [インスタンス] に移動

  2. PITR を有効にするインスタンスの [その他の操作] メニュー その他の操作アイコン を開き、[編集] をクリックします。
  3. [インスタンスのカスタマイズ] で、[データ保護] セクションを開きます。
  4. [ポイントインタイム リカバリを有効にする] チェックボックスをオンにします。
  5. [詳細オプション] を開きます。
  6. ログを保持する日数を Cloud SQL Enterprise Plus エディションの場合は 1~35、Cloud SQL Enterprise エディションの場合は 1~7 で指定します。
  7. [保存] をクリックします。

gcloud

  1. インスタンスの概要を表示します。
    gcloud sql instances describe INSTANCE_NAME
    
  2. backupConfiguration セクションに enabled: false が表示されている場合は、スケジュール バックアップを有効にします。
    gcloud sql instances patch INSTANCE_NAME \
    --backup-start-time=HH:MM
    

    backup-start-time パラメータを UTC±00 タイムゾーンの 24 時間形式で指定します。

  3. PITR を有効にします。
    gcloud sql instances patch INSTANCE_NAME \
    --enable-point-in-time-recovery
    

    プライマリ インスタンスで PITR を有効にする場合は、次のパラメータを追加して、トランザクション ログの保持日数を構成することもできます。

    --retained-transaction-log-days=RETAINED_TRANSACTION_LOG_DAYS
    
  4. 変更を確定します。
    gcloud sql instances describe INSTANCE_NAME

    変更が成功すると、backupConfiguration セクションに pointInTimeRecoveryEnabled: true が表示されます。

Terraform

PITR を有効にするには、Terraform リソースを使用します。

resource "google_sql_database_instance" "postgres_instance_pitr" {
  name             = ""
  region           = "us-central1"
  database_version = "POSTGRES_14"
  settings {
    tier = "db-custom-2-7680"
    backup_configuration {
      enabled                        = true
      point_in_time_recovery_enabled = true
      start_time                     = "20:55"
      transaction_log_retention_days = "3"
    }
  }
  # set `deletion_protection` to true, will ensure that one cannot accidentally delete this instance by
  # use of Terraform whereas `deletion_protection_enabled` flag protects this instance at the GCP level.
  deletion_protection = false
}

変更を適用する

Google Cloud プロジェクトで Terraform 構成を適用するには、次のセクションの手順を完了します。

Cloud Shell を準備する

  1. Cloud Shell を起動します。
  2. Terraform 構成を適用するデフォルトの Google Cloud プロジェクトを設定します。

    このコマンドは、プロジェクトごとに 1 回だけ実行する必要があります。これは任意のディレクトリで実行できます。

    export GOOGLE_CLOUD_PROJECT=PROJECT_ID

    Terraform 構成ファイルに明示的な値を設定すると、環境変数がオーバーライドされます。

ディレクトリを準備する

Terraform 構成ファイルには独自のディレクトリ(ルート モジュールとも呼ばれます)が必要です。

  1. Cloud Shell で、ディレクトリを作成し、そのディレクトリ内に新しいファイルを作成します。ファイルの拡張子は .tf にする必要があります(例: main.tf)。このチュートリアルでは、このファイルを main.tf とします。
    mkdir DIRECTORY && cd DIRECTORY && touch main.tf
  2. チュートリアルを使用している場合は、各セクションまたはステップのサンプルコードをコピーできます。

    新しく作成した main.tf にサンプルコードをコピーします。

    必要に応じて、GitHub からコードをコピーします。Terraform スニペットがエンドツーエンドのソリューションの一部である場合は、この方法をおすすめします。

  3. 環境に適用するサンプル パラメータを確認し、変更します。
  4. 変更を保存します。
  5. Terraform を初期化します。これは、ディレクトリごとに 1 回だけ行います。
    terraform init

    最新バージョンの Google プロバイダを使用する場合は、-upgrade オプションを使用します。

    terraform init -upgrade

変更を適用する

  1. 構成を確認して、Terraform が作成または更新するリソースが想定どおりであることを確認します。
    terraform plan

    必要に応じて構成を修正します。

  2. 次のコマンドを実行します。プロンプトで「yes」と入力して、Terraform 構成を適用します。
    terraform apply

    Terraform に「Apply complete!」というメッセージが表示されるまで待ちます。

  3. Google Cloud プロジェクトを開いて結果を表示します。Google Cloud コンソールの UI でリソースに移動して、Terraform によって作成または更新されたことを確認します。

変更を削除する

変更を削除するには、次の手順を行います。

  1. 削除の保護を無効にするには、Terraform 構成ファイルで deletion_protection 引数を false に設定します。
    deletion_protection =  "false"
  2. 次のコマンドを実行します。プロンプトで「yes」と入力して、更新された Terraform 構成を適用します。
    terraform apply
  1. 次のコマンドを実行します。プロンプトで「yes」と入力して、以前に Terraform 構成で適用されたリソースを削除します。

    terraform destroy

REST v1

リクエストのデータを使用する前に、次のように置き換えます。

  • PROJECT_ID: インスタンスが含まれている Google Cloud プロジェクトの ID またはプロジェクト番号
  • INSTANCE_NAME: 高可用性を構成するプライマリまたはリードレプリカ インスタンスの名前
  • START_TIME: 時刻(HH:MM 形式)

HTTP メソッドと URL:

PATCH https://sqladmin.googleapis.com/v1/projects/PROJECT_ID/instances/INSTANCE_NAME

リクエストの本文(JSON):

{
  "settings":
  {
    "backupConfiguration":
    {
      "startTime": "START_TIME",
      "enabled": true,
      "pointInTimeRecoveryEnabled": true
    }
  }
}

リクエストを送信するには、次のいずれかのオプションを展開します。

次のような JSON レスポンスが返されます。

REST v1beta4

リクエストのデータを使用する前に、次のように置き換えます。

  • PROJECT_ID: インスタンスが含まれている Google Cloud プロジェクトの ID またはプロジェクト番号
  • INSTANCE_NAME: 高可用性を構成するプライマリまたはリードレプリカ インスタンスの名前
  • START_TIME: 時刻(HH:MM 形式)

HTTP メソッドと URL:

PATCH https://sqladmin.googleapis.com/sql/v1beta4/projects/PROJECT_ID/instances/INSTANCE_NAME

リクエストの本文(JSON):

{
  "settings":
  {
    "backupConfiguration":
    {
      "startTime": "START_TIME",
      "enabled": true,
      "pointInTimeRecoveryEnabled": true
    }
  }
}

リクエストを送信するには、次のいずれかのオプションを展開します。

次のような JSON レスポンスが返されます。

最新の復旧時間を取得する

使用可能なインスタンスについては、最新の時刻まで PITR を実行できます。インスタンスが使用不能になり、インスタンス ログが Cloud Storage に保存されている場合、最新の復旧時間を取得して、その時点までの PITR を実行できます。どちらの場合も、優先ゾーンの値を指定してインスタンスを別のゾーンに復元できます。

gcloud

使用不能な Cloud SQL インスタンスを復元できる最新の時刻を取得します。

INSTANCE_NAME は、クエリ対象のインスタンスの名前に置き換えます。

gcloud sql instances get-latest-recovery-time INSTANCE_NAME

REST v1

リクエストのデータを使用する前に、次のように置き換えます。

  • PROJECT_ID: プロジェクト ID
  • INSTANCE_NAME: 最新の復元時間をクエリするインスタンスの名前

HTTP メソッドと URL:

GET https://sqladmin.googleapis.com/v1/projects/PROJECT_ID/instances/INSTANCE_NAME/getLatestRecoveryTime

リクエストを送信するには、次のいずれかのオプションを展開します。

次のような JSON レスポンスが返されます。

{
  "kind": "sql#getLatestRecoveryTime",
  "latestRecoveryTime": "2023-06-20T17:23:59.648821586Z"
}

REST v1beta4

リクエストのデータを使用する前に、次のように置き換えます。

  • PROJECT_ID: プロジェクト ID
  • INSTANCE_NAME: 最新の復元時間をクエリするインスタンスの名前

HTTP メソッドと URL:

GET https://sqladmin.googleapis.com/sql/v1beta4/projects/PROJECT_ID/instances/INSTANCE_NAME/getLatestRecoveryTime

リクエストを送信するには、次のいずれかのオプションを展開します。

次のような JSON レスポンスが返されます。

{
  "kind": "sql#getLatestRecoveryTime",
  "latestRecoveryTime": "2023-06-20T17:23:59.648821586Z"
}

PITR を実行する

コンソール

  1. Google Cloud コンソールで Cloud SQL の [インスタンス] ページに移動します。

    Cloud SQL の [インスタンス] に移動

  2. 復元するインスタンスの [その他の操作] メニュー その他の操作アイコン を開き、[クローンを作成] をクリックします。
  3. 必要に応じて、[クローンの作成] ページで新しいクローンの ID を更新します。
  4. [過去の時点からクローンを作成] を選択します。
  5. PITR の時間を入力します。
  6. [クローンを作成] をクリックします。

gcloud

PITR を使用してクローンを作成します。

次のように置き換えます。

  • SOURCE_INSTANCE_NAME - 復元元のインスタンスの名前。
  • NEW_INSTANCE_NAME - クローンの名前。
  • TIMESTAMP - ソース インスタンスの UTC タイムゾーン(RFC 3339 形式)。例: 2012-11-15T16:19:00.094Z
gcloud sql instances clone SOURCE_INSTANCE_NAME \
NEW_INSTANCE_NAME \
--point-in-time 'TIMESTAMP'

REST v1

リクエストのデータを使用する前に、次のように置き換えます。

  • project-id: プロジェクト ID
  • target-instance-id: ターゲット インスタンス ID
  • source-instance-id: ソース インスタンス ID
  • restore-timestamp: 復元の終点となるポイントインタイム

HTTP メソッドと URL:

POST https://sqladmin.googleapis.com/v1/projects/project-id/instances/source-instance-id/clone

リクエストの本文(JSON):

{
  "cloneContext":
  {
    "kind": "sql#cloneContext",
    "destinationInstanceName": "target-instance-id",
    "pointInTime": "restore-timestamp"
  }
}

リクエストを送信するには、次のいずれかのオプションを展開します。

次のような JSON レスポンスが返されます。

REST v1beta4

リクエストのデータを使用する前に、次のように置き換えます。

  • project-id: プロジェクト ID
  • target-instance-id: ターゲット インスタンス ID
  • source-instance-id: ソース インスタンス ID
  • restore-timestamp: 復元の終点となるポイントインタイム

HTTP メソッドと URL:

POST https://sqladmin.googleapis.com/sql/v1beta4/projects/project-id/instances/source-instance-id/clone

リクエストの本文(JSON):

{
  "cloneContext":
  {
    "kind": "sql#cloneContext",
    "destinationInstanceName": "target-instance-id",
    "pointInTime": "restore-timestamp"
  }
}

リクエストを送信するには、次のいずれかのオプションを展開します。

次のような JSON レスポンスが返されます。

PITR を無効にする

コンソール

  1. Google Cloud コンソールで Cloud SQL の [インスタンス] ページに移動します。

    Cloud SQL の [インスタンス] に移動

  2. 無効にするインスタンスの [その他の操作] メニュー その他の操作アイコン を開き、[編集] を選択します。
  3. [インスタンスのカスタマイズ] で、[データ保護] セクションを開きます。
  4. [ポイントインタイム リカバリを有効にする] をクリアします。
  5. [保存] をクリックします。
  6. インスタンスの [概要] ページの [構成] で、PITR の設定が無効と表示されます。

gcloud

  1. ポイントインタイム リカバリを無効にします。
    gcloud sql instances patch INSTANCE_NAME \
    --no-enable-point-in-time-recovery
  2. 変更を確定します。
    gcloud sql instances describe INSTANCE_NAME
    

    変更が成功すると、backupConfiguration セクションに pointInTimeRecoveryEnabled: false が表示されます。

REST v1

リクエストのデータを使用する前に、次のように置き換えます。

  • project-id: プロジェクト ID
  • instance-id: インスタンス ID

HTTP メソッドと URL:

PATCH https://sqladmin.googleapis.com/v1/projects/project-id/instances/instance-id

リクエストの本文(JSON):

{
  "settings":
  {
    "backupConfiguration":
    {
      "enabled": false,
      "pointInTimeRecoveryEnabled": false
    }
  }
}

リクエストを送信するには、次のいずれかのオプションを展開します。

次のような JSON レスポンスが返されます。

REST v1beta4

リクエストのデータを使用する前に、次のように置き換えます。

  • project-id: プロジェクト ID
  • instance-id: インスタンス ID

HTTP メソッドと URL:

PATCH https://sqladmin.googleapis.com/sql/v1beta4/projects/project-id/instances/instance-id

リクエストの本文(JSON):

{
  "settings":
  {
    "backupConfiguration":
    {
      "enabled": false,
      "pointInTimeRecoveryEnabled": false
    }
  }
}

リクエストを送信するには、次のいずれかのオプションを展開します。

次のような JSON レスポンスが返されます。

PITR に使用されるトランザクション ログの保存場所を確認する

Cloud SQL インスタンスが PITR に使用されるトランザクション ログを保存する場所を確認できます。

gcloud

インスタンスが PITR のログをディスクに保存するか、または Cloud Storage に保存するかを確認するには、次のコマンドを使用します。

   gcloud sql instances describe INSTANCE_NAME
   

INSTANCE_NAME は、インスタンス名で置き換えます。

コマンドの出力で、そのインスタンスでの PITR のトランザクション ログが保存されている場所に関する情報が、transactionalLogStorageState フィールドに示されます。トランザクション ログの保存状態には、次のようなものがあります。

  • DISK: インスタンスは、PITR に使用されるトランザクション ログをディスクに保存します。
  • CLOUD_STORAGE: インスタンスは、PITR に使用されるトランザクション ログを Cloud Storage に保存します。

トランザクション ログの保持を設定する

write-ahead log を保持する日数を設定するには:

コンソール

  1. Google Cloud コンソールで Cloud SQL の [インスタンス] ページに移動します。

    Cloud SQL の [インスタンス] に移動

  2. トランザクション ログを設定するインスタンスの [その他の操作] メニュー その他の操作アイコン を開き、[編集] を選択します。
  3. [インスタンスのカスタマイズ] で、[データ保護] セクションを開きます。
  4. [ポイントインタイム リカバリを有効にする] セクションで、[詳細オプション] を開きます。
  5. ログを保持する日数を Cloud SQL Enterprise Plus エディションの場合は 1~35、Cloud SQL Enterprise エディションの場合は 1~7 で指定します。
  6. [保存] をクリックします。

gcloud

インスタンスを編集して、ログ先行書き込みログを保持する日数を設定します。

次のように置き換えます。

  • INSTANCE-NAME - トランザクション ログを有効にするインスタンスの名前。
  • DAYS-TO-RETAIN - トランザクション ログの保持日数。Cloud SQL Enterprise Plus エディションの場合、有効な範囲は 1~35 日で、デフォルトは 14 日です。Cloud SQL Enterprise エディションの場合、有効な範囲は 1~7 日で、デフォルトは 7 日です。値が指定されていない場合は、デフォルト値が使用されます。PITR が有効になっている場合にのみ有効です。トランザクション ログをより長期間保持するには、より大きなストレージ サイズが必要になります。

  gcloud sql instances patch INSTANCE-NAME \
    --retained-transaction-log-days=DAYS-TO-RETAIN
  

REST v1

リクエストのデータを使用する前に、次のように置き換えます。

  • days-to-retain: トランザクション ログの保持日数(1~7)
  • project-id: プロジェクト ID
  • instance-id: インスタンス ID

HTTP メソッドと URL:

PATCH https://sqladmin.googleapis.com/v1/projects/project-id/instances/instance-id

リクエストの本文(JSON):

{
  "settings":
  {
    "backupConfiguration":
    {
      "transactionLogRetentionDays": "days-to-retain"
    }
  }
}

リクエストを送信するには、次のいずれかのオプションを展開します。

次のような JSON レスポンスが返されます。

REST v1beta4

リクエストのデータを使用する前に、次のように置き換えます。

  • days-to-retain: トランザクション ログの保持日数(1~7)
  • project-id: プロジェクト ID
  • instance-id: インスタンス ID

HTTP メソッドと URL:

PATCH https://sqladmin.googleapis.com/sql/v1beta4/projects/project-id/instances/instance-id

リクエストの本文(JSON):

{
  "settings":
  {
    "backupConfiguration":
    {
      "transactionLogRetentionDays": "days-to-retain"
    }
  }
}

リクエストを送信するには、次のいずれかのオプションを展開します。

次のような JSON レスポンスが返されます。

次のステップ