データベースのメジャー バージョンをインプレースでアップグレードする

このページでは、データを移行するのではなく、Cloud SQL インスタンスをインプレース アップグレードでデータベースのメジャー バージョンのアップグレードを行う方法について説明します。

はじめに

データベース ソフトウェア プロバイダは、新機能、パフォーマンス改善、セキュリティ強化を含む新しいメジャー バージョンを定期的にリリースしています。Cloud SQL では、新しいバージョンがリリース後に取り込まれます。Cloud SQL で新しいメジャー バージョンのサポートが提供された後、インスタンスをアップグレードして、データベースを最新の状態に保つことができます。

インスタンスのデータベース バージョンをアップグレードするには、インプレース アップグレードまたはデータの移行を行います。インプレース アップグレードは、インスタンスのメジャー バージョンをアップグレードする最も簡単な方法です。データの移行や、アプリケーション接続文字列の変更は必要ありません。インプレース アップグレードを使用すると、アップグレード後も、現在のインスタンスの名前、IP アドレス、その他の設定を維持できます。インプレース アップグレードは、データファイルを移動する必要がないため、より短時間で完了できます。場合によっては、データの移行よりもダウンタイムが短くなります。

Cloud SQL for SQL Server インプレース アップグレード オペレーションは、SQL Server アップグレード インプレース ユーティリティを使用しています。

メジャー バージョン アップグレードの計画

  1. 対象のメジャー バージョンを選択します。

    Cloud SQL でサポートされているバージョンのリストをご覧ください。

  2. データベースの各メジャー バージョンで提供される機能を検討し、非互換性の問題を解決します。

    SQL Server で廃止された機能互換性を破る変更をご覧ください。

    新しいメジャー バージョンで互換性のない変更が導入され、アプリケーション コード、スキーマ、データベース設定の変更が必要になる場合があります。データベース インスタンスをアップグレードする前に、ターゲット メジャー バージョンのリリースノートで、対処の必要がある互換性の問題を確認してください。

  3. ドライランでアップグレードをテストします。

    本番環境データベースをアップグレードする前に、テスト環境でエンドツーエンドのアップグレード プロセスのドライランを実行します。インスタンスのクローンを作成して、アップグレード プロセスのテストに使用するデータをコピーします。

    アップグレードが正常に完了することを検証するだけでなく、アップグレードされたデータベースでアプリケーションが期待どおりに動作することをテストします。

  4. アップグレードのタイミングを決定します。

    アップグレード中は、インスタンスが一定期間使用できなくなります。データベース アクティビティが低い時間帯にアップグレードを行うように計画してください。

データベースのメジャー バージョンをインプレースでアップグレードする

アップグレードを開始すると、Cloud SQL は、最初にインスタンスの構成をチェックしてアップグレードの互換性を確認します。構成を確認すると、Cloud SQL は、インスタンスを利用不可にして、アップグレード前のバックアップを作成します。その後、アップグレードを実行し、インスタンスを使用可能にして、アップグレード後のバックアップを作成します。

コンソール

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

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

  2. インスタンスの [概要] ページを開くには、インスタンス名をクリックします。
  3. [編集] をクリックします。
  4. [インスタンスの情報] セクションで [アップグレード] ボタンをクリックし、アップグレード ページに移動します。
  5. [データベースのバージョンを選択] ページで [アップグレード後のデータベース バージョン] リストをクリックし、使用可能なデータベースのメジャー バージョンの 1 つを選択します。
  6. [次へ] をクリックします。
  7. [インスタンス ID] ボックスにインスタンスの名前を入力し、[アップグレードを開始] ボタンをクリックします。
処理が完了するまでに数分かかります。

アップグレード後のデータベースのメジャー バージョンが、インスタンスの概要ページのインスタンス名の下に表示されていることを確認します。

gcloud

  1. アップグレードを開始する

    gcloud sql instances patch コマンドに --database-version フラグを指定します。

    コマンドを実行する前に、次のように置き換えます。

    • INSTANCE_NAME: インスタンスの名前。
    • DATABASE_VERSION: データベースのメジャー バージョンの列挙型。これは、現在のバージョンより大きくする必要があります。利用可能なデータベース バージョンの列挙型をご覧ください。
    gcloud sql instances patch INSTANCE_NAME \
    --database-version=DATABASE_VERSION
    

    メジャー バージョンのアップグレードが完了するまで数分かかります。オペレーションに予想より時間がかかっていることを示すメッセージが表示される場合があります。このメッセージは無視するか、gcloud sql operations wait コマンドを実行してメッセージを閉じます。

  2. アップグレード オペレーション名を取得します。

    gcloud sql operations list コマンドに --instance フラグを指定します。

    コマンドを実行する前に、INSTANCE_NAME 変数をインスタンス名に置き換えます。

    gcloud sql operations list --instance=INSTANCE_NAME
    
  3. アップグレードのステータスをモニタリングします。

    gcloud sql operations describe コマンドを使用します。

    コマンドを実行する前に、OPERATION 変数を前の手順で取得したアップグレード オペレーション名に置き換えます。

    gcloud sql operations describe OPERATION
    

REST v1

  1. インプレース アップグレードを開始します。

    PATCH リクエストで instances:patch メソッドを使用します。

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

    • project_id: プロジェクトの ID。
    • instance_name: インスタンスの名前。

    HTTP メソッドと URL:

    POST https://sqladmin.googleapis.com/sql/v1/projects/project-id/instances/instance_name
    

    JSON 本文のリクエスト

    {
      "databaseVersion": enum DATABASE_VERSION
    }
    

    DATABASE_VERSION は、データベースのメジャー バージョンの列挙型に置き換えます。これは、現在のバージョンよりも大きいものにする必要があります。利用可能なデータベース バージョンの列挙型をご覧ください。

    curl または PowerShell を使用してリクエストを送信します。インスタンスの編集をご覧ください。

  2. アップグレード オペレーション名を取得します。

    project_id をプロジェクトの ID に置き換えて、operations.list メソッドを含む GET リクエストを送信します。

    HTTP メソッドと URL:

    GET https://sqladmin.googleapis.com/sql/v1/projects/project-id/operations
    
  3. アップグレードのステータスをモニタリングします。

    次の変数を置き換えて、operations.get メソッドを含む GET リクエストを送信します。

    • project_id: プロジェクトの ID。
    • operation_name: 前の手順で取得したアップグレード オペレーション名。

    HTTP メソッドと URL:

    GET https://sqladmin.googleapis.com/sql/v1/projects/project-id/operation/operation_name
    

Terraform

データベースのバージョンを更新するには、Terraform リソースと Google Cloud の Terraform プロバイダのバージョン 4.34.0 以降を使用します。

resource "google_sql_database_instance" "instance" {
  name             = "sqlserver-instance"
  region           = "us-central1"
  database_version = "SQLSERVER_2019_STANDARD"
  root_password    = "INSERT-PASSWORD-HERE"
  settings {
    tier = "db-custom-2-7680"
  }
  # 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

インプレース アップグレード リクエストを行うと、Cloud SQL はまずアップグレード前のチェックを行います。Cloud SQL でインスタンスのアップグレードの準備ができていないと判断された場合、アップグレード リクエストは失敗し、問題に対処する方法を提案するメッセージが表示されます。メジャー バージョン アップグレードのトラブルシューティングもご覧ください。

自動アップグレードのバックアップ

メジャー バージョン アップグレードを実行すると、Cloud SQL は 2 つのオンデマンド バックアップ(アップグレード バックアップ)を自動的に作成します。

  • 最初のアップグレード バックアップは、アップグレード前のバックアップで、アップグレードの直前に作成されます。このバックアップは、データベース インスタンスを以前のバージョンの状態に復元するために使用できます。
  • 2 番目のアップグレード バックアップは、アップグレード後のバックアップで、アップグレードされたデータベース インスタンスへの新しい書き込みが許可された直後に作成されます。

バックアップのリストを表示すると、On-demand タイプでアップグレード バックアップが一覧表示されます。アップグレード バックアップには、簡単に識別できるようにラベルが付いています。たとえば、SQL Server Enterprise 2017 から SQL Server Enterprise 2019 にアップグレードする場合、アップグレード前のバックアップには Pre-upgrade backup, SQLSERVER_2017_ENTERPRISE to SQLSERVER_2019_ENTERPRISE.、アップグレード後のバックアップには Post-upgrade backup, SQLSERVER_2019_ENTERPRISE from SQLSERVER_2017_ENTERPRISE. というラベルが付きます。

他のオンデマンド バックアップと同様に、アップグレード バックアップは、それを削除するかインスタンスを削除するまで残ります。

データベースの互換性レベルをアップグレードする

データベースの互換性レベルにより、アプリケーションに提供されるデータベースの動作が決まります。データベースの互換性レベルの設定は、以前のバージョンの SQL Server との下位互換性を維持します。これは、Transact-SQL と Query Optimizer の変更に関連しています。SQL Server インスタンスのデータベース バージョンをアップグレードすると、アプリケーションは引き続き最新バージョンの SQL Server で動作するように、既存のデータベースの互換性レベルが維持されます。互換性レベルをアップグレードすると、新機能、クエリ処理の機能強化、その他の変更を利用できます。

インスタンスのデータベース エンジン バージョンをアップグレードした後、データベースを使用するアプリケーションの準備ができたら、インスタンス内の各データベースのデータベース互換性レベルをアップグレードします。互換性レベルを最新に設定すると、データベースが最新の機能にアップグレードされ、パフォーマンスが向上します。

データベースの互換性レベルをアップグレードするには、次の手順を行います。

  1. データベースの現在の互換性レベルを確認します。

    たとえば、SQL Server 2017 の場合、デフォルトの互換性レベルは 140 です。データベースの現在の互換性レベルを確認するには、SQL Server インスタンス上の DATABASE_NAME をデータベースの名前に置き換えてから、

    Transact-SQL で次のコマンドを実行します。

    USE DATABASE_NAME
    GO
    SELECT compatibility_level
    FROM sys.databases WHERE name = 'DATABASE_NAME'
    
  2. ターゲットの互換性レベルを確認します。

    アップグレード後のデータベース バージョンのデフォルトの互換性レベルを確認して、データベースのターゲット互換性レベルを決定します。たとえば、SQL Server 2022 の場合、デフォルトの互換性レベルは 160 です。SQL Server の新しいバージョンと互換性レベルの対応表をご覧ください。

  3. 現在の互換性レベルとターゲット互換性レベルの違いを評価します。

    互換性レベルをアップグレードする前に、現在の互換性レベルとターゲット互換性レベルでのシステムの動作の違いを確認します。互換性レベルの違いの一覧をご覧ください。

  4. ワークロード データのベースラインを収集します。

    互換性レベルをアップグレードする前に、SQL Server クエリストアを使用してワークロード データのベースラインを収集し、後で回帰クエリを特定して対処できるようにします。クエリストアを使用してクエリとプランを取得し、通常のビジネス サイクルのパフォーマンス ベースラインを確立します。ガイド付きのワークフローの場合は、SQL Server Management Studio のクエリ調整アシスタント機能を使用します。

  5. 互換性レベルをアップグレードします。

    データベースの互換性レベルを変更するには、SQL Server インスタンス上の DATABASE_NAME をデータベースの名前に、

    TARGET_COMPATIBILITY_LEVEL をターゲット互換性レベルに置き換えてから、Transact-SQL で次のコマンドを実行します。

    ALTER DATABASE DATABASE_NAME
    SET COMPATIBILITY_LEVEL = TARGET_COMPATIBILITY_LEVEL;
    GO
    
  6. アップグレードされたワークロード データを収集します。

    クエリストアを使用して、アップグレードされたワークロード データを収集し、比較と回帰検出で使用します。

  7. 回帰されたクエリを解決します。

    ほとんどの部分で、アップグレードされた互換性レベルのクエリ オプティマイザの変更により、パフォーマンスは向上します。ただし、特定のクエリではパフォーマンスが低下する場合があります。クエリストアの回帰クエリ機能は、回帰されたクエリを識別し、最後に確認された正常なクエリプランを適用するのに役立ちます。SQL Server にはプランの自動修正機能もあります。この機能を使用すると、クエリ回帰が発生した場合に、最後に確認された正常なプランに自動的に切り替えることができます。

メジャー バージョン アップグレードを実行する

プライマリ インスタンスをアップグレードしたら、受け入れテストを行い、アップグレード後のシステムが想定どおり動作することを確認します。

メジャー バージョン アップグレードのトラブルシューティング

無効なアップグレード コマンド(インスタンスに新しいバージョンの無効なデータベース フラグが含まれている場合など)を試行すると、Cloud SQL はエラー メッセージを返します。

アップグレード リクエストが失敗した場合は、アップグレード リクエストの構文を確認してください。リクエストに有効な構造がある場合は、次の推奨事項を確認してください。

アップグレード ログを表示する

有効なアップグレード リクエストでエラーが発生した場合、Cloud SQL はエラーログを projects/PROJECT_ID/logs/cloudsql.googleapis.com%2Fsqlserver.err に公開します。各ログエントリには、インスタンス ID のラベルが付いているため、アップグレード エラーが発生したインスタンスを識別できます。このようなアップグレード エラーを見つけて解決します。

エラーログを表示するには、次の手順を行います。

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

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

  2. インスタンスの [概要] ページを開くには、インスタンス名をクリックします。
  3. インスタンスの [概要] ページの [オペレーションとログ] ペインで、[View SQL Server error logs] リンクをクリックします。

    [ログ エクスプローラ] ページが開きます。

  4. 次のようにログを表示します。

    • プロジェクト内のエラーログすべてを一覧表示するには、ログ名を選択して、ログ名でフィルタリングします。

    クエリフィルタの詳細については、高度なクエリをご覧ください。

    • 単一のインスタンスのアップグレード エラーログをフィルタリングするには、DATABASE_ID を次のように置き換えてから、[すべてのフィールドを検索] ボックスに次のクエリを入力します。

    プロジェクト ID に置き換え、その後に project_id:instance_name という形式のインスタンス名を続けます。

    resource.type="cloudsql_database"
    resource.labels.database_id="DATABASE_ID"
    logName : "projects/PROJECT_ID/logs/cloudsql.googleapis.com%2Fsqlserver.err"
    

    たとえば、プロジェクト buylots で実行されている shopping-db という名前のインスタンスでアップグレード エラーログをフィルタリングするには、次のクエリフィルタを使用します。

     resource.type="cloudsql_database"
     resource.labels.database_id="buylots:shopping-db"
     logName : "projects/buylots/logs/cloudsql.googleapis.com%2Fsqlserver.err"
     ```
    

以前のメジャー バージョンに戻す

アップグレードしたデータベース システムが期待どおりに機能しない場合は、インスタンスを以前のバージョンに復元しなければならないことがあります。その場合は、アップグレード前のバックアップを Cloud SQL のリカバリ インスタンスに復元します。これは、アップグレード前のバージョンを実行する新しいインスタンスです。

以前のバージョンに復元する手順は次のとおりです。

  1. アップグレード前のバックアップを特定します。

    自動アップグレード バックアップをご覧ください。

  2. 復元インスタンスを作成します。

    アップグレード前のバックアップの作成時に Cloud SQL で実行されていたメジャー バージョンを使用して、新しい Cloud SQL インスタンスを作成します。元のインスタンスと同じフラグインスタンスの設定を使用します。

  3. アップグレード前のバックアップを復元します。

    アップグレード前のバックアップをリカバリ インスタンスに復元します。完了には数分かかる場合があります。

  4. リードレプリカを追加します。

    複数のリードレプリカを使用していた場合は、それらを個別に追加します。

  5. アプリケーションを接続します。

    データベース システムをリカバリしたら、リカバリ インスタンスとそのリードレプリカの詳細でアプリケーションを更新します。アップグレード前のバージョンのデータベースでトラフィックの処理を再開できます。

よくある質問

データベースのメジャー バージョンをアップグレードするときは、次のような疑問が生じることがあります。

アップグレード中はインスタンスを使用できませんか?
はい。Cloud SQL がアップグレードを実行する間、インスタンスは一定期間使用できません。
アップグレードにはどれくらい時間がかかりますか?

通常、1 つのインスタンスのアップグレードには 10 分もかかりません。インスタンス構成で使用されている vCPU またはメモリが少ない場合、アップグレードに時間がかかることがあります。

インスタンスでホストされているデータベースやテーブルが多すぎる場合や、データベースが非常に大きい場合は、アップグレードに数時間がかかったりタイムアウトになることがあります。これは、アップグレード時間がデータベース内のオブジェクト数と対応するためです。アップグレードが必要なインスタンスが複数ある場合は、それに比例してアップグレードの合計時間が長くなります。

アップグレード プロセスの各ステップをモニタリングできますか?
Cloud SQL ではアップグレード オペレーションが進行中かどうかモニタリングできますが、アップグレードの個々のステップを追跡することはできません。
開始後にアップグレードをキャンセルできますか?
いいえ、アップグレードを開始すると、キャンセルはできません。アップグレードに失敗すると、Cloud SQL は以前のバージョンのインスタンスを自動的に復元します。
アップグレード中に設定はどうなりますか?

インプレースのメジャー バージョン アップグレードを実行すると、Cloud SQL はインスタンス名、IP アドレス、明示的に構成されたフラグ値、ユーザーデータなどのデータベース設定を保持します。ただし、システム変数のデフォルト値は変更されることがあります。

詳細については、データベース フラグを構成するをご覧ください。特定のフラグまたは値がターゲット バージョンでサポートされなくなった場合、Cloud SQL はアップグレード中にフラグを自動的に削除します。

次のステップ