このページでは、データを移行するのではなく、Cloud SQL インスタンスをインプレース アップグレードでデータベースのメジャー バージョンのアップグレードを行う方法について説明します。
はじめに
データベース ソフトウェア プロバイダは、新機能、パフォーマンス改善、セキュリティ強化を含む新しいメジャー バージョンを定期的にリリースしています。Cloud SQL では、新しいバージョンがリリース後に取り込まれます。Cloud SQL で新しいメジャー バージョンのサポートが提供された後、インスタンスをアップグレードして、データベースを最新の状態に保つことができます。
インスタンスのデータベース バージョンをアップグレードするには、インプレース アップグレードまたはデータの移行を行います。インプレース アップグレードは、インスタンスのメジャー バージョンをアップグレードするためのより簡単な方法です。データの移行や、アプリケーション接続文字列の変更は必要ありません。インプレース アップグレードを使用すると、アップグレード後も、現在のインスタンスの名前、IP アドレス、その他の設定を維持できます。インプレース アップグレードは、データファイルを移動する必要がないため、より短時間で完了できます。場合によっては、データの移行よりもダウンタイムが短くなります。
Cloud SQL for PostgreSQL のインプレース アップグレードでは、pg_upgrade
ユーティリティを使用します。メジャー バージョン アップグレードの計画
対象のメジャー バージョンを選択します。
gcloud
gcloud CLI のインストールと開始については、gcloud CLI をインストールするをご覧ください。Cloud Shell の起動については、Cloud Shell を使用するをご覧ください。
インスタンスでインプレース アップグレードのターゲットに指定できるデータベース バージョンを確認するには、次の操作を行います。
- 次のコマンドを実行します。
- コマンドの出力で、
upgradableDatabaseVersions
というラベルが付いたセクションを見つけます。 - 各サブセクションは、アップグレードに使用できるデータベース バージョンを返します。各サブセクションで、次のフィールドを確認します。
majorVersion
: インプレース アップグレードのターゲットに指定できるメジャー バージョン。name
: メジャー バージョンを含むデータベース バージョン文字列。displayName
: データベース バージョンの表示名。
gcloud sql instances describe INSTANCE_NAME
INSTANCE_NAME は、インスタンス名で置き換えます。
REST v1
メジャー バージョンのインプレース アップグレードに使用できるターゲット データベース バージョンを確認するには、Cloud SQL Admin API の
instances.get
メソッドを使用します。リクエストのデータを使用する前に、次のように置き換えます。
- INSTANCE_NAME: インスタンス名。
HTTP メソッドと URL:
GET https://sqladmin.googleapis.com/v1/projects/PROJECT_ID/instances/INSTANCE_NAME
リクエストを送信するには、次のいずれかのオプションを展開します。
次のような JSON レスポンスが返されます。
upgradableDatabaseVersions: { major_version: "POSTGRES_15_0" name: "POSTGRES_15_0" display_name: "PostgreSQL 15.0" }
REST v1beta4
インスタンスのメジャー バージョンのインプレース アップグレードに使用できるターゲット データベース バージョンを確認するには、Cloud SQL Admin API の
instances.get
メソッドを使用します。リクエストのデータを使用する前に、次のように置き換えます。
- INSTANCE_NAME: インスタンス名。
HTTP メソッドと URL:
GET https://sqladmin.googleapis.com/sql/v1beta4/projects/PROJECT_ID/instances/INSTANCE_NAME
リクエストを送信するには、次のいずれかのオプションを展開します。
次のような JSON レスポンスが返されます。
upgradableDatabaseVersions: { major_version: "POSTGRES_15_0" name: "POSTGRES_15_0" display_name: "PostgreSQL 15.0" }
Cloud SQL がサポートしているデータベース バージョンの一覧については、データベースのバージョンとバージョン ポリシーをご覧ください。
データベースの各メジャー バージョンで提供される機能を検討し、非互換性の問題を解決します。
- PostgreSQL 17
- PostgreSQL 16
- PostgreSQL 15
- PostgreSQL 14
- PostgreSQL 13
- PostgreSQL 12
- PostgreSQL 11
- PostgreSQL 10
新しいメジャー バージョンで互換性のない変更が導入され、アプリケーション コード、スキーマ、データベース設定の変更が必要になる場合があります。データベース インスタンスをアップグレードする前に、ターゲット メジャー バージョンのリリースノートで、対処の必要がある互換性の問題を確認してください。
ドライランでアップグレードをテストします。
本番環境データベースをアップグレードする前に、テスト環境でエンドツーエンドのアップグレード プロセスのドライランを実行します。インスタンスのクローンを作成して、アップグレード プロセスのテストに使用するデータをコピーします。
アップグレードが正常に完了することを検証するだけでなく、アップグレードされたデータベースでアプリケーションが期待どおりに動作することを確認するためのテストを実行します。
アップグレードのタイミングを決定します。
アップグレード中は、インスタンスが一定期間使用できなくなります。データベース アクティビティが低い時間帯にアップグレードを行うように計画してください。
メジャー バージョン アップグレードを準備する
アップグレードを行う前に、次の手順を行います。
-
template
データベースとpostgres
データベースのLC_COLLATE
値を確認します。各データベースの文字セットはen_US.UTF8
にする必要があります。template
データベースとpostgres
データベースのLC_COLLATE
値がen_US.UTF8
でない場合、メジャー バージョンのアップグレードは失敗します。これを修正するには、いずれかのデータベースにen_US.UTF8
以外の文字セットがある場合、アップグレードを行う前にLC_COLLATE
の値をen_US.UTF8
に変更します。データベースのエンコードを変更するには:
- データベースをダンプします。
- データベースを削除します。
- 異なるエンコードで新しいデータベースを作成します(この例として:
en_US.UTF8
)。 - データを再読み込みします。
データベースの名前を変更することもできます。
- データベースへのすべての接続を閉じます。
- データベースの名前を変更します。
- 新しいデータベース名を使用するようにアプリケーション構成を更新します。
- デフォルトのエンコードを使用して、新しい空のデータベースを作成します。
本番環境インスタンスに適用する前に、クローンを作成したインスタンスでこれらの手順を実行することをおすすめします。
リードレプリカを管理します。
Cloud SQL for PostgreSQL はクロス バージョン レプリケーションをサポートしていません。つまり、インスタンスがリードレプリカに複製している間は、プライマリ インスタンスをアップグレードできません。アップグレードを行う前に、リードレプリカごとにレプリケーションを無効にするか、リードレプリカを削除します。
- Cloud SQL が論理レプリケーションのソースの場合は、次のように
pglogical
拡張レプリケーションを無効にします。これは、アップグレード後に再度有効にできます。Cloud SQL が論理レプリケーションのターゲットの場合、これらの手順を行う必要はありません。- 次のコマンドを使用して、サブスクリプションを無効にし、プロバイダからレプリカの接続を解除します。
SELECT * FROM pglogical.alter_subscription_disable(subscription_name name, immediate bool);
name
を、既存のサブスクリプションの名前に置き換えます。サブスクリプションをすぐに無効にする場合は、
immediate
パラメータの値をtrue
に設定します。デフォルト値はfalse
です。サブスクリプションは、現在のトランザクションが終了した後に無効になります。次に例を示します。
postgres=> SELECT * FROM pglogical.alter_subscription_disable('test_sub', true); alter_subscription_disable ---------------------------- t (1 row)
- パブリッシャーまたは Cloud SQL プライマリ インスタンスに接続して次のコマンドを実行し、レプリケーション スロットを削除します。
SELECT pg_drop_replication_slot(slot_name) FROM pg_replication_slots WHERE slot_name IN (SELECT slot_name FROM pg_replication_slots);
次に例を示します。
postgres=> SELECT pg_drop_replication_slot(slot_name) FROM pg_replication_slots postgres-> WHERE slot_name IN (SELECT slot_name FROM pg_replication_slots); -[ RECORD 1 ]------------+- pg_drop_replication_slot | postgres=>
- 次のコマンドを使用して、サブスクリプションを無効にし、プロバイダからレプリカの接続を解除します。
残りの PostgreSQL の拡張機能を管理します。
ほとんどの拡張機能は、アップグレードされたデータベースのメジャー バージョンで動作します。ターゲット バージョンでサポートされなくなった拡張機能がある場合は、それを削除します。たとえば、PostgreSQL 11 以降のバージョンにアップグレードする場合は、
chkpass
拡張機能を削除します。PostGIS と関連拡張機能をサポートされている最新バージョンに手動でアップグレードできます。
PostGIS バージョン 2.x からアップグレードすると、PostGIS 拡張機能に関連付けられていないデータベース オブジェクトが残ることがあります。これにより、アップグレード オペレーションがブロックされる可能性があります。この問題を解決する方法については、壊れた PostGIS ラスターのインストールを修正するをご覧ください。
オブジェクトが非推奨の関数を使用しているため、PostGIS バージョン 3.1.7 以降へのアップグレードが完了できないことがあります。これにより、アップグレード オペレーションがブロックされる可能性があります。アップグレード ステータスを確認するには、
PostGIS 拡張機能のアップグレードの詳細については、PostGIS のアップグレードをご覧ください。 PostGIS のアップグレードに関連する問題については、PostgreSQL インスタンスのバージョンの確認をご覧ください。SELECT PostGIS_full_version();
を実行します。警告がある場合は、非推奨の関数を使用しているオブジェクトをすべて削除し、PostGIS 拡張機能を中間バージョン以降に更新します。これらの操作が完了したら、SELECT PostGIS_full_version();
コマンドを再実行します。警告が表示されないことを確認します。その後、アップグレード オペレーションを続行します。- カスタム データベース フラグを管理します。PostgreSQL インスタンスに構成したカスタム データベース フラグの名前を確認します。これらのフラグに関連する問題については、PostgreSQL インスタンスのカスタムフラグの確認をご覧ください。
- あるメジャー バージョンから別のメジャー バージョンへのアップグレードを行う場合は、各データベースに接続して、互換性の問題があるかどうかを確認します。データベースが相互に接続できることを確認します。各データベースの
datallowconn
フィールドを確認して、接続が許可されていることを確認します。t
値は許可されていることを意味し、f
値は接続を確立できないことを示します。 - Datadog インストールを使用して Cloud SQL インスタンスを PostgreSQL 10 以降のバージョンにアップグレードする場合は、アップグレード前に pg_stat_activity() 関数を削除します。
既知の制限事項
Cloud SQL for PostgreSQL のインプレース メジャー バージョン アップグレードには、次の制限が影響します。
- 外部レプリカでは、メジャー バージョンのインプレース アップグレードを実行できません。
- 1,000 を超えるデータベースを持つインスタンスをあるバージョンから別のバージョンにアップグレードするには、長い時間がかかり、タイム・アウトする可能性があります。
select * from pg_largeobject_metadata;
ステートメントを使用して、Cloud SQL インスタンスの各 PostgreSQL データベース内の大規模オブジェクトの数をクエリします。すべてのデータベースの結果が 1, 000 万件を超える大規模なオブジェクトである場合、アップグレードは失敗します。Cloud SQL はデータベースを以前のバージョンにロールバックします。- PostgreSQL 16 以降へのインプレース メジャー バージョン アップグレードを実行する前に、すべてのデータベースの PostGIS 拡張機能をバージョン 3.4.0 にアップグレードします。
- PostgreSQL バージョン 9.6、10、11、または 12 を使用している場合、PostGIS 拡張機能のバージョン 3.4.0 はサポートされていません。したがって、PostgreSQL 16 以降へのインプレース メジャー バージョン アップグレードを実行するには、まず PostgreSQL の中間バージョン(バージョン 13、14、15)にアップグレードする必要があります。
インスタンスに
pgRouting
拡張機能とpg_squeeze
拡張機能をインストールした場合、メジャー バージョンのアップグレードは実行できません。この問題を解決するには、これらの拡張機能をアンインストールしてからアップグレードを実行してください。拡張機能の詳細については、PostgreSQL 拡張機能を構成するをご覧ください。vacuum_defer_cleanup_age フラグと force_parallel_mode フラグを有効にすると、メジャー バージョンのアップグレードを実行できません。この問題を解決するには、これらのフラグを削除してからアップグレードを実行します。フラグの詳細(削除方法など)については、データベース フラグを構成するをご覧ください。
データベースのメジャー バージョンをインプレースでアップグレードする
アップグレード操作を開始すると、Cloud SQL は、最初にインスタンスの構成をチェックしてアップグレードの互換性を確認します。構成を確認すると、Cloud SQL は、インスタンスを利用不可にして、アップグレード前のバックアップを作成します。その後、アップグレードを実行し、インスタンスを使用可能にして、アップグレード後のバックアップを作成します。
コンソール
-
Google Cloud コンソールで Cloud SQL の [インスタンス] ページに移動します。
- インスタンスの [概要] ページを開くには、インスタンス名をクリックします。
- [編集] をクリックします。
- [インスタンスの情報] セクションで [アップグレード] ボタンをクリックし、アップグレード ページに移動します。
- [データベースのバージョンを選択] ページで [アップグレード後のデータベース バージョン] リストをクリックし、使用可能なデータベースのメジャー バージョンの 1 つを選択します。
- [次へ] をクリックします。
- [インスタンス ID] ボックスにインスタンスの名前を入力し、[アップグレードを開始] ボタンをクリックします。
アップグレード後のデータベースのメジャー バージョンが、インスタンスの概要ページのインスタンス名の下に表示されていることを確認します。
gcloud
アップグレードを開始する
gcloud sql instances patch
コマンドに--database-version
フラグを指定します。コマンドを実行する前に、次の変数を置き換えます。
- INSTANCE_NAME: インスタンスの名前。
- DATABASE_VERSION: データベースのメジャー バージョンの列挙型。これは、現在のバージョンより大きくする必要があります。インスタンスのアップグレード ターゲットとして使用できるメジャー バージョンのデータベース バージョンを指定します。この列挙型は、アップグレードの計画の最初のステップとして取得できます。データベース バージョンの列挙型の完全なリストが必要な場合は、SqlDatabaseEnums をご覧ください。
gcloud sql instances patch INSTANCE_NAME \ --database-version=DATABASE_VERSION
メジャー バージョンのアップグレードが完了するまで数分かかります。オペレーションに予想より時間がかかっていることを示すメッセージが表示される場合があります。このメッセージは無視するか、
gcloud sql operations wait
コマンドを実行してメッセージを閉じます。アップグレード オペレーション名を取得します。
gcloud sql operations list
コマンドを使用して、--instance
フラグを指定します。コマンドを実行する前に、INSTANCE_NAME 変数をインスタンス名に置き換えます。
gcloud sql operations list --instance=INSTANCE_NAME
アップグレードのステータスをモニタリングします。
gcloud sql operations describe
コマンドを使用します。コマンドを実行する前に、OPERATION 変数を前の手順で取得したアップグレード オペレーション名に置き換えます。
gcloud sql operations describe OPERATION
REST v1
インプレース アップグレードを開始します。
instances:patch
メソッドでの PATCH リクエストを使用します。リクエスト データを使用する前に、次の変数を置き換えます。
- PROJECT_ID: プロジェクトの ID。
- INSTANCE_NAME: インスタンスの名前。
HTTP メソッドと URL:
PATCH https://sqladmin.googleapis.com/v1/projects/PROJECT_ID/instances/INSTANCE_NAME
リクエストの本文(JSON):
{ "databaseVersion": DATABASE_VERSION }
DATABASE_VERSION は、データベースのメジャー バージョンの列挙型に置き換えます。これは、現在のバージョン移行のものにする必要があります。インスタンスのアップグレード ターゲットとして使用できるメジャー バージョンのデータベース バージョンを指定します。この列挙型は、アップグレードの計画の最初のステップとして取得できます。データベース バージョンの列挙型の一覧については、SqlDatabaseVersion をご覧ください。
アップグレード オペレーション名を取得します。
PROJECT_ID をプロジェクトの ID に置き換えて、
operations.list
メソッドでの GET リクエストを使用します。HTTP メソッドと URL:
GET https://sqladmin.googleapis.com/v1/projects/PROJECT_ID/operations
アップグレードのステータスをモニタリングします。
次の変数を置き換えて、
operations.get
メソッドでの GET リクエストを使用します。- PROJECT_ID: プロジェクトの ID。
- OPERATION_NAME: 前の手順で取得したアップグレード オペレーション名。
HTTP メソッドと URL:
GET https://sqladmin.googleapis.com/v1/projects/PROJECT_ID/operation/OPERATION_NAME
Terraform
データベースのバージョンを更新するには、Terraform リソースと Google Cloud の Terraform プロバイダのバージョン 4.34.0 以降を使用します。
変更を適用する
Google Cloud プロジェクトで Terraform 構成を適用するには、次のセクションの手順を完了します。
Cloud Shell を準備する
- Cloud Shell を起動します。
-
Terraform 構成を適用するデフォルトの Google Cloud プロジェクトを設定します。
このコマンドは、プロジェクトごとに 1 回だけ実行する必要があります。これは任意のディレクトリで実行できます。
export GOOGLE_CLOUD_PROJECT=PROJECT_ID
Terraform 構成ファイルに明示的な値を設定すると、環境変数がオーバーライドされます。
ディレクトリを準備する
Terraform 構成ファイルには独自のディレクトリ(ルート モジュールとも呼ばれます)が必要です。
-
Cloud Shell で、ディレクトリを作成し、そのディレクトリ内に新しいファイルを作成します。ファイルの拡張子は
.tf
にする必要があります(例:main.tf
)。このチュートリアルでは、このファイルをmain.tf
とします。mkdir DIRECTORY && cd DIRECTORY && touch main.tf
-
チュートリアルを使用している場合は、各セクションまたはステップのサンプルコードをコピーできます。
新しく作成した
main.tf
にサンプルコードをコピーします。必要に応じて、GitHub からコードをコピーします。Terraform スニペットがエンドツーエンドのソリューションの一部である場合は、この方法をおすすめします。
- 環境に適用するサンプル パラメータを確認し、変更します。
- 変更を保存します。
-
Terraform を初期化します。これは、ディレクトリごとに 1 回だけ行う必要があります。
terraform init
必要に応じて、最新バージョンの Google プロバイダを使用する場合は、
-upgrade
オプションを使用します。terraform init -upgrade
変更を適用する
-
構成を確認して、Terraform が作成または更新するリソースが想定どおりであることを確認します。
terraform plan
必要に応じて構成を修正します。
-
次のコマンドを実行し、プロンプトで「
yes
」と入力して、Terraform 構成を適用します。terraform apply
Terraform に「Apply complete!」のメッセージが表示されるまで待ちます。
- Google Cloud プロジェクトを開いて結果を表示します。Google Cloud コンソールの UI でリソースに移動して、Terraform によって作成または更新されたことを確認します。
変更を削除する
変更を削除するには、次の手順を行います。
- 削除の保護を無効にするには、Terraform 構成ファイルで
deletion_protection
引数をfalse
に設定します。deletion_protection = "false"
- 次のコマンドを実行し、プロンプトで「
yes
」と入力して、更新された Terraform 構成を適用します。terraform apply
-
次のコマンドを実行しています。プロンプトで「
yes
」と入力して、以前に Terraform 構成で適用されたリソースを削除します。terraform destroy
インプレース アップグレード リクエストを行うと、Cloud SQL はまずアップグレード前のチェックを行います。Cloud SQL でインスタンスのアップグレードの準備ができていないと判断された場合、アップグレード リクエストは失敗し、問題に対処する方法を提案するメッセージが表示されます。メジャー バージョン アップグレードのトラブルシューティングもご覧ください。
自動アップグレードのバックアップ
メジャー バージョン アップグレードを実行すると、Cloud SQL は 2 つのオンデマンド バックアップ(アップグレード バックアップと呼ばれます)を自動的に作成します。
- 最初のアップグレード バックアップは、アップグレード前のバックアップで、アップグレードの直前に作成されます。このバックアップは、データベース インスタンスを以前のバージョンの状態に復元するために使用できます。
- 2 番目のアップグレード バックアップは、アップグレード後のバックアップで、アップグレードされたデータベース インスタンスへの新しい書き込みが許可された直後に作成されます。
バックアップのリストを表示すると、On-demand
タイプでアップグレード バックアップが一覧表示されます。アップグレード バックアップには、簡単に識別できるようにラベルが付いています。たとえば、PostgreSQL 14 から PostgreSQL 15 にアップグレードする場合、アップグレード前のバックアップには Pre-upgrade backup, POSTGRES_14 to POSTGRES_15.
というラベルが付き、アップグレード後のバックアップには Post-upgrade backup, POSTGRES_14 to
POSTGRES_15.
というラベルが付きます。
他のオンデマンド バックアップと同様に、アップグレード バックアップは、それを削除するかインスタンスを削除するまで残ります。PITR が有効になっていると、保持期間中のアップグレード バックアップは削除できません。アップグレード バックアップを削除する必要がある場合は、PITR を無効にするか、アップグレード バックアップの保持期間が終了するまで待つ必要があります。
メジャー バージョン アップグレードを実行する
プライマリ インスタンスのアップグレードが終了したら、次の手順でアップグレードを実行します。
- アップグレード前にインスタンスで
pglogical
レプリケーションを使用していた場合は、これを有効にします。これにより、必要なレプリケーション スロットが自動的に作成されます。- 次のコマンドを使用して、宛先レプリカの
pglogical
サブスクリプションを削除します。select pglogical.drop_subscription(subscription_name name);
name
を、既存のサブスクリプションの名前に置き換えます。次に例を示します。
postgres=> select pglogical.drop_subscription(subscription_name := 'test_sub'); -[ RECORD 1 ]-----+-- drop_subscription | 1
- Cloud SQL プライマリ インスタンスに次のように接続の詳細を提供し、移行先(レプリカ)で pglogical サブスクリプションを再作成します。
SELECT pglogical.create_subscription( subscription_name := 'test_sub', provider_dsn := 'host=primary-ip port=5432 dbname=postgres user=replication_user password=replicapassword' );
次に例を示します。
postgres=> SELECT pglogical.create_subscription( postgres(> subscription_name := 'test_sub', postgres(> provider_dsn := 'host=10.58.64.90 port=5432 dbname=postgres user=postgres password=postgres' postgres(> ); -[ RECORD 1 ]-------+----------- create_subscription | 2769129391
- 次のコマンドを使用して、サブスクリプションのステータスを確認します。
SELECT * FROM pglogical.show_subscription_status('test_sub');
- 書き込みトランザクションを実行し、変更が宛先で表示されることを確認して、レプリケーションをテストします。
- 次のコマンドを使用して、宛先レプリカの
リードレプリカをアップグレードします。
リードレプリカのレプリケーションを停止した場合は、これらを個別にアップグレードします。プライマリ インスタンスのアップグレードに使用した任意の方法を使用できます。レプリカをアップグレードすると、Cloud SQL は IP アドレスを保持したままレプリカを再作成します。プライマリの最新のデータで更新し、レプリカを再起動します。
プライマリ インスタンスをアップグレードする前にリードレプリカを削除した場合は、新しいリードレプリカを作成できます。これは、アップグレードされたデータベース バージョンに自動的にプロビジョニングされます。
データベースの統計情報を更新します。
アップグレード後に、プライマリ インスタンスで
ANALYZE
を実行し、システム統計情報を更新します。正確な統計情報があれば、PostgreSQL のクエリ プランナーが最適なクエリ処理を行うことができます。統計情報がないと、クエリプランが低品質になり、パフォーマンスが低下してメモリが過剰に消費される可能性があります。承認テストを実行します。
アップグレード後のシステムが想定どおり動作することを確認するために、テストを実施する必要があります。
メジャー バージョン アップグレードのトラブルシューティング
無効なアップグレード コマンド(インスタンスに新しいバージョンの無効なデータベース フラグが含まれている場合など)を試行すると、Cloud SQL はエラー メッセージを返します。
アップグレード リクエストが失敗した場合は、アップグレード リクエストの構文を確認してください。リクエストに有効な構造がある場合は、次の推奨事項を確認してください。
アップグレード前のチェックの失敗を確認する
アップグレード前のチェックの失敗は、アップグレード前の検証プロセスで Cloud SQL が検出した問題またはエラーです。これらのエラーは、実際のアップグレード プロセスの開始前に発生し、アップグレードの成功に影響する可能性のある問題や互換性のない問題を特定することを目的としています。
アップグレード前のチェックの失敗は、次のカテゴリに表示されます。
- 互換性のない拡張機能: インスタンスの移行先のバージョンと互換性のない PostgreSQL 拡張機能を検出します。
- サポートされていない依存関係: サポートが終了した依存関係や更新が必要な依存関係を特定します。
- データ形式の非互換性: バージョン固有のデータ構造の違い、エンコードと照合の変更、データ型の変更、システム カタログの調整など、さまざまな要因から生じるデータの不整合を確認します。
次の表に、アップグレード前のチェックの失敗とそのエラー メッセージを示します。
アップグレード前のチェックが失敗した場合 | エラー メッセージ |
---|---|
Cloud SQL で不明なデータ型が検出された。 | Please remove the following usages of 'Unknown' data types before attempting an upgrade: (database: db_name, relation: rel_name, attribute: attr_name) |
PostgreSQL 12 以降のバージョンにアップグレードすると、Cloud SQL は 'sql_identifier' データ型を検出します。 |
Please remove the following usages of 'sql_identifier' data types before attempting an upgrade: (database: db_name, relation: rel_name, attribute: attr_name) |
Cloud SQL は reg* データ型を検出します。 |
Please remove the following usages of 'reg*' data types before attempting an upgrade: (database: db_name, relation: rel_name, attribute: attr_name) |
Cloud SQL は、postgres データベースの LC_COLLATE 値が en_US.UTF8 以外の文字セットであることを検出します。 |
Please change the 'LC_COLLATE' value of the postgres database to 'en_US.UTF8' before attempting an upgrade |
Cloud SQL は、オブジェクト ID(OID)を持つテーブルを検出します。 | Please remove the following usages of tables with OIDs before attempting an upgrade: (database: db_name, relation: rel_name) |
Cloud SQL は複合データ型を検出します。 | Please remove the following usages of 'composite' data types before attempting an upgrade: (database: db_name, relation: rel_name, attribute: attr_name) |
Cloud SQL は、ユーザー定義の接尾辞演算子を検出します。 | Please remove the following usages of 'postfix operators' before attempting an upgrade: (database: db_name, operation id: op_id, operation namespace: op_namespace, operation name: op_name, type namespace: type_namespace, type name: type_name) |
Cloud SQL は、互換性のない多型関数を検出します。 | Please remove the following usages of 'incompatible polymorphic' functions before attempting an upgrade: (database: db_name, object kind: obj_kind, object name: obj_name) |
Cloud SQL は、ユーザー定義のエンコード変換を検出します。 | Please remove the following usages of user-defined encoding conversions before attempting an upgrade: (database: db_name, namespace name: namespace_name, encoding conversions name: encod_name) |
Cloud SQL が関数 ll_to_earth の空の検索パスを検出する |
Please update the search path of the 'll_to_earth' function |
Cloud SQL は、解凍された PostGIS ラスター ファイルの存在を検出します。 | PostGIS version upgrade has not been completed, unpackaged raster files present. Follow the steps at https://postgis.net/documentation/tips/tip-removing-raster-from-2-3/ to fix before major version upgrade. |
空の検索パスの問題を修正
これは、earthdistance
拡張機能が関数の検索パスを指定せずに地球とキューブのタイプを使用しているためです。このパスは、アップグレード プロセスで必要となるため、指定する必要があります。
この問題を解決するには、次のクエリを実行して ll_to_earth
関数の検索パスを修正します。ALTER FUNCTION ll_to_earth SET search_path = public;
アップグレード ログを表示する
有効なアップグレード リクエストでエラーが発生した場合、Cloud SQL はエラーログを projects/PROJECT_ID/logs/cloudsql.googleapis.com%2Fpostgres-upgrade.log
に公開します。各ログエントリには、インスタンス ID のラベルが付いているため、アップグレード エラーが発生したインスタンスを識別できます。このようなアップグレード エラーを見つけて解決します。
エラーログを表示するには、次の手順を行います。
-
Google Cloud コンソールで Cloud SQL の [インスタンス] ページに移動します。
- インスタンスの [概要] ページを開くには、インスタンス名をクリックします。
インスタンスの [概要] ページの [オペレーションとログ] ペインで、[PostgreSQL のエラーログを表示] リンクをクリックします。
[ログ エクスプローラ] ページが開きます。
次のようにログを表示します。
- プロジェクト内のエラーログすべてを一覧表示するには、ログ名を選択して、[ログ名] でフィルタリングします。
クエリフィルタの詳細については、高度なクエリをご覧ください。
- 単一のインスタンスのアップグレード エラーログをフィルタリングするには、
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%2Fpostgres-upgrade.log"
たとえば、プロジェクト
buylots
で実行されているshopping-db
という名前のインスタンスでアップグレード エラーログをフィルタリングするには、次のクエリフィルタを使用します。resource.type="cloudsql_database" resource.labels.database_id="buylots:shopping-db" logName : "projects/buylots/logs/cloudsql.googleapis.com%2Fpostgres-upgrade.log"
接頭辞が pg_upgrade_dump
のログエントリはアップグレード エラーが発生したことを示します。次に例を示します。
pg_upgrade_dump: error: query failed: ERROR: out of shared memory
HINT: You might need to increase max_locks_per_transaction.
また、.txt
セカンダリ ファイル名でラベル付けされたログエントリには、アップグレードを再試行する前に解決できるその他のエラーが含まれている場合もあります。
すべてのファイル名は postgres-upgrade.log
ファイルにあります。ファイル名を確認するには、labels.FILE_NAME
フィールドを確認します。
解決するエラーがあるファイル名には次が含まれます。
tables_with_oids.txt:
このファイルには、オブジェクト ID(OID)でリストされているテーブルが含まれています。テーブルを削除するか、OID を使用しないようにテーブルを変更します。tables_using_composite.txt:
このファイルには、システム定義の複合型を使用して一覧表示されるテーブルが含まれています。テーブルを削除するか、これらの複合タイプを使用しないようにテーブルを変更します。tables_using_unknown.txt:
このファイルには、UNKNOWN
データ型を使用して一覧表示されたテーブルが含まれます。テーブルを削除するか、テーブルでこのデータ型が使用されないように変更します。tables_using_sql_identifier.txt:
このファイルには、SQL_IDENTIFIER
データ型を使用して一覧表示されたテーブルが含まれます。テーブルを削除するか、テーブルでこのデータ型が使用されないように変更します。tables_using_reg.txt:
このファイルには、REG*
データ型(REGCOLLATION
やREGNAMESPACE
など)を使用して一覧表示されたテーブルが含まれます。テーブルを削除するか、テーブルでこのデータ型が使用されないように変更します。postfix_ops.txt:
このファイルには、ポストフィックス(右単項)演算子を使用して一覧表示されたテーブルが含まれます。テーブルを削除するか、テーブルでこれらの演算子が使用されないように変更します。
メモリを確認する
インスタンスの共有メモリが不足している場合、「ERROR: out of shared memory.
」というエラー メッセージが表示されることがあります。このエラーは、テーブル数が 10,000 個を超えると発生する可能性が高くなります。
アップグレードを行う前に、max_locks_per_transaction
フラグの値をインスタンス内のテーブルの約 2 倍に設定します。このフラグの値を変更すると、インスタンスは再起動されます。
接続容量を確認する
インスタンスの接続容量が不足している場合は、「ERROR: Insufficient connections.
」というエラー メッセージが表示されることがあります。
max_connections
フラグの値は、インスタンス内のデータベースの数だけ増やすことをおすすめします。このフラグの値を変更すると、インスタンスは再起動されます。
列参照の曖昧さを確認する
ビューに列参照が不明確な場合、ERROR: column reference "<column_name>" is ambiguous
というエラー メッセージが表示されることがあります。この問題は、新しい PostgreSQL バージョンで pg_stat_activity
や pg_stat_replication
などのシステム カタログ ビューの構造が変更された場合に発生します。これにより、列の順序に依存するカスタムビューが中断される可能性があります。
このエラー メッセージを確認するには、クエリエディタに次のクエリを追加します。
textPayload =~ "ERROR: column reference .+ is ambiguous at character \d+"
この問題は、次の方法で解決できます。
カスタムビューを適応させる。
カスタムビューの列参照を更新して、ターゲット PostgreSQL バージョンの新しいシステム カタログ ビュー(
pg_stat_activity
やpg_stat_replication
など)の定義と一致させます。ビューを再作成します。
メジャー バージョンのアップグレードを実行する前に、カスタムビューを削除します。アップグレードが完了したらビューを再作成し、新しい構造と互換性があることを確認します。
この問題の詳細な例と詳細な分析については、こちらのStack Overflow のディスカッションをご覧ください。
CASE 文で SRF を確認する
バージョン 9.6 からインスタンスをアップグレードし、CASE ステートメントでセット返却関数を使用している場合、エラー メッセージ ERROR: set-returning functions are not allowed in CASE
が表示されることがあります。この問題は、バージョン 10 以降で CASE ステートメントでセット返却関数を使用することが禁止されているために発生します。
この問題を解決してインスタンスを正常にアップグレードするには、セットを返す関数を使用する CASE ステートメントを変更して、アップグレードを再試行する前に使用しないようにします。よく使用される SRF には次のようなものがあります。
- unnest()
- generate_series()
- array_agg()
- regexp_split_to_table()
- jsonb_array_elements()
- json_array_elements()
- sonb_each()
- json_each()
カスタム キャストで作成された視聴回数を確認する
カスタム キャスト上にビューが作成されている場合は、ERROR: cannot cast type <type_1> to <type_2>
のようなエラー メッセージが表示されます。この問題は、カスタム作成キャストの権限の問題が原因で発生します。
この問題を解決するには、インスタンスを [PostgreSQL version].R20240910.01_02
に更新します。
詳細については、セルフサービス メンテナンスをご覧ください。
イベント トリガーの所有権を確認する
イベント トリガーが cloudsqlsuperuser ロールのないユーザーによって所有されている場合、ERROR: permission denied to change owner of event trigger "<trigger_name>"
などのエラー メッセージが表示されることがあります。この問題は、アップグレード中にこれらのトリガーを再作成しようとしたときに権限の問題が発生したために発生します。クエリエディタに次のクエリを追加して、このエラー メッセージを確認できます。
textPayload =~ "ERROR: permission denied to change owner of event trigger .+ "
この問題に対処するには、インスタンス内のすべてのイベント トリガーの所有権を確認します。各トリガーの所有者が cloudsqlsuperuser であることを確認します。トリガーが他のユーザーによって所有されている場合は、アップグレードを再度試行する前に、その所有権を cloudsqlsuperuser に更新します。次のクエリを使用して所有権を変更できます。ALTER EVENT TRIGGER <trigger_name> OWNER TO <cloudsqlsuperuser>;
次のクエリを使用して、イベント トリガーのリストとオーナーの詳細を取得できます。
SELECT evtname AS trigger_name, evtowner::regrole AS owner FROM pg_event_trigger;
ログに記録されていないテーブルの生成列を確認する
生成された列を持つログに記録されていないテーブルがある場合、エラー メッセージ ERROR: unexpected request for new relfilenumber in binary upgrade mode
が表示されることがあります。この問題は、テーブルと生成された列のシーケンスの永続性特性の不一致が原因で発生します。
この問題に対処するには、次の手順に沿って操作します。
- ログに記録されていないテーブルを削除する: 可能であれば、生成された列にリンクされているログに記録されていないテーブルを削除します。続行する前に、データ損失を安全に軽減できることを確認してください。
-
永続テーブルに変換する: 次の手順で、ログに記録されていないテーブルを一時的に永続テーブルに変換します。
- テーブルをロギング テーブルに変換する
ALTER TABLE
SET LOGGED; - メジャー バージョンのアップグレードを実行する
- テーブルをログに記録されないテーブルに戻します。
ALTER TABLE
SET UNLOGGED
- テーブルをロギング テーブルに変換する
このようなテーブルはすべて、次のクエリを使用して識別できます。
SELECT relnamespace::regnamespace, c.relname AS table_name, a.attname AS column_name, a.attidentity AS identity_type FROM pg_catalog.pg_class c JOIN pg_catalog.pg_attribute a ON a.attrelid = c.oid WHERE a.attidentity IN ('a', 'd') AND c.relkind = 'r' AND c.relpersistence = 'u' ORDER BY c.relname, a.attname;
PostgreSQL インスタンスのカスタムフラグを確認する
PostgreSQL インスタンスのバージョン 14 以降にアップグレードする場合は、インスタンスに構成したカスタム データベース フラグの名前を確認します。これは、PostgreSQL がカスタム パラメータに使用できる名前に制限を追加したためです。
カスタム データベース フラグの最初の文字は、アルファベット(A~Z または a~z)にする必要があります。後続のすべての文字には、英数字、アンダースコア(_)特殊文字、ドル記号($)特殊文字を使用できます。
広告表示オプションを削除する
Cloud SQL インスタンスをアップグレードしている場合は、pg_restore: error: could not execute
query: ERROR: role "16447" does not exist
というエラー メッセージが表示されることがあります。
この問題を解決する方法は次のとおりです。
- 拡張機能
pg_stat_statements
とpgstattuple
を削除します。 - アップグレードを実施します。
- 拡張機能を再インストールします。
以前のメジャー バージョンに戻す
アップグレードしたデータベース システムが期待どおりに機能しない場合は、インスタンスを以前のバージョンに復元しなければならないことがあります。その場合は、アップグレード前のバックアップを Cloud SQL のリカバリ インスタンスに復元します。これは、アップグレード前のバージョンを実行する新しいインスタンスです。
以前のバージョンに復元する手順は、次のとおりです。
アップグレード前のバックアップを特定します。
自動アップグレード バックアップをご覧ください。
復元インスタンスを作成します。
アップグレード前のバックアップの作成時に Cloud SQL で実行されていたメジャー バージョンを使用して、新しい Cloud SQL インスタンスを作成します。元のインスタンスと同じフラグとインスタンスの設定を使用します。
アップグレード前のバックアップを復元します。
アップグレード前のバックアップをリカバリ インスタンスに復元します。完了には数分かかる場合があります。
リードレプリカを追加します。
リードレプリカを使用していた場合は、それらを個別に追加します。
アプリケーションを接続します。
データベース システムをリカバリしたら、リカバリ インスタンスとそのリードレプリカの詳細でアプリケーションを更新します。アップグレード前のバージョンのデータベースでトラフィックの処理を再開できます。
よくある質問
データベースのメジャー バージョンをアップグレードするときは、次のような疑問が生じることがあります。
- はい。Cloud SQL がアップグレードを実行する間、インスタンスは一定期間使用できません。
- アップグレードにはどれくらい時間がかかりますか?
通常、1 つのインスタンスのアップグレードには 10 分もかかりません。インスタンス構成で使用されている vCPU またはメモリが少ない場合、アップグレードに時間がかかることがあります。
インスタンスでホストされているデータベースやテーブルが多すぎる場合や、データベースが非常に大きい場合は、アップグレードに数時間がかかったりタイムアウトになることがあります。これは、アップグレード時間がデータベース内のオブジェクト数と対応するためです。アップグレードが必要なインスタンスが複数ある場合は、それに比例してアップグレードの合計時間が長くなります。
- アップグレード プロセスの各ステップをモニタリングできますか?
- Cloud SQL ではアップグレード オペレーションが進行中かどうかをモニタリングできますが、アップグレードの個々のステップを追跡することはできません。
- 開始後にアップグレードをキャンセルできますか?
- いいえ、アップグレードを開始すると、キャンセルはできません。アップグレードに失敗すると、Cloud SQL は以前のバージョンのインスタンスを自動的に復元します。
- アップグレード中に設定はどうなりますか?
インプレースのメジャー バージョン アップグレードを実行すると、Cloud SQL はインスタンス名、IP アドレス、明示的に構成されたフラグ値、ユーザーデータなどのデータベース設定を保持します。ただし、システム変数のデフォルト値は変更されることがあります。たとえば、PostgreSQL 13 以前の
password_encryption
フラグのデフォルト値はmd5
です。PostgreSQL 14 にアップグレードすると、このフラグのデフォルト値はscram-sha-256
に変更されます。詳細については、データベース フラグを構成するをご覧ください。特定のフラグまたは値がターゲット バージョンでサポートされなくなった場合、Cloud SQL はアップグレード中にフラグを自動的に削除します。
次のステップ
- インスタンスへの接続オプションについて学習します。
- データのインポートとエクスポートについて学習する。
- データベース フラグの設定について学ぶ