インプレースアップグレード方式を使用して、既存のインスタンス上で pg_upgrade を直接使用し、ApsaraDB RDS for PostgreSQL インスタンスのメジャーエンジンバージョンをアップグレードします。構成情報や請求情報を含むすべてのメタデータは、アップグレード後も保持されます。
利用可能なすべてのアップグレード方法の比較については、「メジャーバージョンアップグレード方法の概要」をご参照ください。
前提条件
開始する前に、以下を確認してください。
インスタンスが ApsaraDB RDS for PostgreSQL 16 またはそれ以前のバージョンを実行していること。
ストレージタイプがクラウドディスクであること。
課金方法が従量課金またはサブスクリプションであること。
このインスタンスは、読み取り専用インスタンス でも 専用クラスターインスタンス でもありません。
Babelfish が有効になっていないこと。マイナーエンジンバージョンの番号が
babelfishで終わっていないこと。
課金
無料。
注意事項
アップグレードを開始する前に、以下の内容をご確認ください。
サービスへの影響
スイッチオーバー中、インスタンスは読み取り専用状態になり、数分間の一時的な接続切断が発生する可能性があります。アップグレードはオフピーク時間に実行してください。
読み取り専用の期間は、データベースオブジェクトの数によって異なります。次のコマンドを実行して、その数を確認してください。
SELECT count(1) FROM pg_class;数が数百万に達する場合、読み取り専用状態は数十分から数時間続く可能性があります。
インスタンスタイプが推奨仕様を満たしていない場合、バージョンアップグレード中にシステムが自動的にアップグレードします。これにより、追加で数分間の読み取り専用状態と数秒間の一時的な接続切断が発生します。先に進む前に、メジャーバージョンアップグレードチェックレポートでインスタンスタイプに関するアラートを解決してください。
レプリケーションスロット
インスタンスがレプリケーションスロットを持つパブリッシャーである場合、アップグレード後にレプリケーションスロットは失われます。
インスタンスがレプリケーションスロットを持つサブスクライバーである場合、アップグレード中にレプリケーションスロットのプリエンプションが発生し、データの不整合を引き起こす可能性があります。「アップグレード中にレプリケーションスロットのプリエンプションによって引き起こされるデータの不整合を防ぐにはどうすればよいですか?」をご参照ください。
パラメーターの変更
ターゲットバージョンでサポートされていないパラメーターは自動的に削除されます。
値がターゲットバージョンの有効範囲外であるパラメーターは、そのバージョンのパラメーターテンプレートのデフォルト値にリセットされます。
アップグレード中、システムは一時的に
statement_timeoutを0に設定し、アップグレード完了後に元の値に戻します。
その他の考慮事項
DTS タスク:インスタンスが Data Transmission Service (DTS) のソースまたは宛先である場合、アップグレード後に DTS タスクを再作成してください。
プラグインの互換性:アップグレードにより、インスタンスは最新のマイナーエンジンバージョンに自動的に更新されるため、プラグインの互換性の問題が発生する可能性があります。
インスタンスのバックアップ:クローンベースの復元をサポートするため、アップグレードの前後に完全バックアップが実行されます。
ステップ 1:アップグレード前チェックの実行
ApsaraDB RDS コンソールにログインします。上部のナビゲーションバーで、インスタンスが存在するリージョンを選択します。インスタンスを見つけて、そのインスタンス ID をクリックします。
(任意) インスタンスに読み取り専用インスタンスがある場合、アプリケーションエンドポイントを読み取り専用インスタンスのエンドポイントからプライマリインスタンスのエンドポイントに変更し、その後、読み取り専用インスタンスを削除します。
説明 サービスへの影響を最小限に抑えるため、アプリケーションエンドポイントの変更はオフピーク時間に行ってください。左側のナビゲーションウィンドウで、[メジャーバージョンアップグレード] をクリックします。
説明 メジャーバージョンのアップグレード が表示されない場合は、インスタンスのバージョンと構成を確認してください。詳細については、「前提条件」をご参照ください。[アップグレードチェック] タブで、[アップグレードチェックレポートの作成] をクリックします。
アップグレード先バージョンを選択し、[アップグレードモード] を [ローカルアップグレード] に設定して、[OK] をクリックします。チェック実行中はインスタンスステータスが メンテナンス中のインスタンス に変わり、チェック完了後に 実行中 に戻ります。
チェック結果を確認します:
成功 または 警告: ステップ 2 に進みます。
失敗: [情報の表示] をクリックし、レポートで特定された問題を修正してから、チェックを再度実行します。一般的なエラーの詳細については、「ApsaraDB RDS for PostgreSQL メジャーバージョンアップグレードチェックレポートの解釈」をご参照ください。
重要- 結果が 警告 の場合、問題を修正してチェックを再実行し、結果が 成功 になるまで繰り返します。 - チェックが成功した後にプライマリインスタンスでプラグインを作成した場合は、チェックを再度実行します。
ステップ 2:メジャーエンジンバージョンのアップグレード
[インスタンスのアップグレード] タブをクリックします。警告を読み、アップグレードバージョンを選択して、[アップグレードタスクの作成] をクリックします。
ダイアログボックスで、プロンプトを読み、[OK] をクリックします。
「メジャーエンジンバージョンアップグレードタスクの作成」セクションで、[アップグレードモード] を [ローカルアップグレード] に設定し、「[カットオーバー時間]」を設定します:
即時: 移行が完了した直後にスイッチオーバーが実行されます。
インスタンスの運用・保守時間: スイッチオーバーは、設定されたメンテナンスウィンドウ内で実行されます。
[今すぐ作成] をクリックします。アップグレードタスクが開始されると、インスタンスのステータスは [移行中] に変わります。所要時間はデータベースオブジェクトの数に応じて変動します。進捗は [タスクハブ] で追跡できます。
重要- アップグレードタスクは作成後に変更または削除することはできません。- インスタンスが [移行中] の間は、パラメーターの変更、再起動、インスタンスの解放などの操作は利用できません。
スペックアップは、ソースインスタンスと宛先インスタンスの両方のステータスが[実行中]になると完了します。
説明 [アップグレード履歴] タブで、[アップグレードログ] 列の [情報の表示] をクリックすると、読み取り専用の期間と詳細なアップグレードログを確認できます。読み取り専用の期間は、[切り替え開始時間] と [切り替え終了時間] の間の時間であり、DNS キャッシュのフラッシュ期間は含まれません。
次のステップ
アップグレード前に読み取り専用インスタンスを削除した場合:
宛先インスタンスで読み取り専用インスタンスを作成します。
ご利用のアプリケーションで、エンドポイントを新しい読み取り専用インスタンスを指すように更新します。
アップグレード結果のリファレンス
[アップグレード結果] 列は、[アップグレード履歴] タブにあり、以下のステータスのいずれかを表示します。
| アップグレード結果 | インスタンスのステータス | 意味 |
|---|---|---|
| 実行中 | 移行中 | スペックアップタスクが実行中です。 |
| 成功 | 実行中 | スペックアップタスクが正常に完了しました。 |
API リファレンス
| API オペレーション | 説明 |
|---|---|
| UpgradeDBInstanceMajorVersionPrecheck | メジャーエンジンバージョンのアップグレード前に、事前チェックを実行します。 |
| DescribeUpgradeMajorVersionPrecheckTask | 事前チェックのレポートをクエリします。 |
| UpgradeDBInstanceMajorVersion | メジャーエンジンバージョンをアップグレードします。 |
| DescribeUpgradeMajorVersionTask | メジャーエンジンバージョンのアップグレードタスクの履歴をクエリします。 |
参考
よくある質問
メジャーエンジンバージョンのアップグレード中にインスタンスを変更できますか?
いいえ。アップグレードが完了するまで待ってから、インスタンスに変更を加えてください。
メジャーエンジンバージョンの自動アップグレードはサポートされていますか?
いいえ。メジャーエンジンバージョンのアップグレードは手動で開始する必要があります。
メジャーエンジンバージョンのダウングレードはサポートされていますか?
いいえ。より低いバージョンを実行するには、ターゲットバージョンで新しいインスタンスを購入し、DTS を使用してデータを移行してください。
アップグレード後、ビューを作成する際に `raster_overviews` の競合エラーが発生します。このエラーを修正するにはどうすればよいですか?
これは、PostgreSQL 10 または 11 上の 2.5.2 より前の PostGIS バージョンを PostgreSQL 12 にアップグレードする際に影響します。以下の手順に従ってください:
ソースインスタンスで、PostGIS プラグインをアップグレードします。次のコマンドを 2 回実行して、成功を確認してください:
SELECT PostGIS_Extensions_Upgrade(); SELECT PostGIS_Extensions_Upgrade();PostGIS Raster プラグインを使用しているかどうかに基づいて、修正方法を選択します。
PostGIS Raster を使用している場合:
ソースインスタンスで、拡張機能から
raster_overviewsビューを削除し、プレースホルダーに置き換えます:ALTER EXTENSION PostGIS_Raster DROP VIEW raster_overviews; CREATE OR REPLACE VIEW raster_overviews AS SELECT 1;PostgreSQL インスタンスを少なくとも PostgreSQL 12 にアップグレードします。
宛先インスタンスで、完全なビューを再作成し、拡張機能に再度追加します:
CREATE OR REPLACE VIEW raster_overviews AS SELECT current_database() AS o_table_catalog, n.nspname AS o_table_schema, c.relname AS o_table_name, a.attname AS o_raster_column, current_database() AS r_table_catalog, split_part(split_part(s.consrc, '''::name', 1), '''', 2)::name AS r_table_schema, split_part(split_part(s.consrc, '''::name', 2), '''', 2)::name AS r_table_name, split_part(split_part(s.consrc, '''::name', 3), '''', 2)::name AS r_raster_column, trim(both from split_part(s.consrc, ',', 2))::integer AS overview_factor FROM pg_class c, pg_attribute a, pg_type t, pg_namespace n, ( SELECT connamespace, conrelid, conkey, pg_get_constraintdef(oid) AS consrc FROM pg_constraint ) AS s WHERE t.typname = 'raster'::name AND a.attisdropped = false AND a.atttypid = t.oid AND a.attrelid = c.oid AND c.relnamespace = n.oid AND c.relkind = ANY(ARRAY['r'::char, 'v'::char, 'm'::char, 'f'::char]) AND s.connamespace = n.oid AND s.conrelid = c.oid AND s.consrc LIKE '%_overview_constraint(%' AND NOT pg_is_other_temp_schema(c.relnamespace) AND has_table_privilege(c.oid, 'SELECT'::text); ALTER EXTENSION PostGIS_Raster ADD VIEW raster_overviews;
PostGIS Raster を使用していない場合:
ソースインスタンスで、拡張機能を削除します:
DROP EXTENSION PostGIS_Raster;PostgreSQL インスタンスを少なくとも PostgreSQL 12 にアップグレードします。
アップグレード中にレプリケーションスロットのプリエンプションによって引き起こされるデータの不整合を防ぐにはどうすればよいですか?
アップグレード後にサブスクリプションデータをどこに配置したいかに応じて、次のいずれかのアプローチを選択してください。
サブスクリプションデータをソースインスタンスに保持する場合:
アップグレード中にソースインスタンスが過度の負荷でダウンしないようにしてください。ダウンした場合、レプリケーションスロットが宛先インスタンスによってプリエンプションされ、データの不整合を引き起こす可能性があります。アップグレード後、宛先データベースでサブスクリプションを無効にします:
\c your_database
ALTER SUBSCRIPTION your_subscription_name DISABLE;サブスクリプションデータを宛先インスタンスに移動する場合:
アップグレード前に、ソースインスタンスでサブスクリプションを無効にします:
\c your_database
ALTER SUBSCRIPTION your_subscription_name DISABLE;アップグレード後、宛先インスタンスでサブスクリプションを有効にします:
\c your_database
ALTER SUBSCRIPTION your_subscription_name ENABLE;アップグレード後のサブスクリプションデータの不整合を修正するにはどうすればよいですか?
宛先インスタンス (高バージョン) で、影響を受けるテーブルデータを削除します。その後、
copy_data=trueでサブスクリプションを再作成します。詳細については、「ALTER SUBSCRIPTION」をご参照ください。ON CONFLICTを使用して、ソースインスタンス (低バージョン) から宛先インスタンスにデータをインポートします。次の例は、そのパターンを示しています:CREATE TABLE my_tbl(id INT PRIMARY KEY, t TIMESTAMP, val TEXT); INSERT INTO my_tbl VALUES (1, CURRENT_TIMESTAMP, 'a'); INSERT INTO my_tbl VALUES (2, CURRENT_TIMESTAMP, 'b'); INSERT INTO my_tbl VALUES (3, CURRENT_TIMESTAMP, 'c'); -- 新しいタイムスタンプ:既存の行を更新 INSERT INTO my_tbl VALUES (1, CURRENT_TIMESTAMP, 'd') ON CONFLICT(id) DO UPDATE SET t = excluded.t, val = excluded.val WHERE my_tbl.t < excluded.t; -- 古いタイムスタンプ:行をスキップ INSERT INTO my_tbl VALUES (2, CURRENT_TIMESTAMP - '10 hours'::interval, 'e') ON CONFLICT(id) DO UPDATE SET t = excluded.t, val = excluded.val WHERE my_tbl.t < excluded.t; -- 新しい行:挿入 INSERT INTO my_tbl VALUES (5, CURRENT_TIMESTAMP - '10 hours'::interval, 'f') ON CONFLICT(id) DO UPDATE SET t = excluded.t, val = excluded.val WHERE my_tbl.t < excluded.t;
メジャーエンジンバージョンのアップグレード前に読み取り専用インスタンスを削除する必要があるのはなぜですか?
読み取り専用ノードとそのレプリケーションスロットは、アップグレード後もソースインスタンスにアタッチされたままであり、自動的に宛先インスタンスに転送されません。アップグレード前にそれらを削除し、アップグレード後に宛先インスタンスで再作成してください。