クラウド移行評価レポートのステータスが [失敗] の場合、[操作] 列の [レポートを表示] をクリックすると、どのチェックが失敗したかを確認できます。各チェックは、特定の互換性や設定の要件に対応しています。
レポートの重大度レベル:
| レベル | 説明 | 必要なアクション |
|---|---|---|
| エラー | 移行の失敗を招くブロッキングの問題 | 移行を再試行する前に、すべてのエラーを修正してください |
| 警告 | 移行後に予期せぬ動作を引き起こす潜在的なリスク | 移行する前に確認し、対処してください |
この評価では、次のチェックが実行されます:
クラウド移行の実行手順については、「ApsaraDB RDS for PostgreSQL インスタンスのクラウド移行機能の使用」をご参照ください。
RDSが空かどうかのチェック
[チェック項目:] RDS データベースのチェック
エラーメッセージ:
error: postgres not empty, check if any table exists
影響:移行では、移行先の ApsaraDB RDS for PostgreSQL インスタンスにデータが新規に書き込まれます。移行先にすでにデータベースやテーブルが存在する場合、移行は失敗するか、データが重複します。
[解決策:]
ApsaraDB RDS for PostgreSQL インスタンスから template0、template1、および postgres 以外のすべてのデータベースを削除します。次に、postgres データベースで、ha_health_check 以外のすべてのテーブルを削除します。
ソース接続性のチェック
このチェックでは、ソースのセルフマネージド PostgreSQL インスタンスと移行先の ApsaraDB RDS for PostgreSQL インスタンス間のネットワークおよび認証アクセスを検証します。6 つのサブチェックを実行します。
IP接続性のチェック
エラーメッセージ:
error: XX.XX.XX.XX is unapproachable
影響:移行サービスがソースホストに到達できません。完全バックアップとレプリケーションは直ちに失敗します。
[解決策:]
-
自己管理型の PostgreSQL インスタンスが Elastic Compute Service (ECS) インスタンス上で実行されている場合、ソースホストとして ECS インスタンスの [プライベート IP アドレス] を入力してください。プライベート IP アドレスを確認するには、「IP アドレスの表示」をご参照ください。
-
セルフマネージド PostgreSQL インスタンスがデータセンターで実行されている場合は、ソースホスト上の DNS サーバーの IP アドレスを入力します。
ポート接続性のチェック
エラーメッセージ:
error: 5432 is unapproachable
影響:移行サービスは PostgreSQL への TCP 接続を確立できません。移行を開始できません。
[解決策:]
以下の原因のうち、1 つまたは両方に対処してください:
-
リモート接続が有効になっていない: ソースインスタンスの
postgresql.confファイルにlisten_addresses = '*'を追加します。 詳細については、「自己管理型 PostgreSQL インスタンスの postgresql.conf ファイルを設定する」をご参照ください。 -
ファイアウォールがポート 5432 をブロックしている: ファイアウォールを設定してポート 5432 でのインバウンドトラフィックを許可するか、移行を開始する前にファイアウォールを無効にします。詳細については、「サーバーのファイアウォールの設定」をご参照ください。
データベース接続性のチェック
エラーメッセージ:
error: cannot connect to source database by migratetest:123456
影響:移行サービスはソースデータベースで認証できません。移行を開始できません。
[解決策:]
以下の原因のうち、1 つまたは両方に対処してください:
-
パスワードが正しくない: 手動で接続して認証情報が機能することを確認してください。パスワードをリセットするには、以下を実行します:
ALTER USER migratetest WITH PASSWORD '123456'; -
pg_hba.conf が RDS VPC からの接続を許可するように設定されていません:
pg_hba.confに次の行を追加します:host all migratetest <ApsaraDB RDS for PostgreSQLインスタンスが属するVPCのCIDR ブロック> md5pg_hba.confの更新の詳細については、「pg_hba.conf ファイルを更新する」をご参照ください。
アカウントのレプリケーション権限のチェック
エラーメッセージ:
error: migratetest has no replication privilege
影響:移行サービスはストリーミングレプリケーションを使用して進行中の変更を同期します。REPLICATION 権限がない場合、完全バックアップの完了後に増分レプリケーションが失敗します。
[解決策:]
以下の原因のうち、1 つまたは両方に対処してください:
-
アカウントにREPLICATION権限がない: 権限を付与します:
ALTER ROLE migratetest REPLICATION; -
pg_hba.conf で RDS VPC からのレプリケーション接続が許可されていません:
pg_hba.confに次の行を追加します:host replication migratetest <ApsaraDB RDS for PostgreSQLインスタンスが属するVPCのCIDR ブロック> md5pg_hba.confの更新の詳細については、「pg_hba.conf ファイルを更新する」をご参照ください。
アカウントのCREATEROLE権限のチェック
エラーメッセージ:
error: migratetest has no createrole privilege
影響:移行サービスは移行先インスタンスでロールを再作成する必要があります。CREATEROLE 権限がないと、ロールの移行は失敗します。
[解決策:]
CREATEROLE 権限を付与してください:
ALTER ROLE migratetest CREATEROLE;
アカウントのpg_monitor権限のチェック
エラーメッセージ:
error: migratetest should be a member of pg_monitor to monitor replication status
影響: 移行サービスは、レプリケーションの進捗を追跡するために pg_stat_replication と pg_stat_wal_receiver を照会します。pg_monitor ロールがないと、サービスはレプリケーションが追いついていることを確認できず、移行が停止したり、サイレントに失敗したりする可能性があります。
[解決策:]
pg_monitor ロールを付与する:
GRANT pg_monitor TO migratetest;
ソースバージョンのチェック
[チェック項目:] メジャーバージョンの一貫性チェック
エラーメッセージ:
error: version mismatch, source version:10, current version:13.0
影響:メジャーバージョンをまたいだ移行はサポートされていません。ソースと移行先のメジャーエンジンバージョンが異なる場合、移行は失敗します。
[解決策:]
セルフマネージド PostgreSQL インスタンスと同じメジャーエンジンバージョンを実行する ApsaraDB RDS for PostgreSQL インスタンスを購入してください。
ソースglibcバージョンのチェック
[チェック項目:] ソース glibc バージョンの互換性を確認
警告メッセージ:
warning: source glibc version is not compatible with rds pg
影響:GNU C ライブラリ (glibc) のバージョンは、PostgreSQL が UTF-8 エンコーディングで文字をソートする方法に影響します。バージョン 2.28 では、異なる照合順序が導入されました。ソースと移行先で glibc のバージョンが異なる場合、C 以外の照合順序を持つテキストインデックスは、移行後に予期しない順序で結果を返し、クエリの正確性に影響を与える可能性があります。
[解決策:]
以下の診断クエリを実行して、データに対する実際のリスクを評価してください。
-
現在の照合順序がデータに影響するかどうかを確認してください:
-
結果が
trueの場合、照合順序は影響を受けません。これ以上の操作は必要ありません。 -
結果が
falseの場合、ステップ 2 に進みます。
BEGIN; CREATE TEMP TABLE testcollation(id varchar(20) COLLATE "en_US.utf8") ON COMMIT DROP; INSERT INTO testcollation VALUES('-1'),('1'); SELECT id='1' FROM testcollation ORDER BY id LIMIT 1; ROLLBACK; -
-
C 以外の照合順序を使用しているデータベースがあるかどうかを確認してください:
-
行が返されない場合、移行に照合順序のリスクはありません。これ以上の対応は不要です。
-
行が返された場合、ステップ 3 に進みます。
SELECT datname, datcollate FROM pg_database WHERE datcollate NOT IN ('C', 'POSIX'); -
-
すべてのデータベースで、C 以外の照合順序を持つすべてのインデックスを特定してください:
-
行が返されない場合、移行に照合順序のリスクはありません。
-
行が返された場合、影響を受けるインデックスは移行後に正しくないソート結果を返す可能性があります。続行する前に、これらのインデックスがアプリケーションのクエリに影響するかどうかを評価してください。
WITH result AS ( WITH defcoll AS ( SELECT datcollate AS coll FROM pg_database WHERE datname = current_database() ) SELECT indrelid::regclass::text relname, indexrelid::regclass::text indexname, CASE WHEN c.collname = 'default' THEN defcoll.coll ELSE c.collname END AS collation FROM (SELECT indexrelid, indrelid, indcollation[i] coll FROM pg_index, generate_subscripts(indcollation, 1) g(i)) s JOIN pg_collation c ON coll=c.oid CROSS JOIN defcoll WHERE collprovider IN ('d', 'c') AND collname NOT IN ('C', 'POSIX') ) SELECT result.relname, result.indexname, result.collation FROM result WHERE result.collation NOT IN ('C', 'POSIX'); -
ディスクサイズのチェック
[チェック項目:]ディスク容量が十分であることを確認
エラーメッセージ:
error: source_db_size > disk_size * 0.95
影響:ソースデータは、移行先の利用可能なストレージの 95% 以内に収まる必要があります。移行先のストレージが小さすぎる場合、完全バックアップの転送が途中で失敗し、移行先が不完全な状態になります。
[解決策:]
-
ソースインスタンスの合計データサイズを確認してください (結果は MB 単位):
SELECT SUM(pg_database_size(pg_database.datname))/1024/1024 AS size FROM pg_database; -
必要なストレージを計算してください。移行先のストレージは、ソースのデータサイズの 110% 以上である必要があります。たとえば、ソースが 100 GB を使用している場合、移行先には少なくとも 110 GB の利用可能なストレージが必要です。
-
ApsaraDB RDS for PostgreSQL インスタンスのストレージを拡張してください。手順については、「インスタンス仕様の変更」をご参照ください。
wal_keep_sizeのチェック
[チェック項目:] WAL 保持サイズが十分に大きいことを確認
警告メッセージ:
warning: wal_keep_size X MB is too small. Try to set wal_keep_segments or wal_keep_size large enough ensure pg_basebackup success
影響: 移行中、pg_basebackup はソースデータベースのフル スナップショットを転送します。このとき、ソースが pg_basebackup によるデータコピーよりも速く WAL を生成し、かつソースが十分な WAL セグメントを保持していない場合、pg_basebackup は「WAL segment has been removed」エラーで失敗します。
[解決策:]
ApsaraDB RDS for PostgreSQL インスタンスの WAL 保持設定を増やし、pg_basebackup の失敗のリスクを低減します:
-
PostgreSQL 13 以降:
wal_keep_sizeの値を増やします。 -
PostgreSQL 13 未満:
wal_keep_segmentsの値を増やします。
PostgreSQL 13 より前のバージョンでは、2 つのパラメーターの関係は wal_keep_size = wal_keep_segments × wal_segment_size です。
仕様パラメータのチェック
[チェック項目:] 仕様パラメーターが大きすぎないか確認
エラーメッセージ:
error: max_connections too large, value=XXX
error: max_prepared_transactions too large, value=XXX
影響: 移行元インスタンスの max_connections または max_prepared_transactions が、移行先 RDS インスタンスの対応する値の 100 倍を超えている場合、移行サービスがレプリケーションリンクを確立する際に、移行先インスタンスの起動に失敗する可能性があります。
[解決策:]
ソースインスタンスで max_connections と max_prepared_transactions を、移行先の値の 100 倍以内になるように減らします。
max_connectionsおよびmax_prepared_transactionsへの変更を反映させるには、ソース PostgreSQL インスタンスの再起動が必要です。
RDSユーザーのチェック
[チェック項目:] rds システムユーザーが占有されているかどうかの確認
警告メッセージ:
warning: Check if rds system user is occupied ...XXX will be reused in rds
影響: ApsaraDB RDS for PostgreSQL は、アカウント aurora、replicator、および pgxxx を内部システム用として予約しています。これらのアカウントがソースインスタンスに存在する場合、移行によって移行先でそれらの設定が上書きされ、管理機能が破損する恐れがあります。
[解決策:]
自己管理型の PostgreSQL インスタンスでは、アカウント aurora、replicator、および pgxxx を使用しないようにしてください。
拡張機能のチェック
このチェックでは、ソースのセルフマネージド PostgreSQL インスタンスと移行先の ApsaraDB RDS for PostgreSQL インスタンス間の拡張機能の互換性を検証します。3 つのサブチェックを実行します。
ソース拡張機能のサポート状況チェック
エラーメッセージ:
error: Check source supported extensions XXX not supported
影響:ソースに存在するが ApsaraDB RDS for PostgreSQL でサポートされていない拡張機能は、移行先で作成できません。移行を続行すると、これらの拡張機能に依存するオブジェクトは機能しなくなります。
[解決策:]
ソースインスタンスからサポートされていない拡張機能を削除してください:
DROP EXTENSION <拡張機能名>;
ソース拡張機能のバージョンが新しい場合のチェック
エラーメッセージ:
error: Check source extensions with higher version XXX
影響:ApsaraDB RDS for PostgreSQL は、提供されているバージョンよりも新しいバージョンの拡張機能を読み込むことができません。拡張機能は移行先で初期化に失敗し、依存するオブジェクトが破損する原因となります。
[解決策:]
影響を受ける拡張機能を、移行先と同じバージョンでソースインスタンスに再インストールしてください:
DROP EXTENSION <拡張機能名>;
CREATE EXTENSION <拡張機能名> VERSION '<移行先のバージョン>';
ソース拡張機能のバージョンが古い場合のチェック
警告メッセージ:
warning: Check source extensions with lower version XXX
影響:ソースインスタンスの拡張機能は、移行先の拡張機能よりも古いバージョンです。これは想定内の動作であり安全です。拡張機能は移行後に自動的に移行先のバージョンにアップグレードされます。
[解決策:]
対応は不要です。
PostgreSQLシステムカタログのチェック
このチェックでは、ソースインスタンスのシステムカタログを検査し、ApsaraDB RDS for PostgreSQL と互換性のない設定がないか確認します。4 つのサブチェックを実行します。
サポートされていない手続き言語
エラーメッセージ:
error: disallowed language exist in databases [xxx, xxx], the languages allowed are [c, internal, sql, plpgsql, pltcl, plperl].
影響:ApsaraDB RDS for PostgreSQL は、C、internal、SQL、PL/pgSQL、PL/Tcl、PL/Perl のみをサポートします。他の言語で書かれた関数は移行できず、移行先でエラーになります。
[解決策:]
影響を受けるデータベースから、サポートされていない言語をソースインスタンスから削除してください:
DROP LANGUAGE <言語名>;
ラージオブジェクト
エラーメッセージ:
error: large object exist in databases [xxx, xxx].
影響:ApsaraDB RDS for PostgreSQL は、PostgreSQL のラージオブジェクトをサポートしていません。ソースインスタンスのラージオブジェクトは移行できず、移行先には存在しなくなります。
[解決策:]
移行する前に、影響を受けるデータベースからすべてのラージオブジェクトをソースインスタンスから削除してください。
デフォルト ACL 設定
エラーメッセージ:
error: default acl settings exist in databases [xxx, xxx].
影響: ALTER DEFAULT PRIVILEGES ステートメントにより、今後作成されるオブジェクトのデフォルト権限を格納する pg_catalog.pg_default_acl にデータが入力されます。これらの設定は直接移行できず、移行チェックが失敗する原因となります。
[解決策:]
-
ソースインスタンスで、すべてのデフォルト権限を取り消して
pg_default_aclをクリアします:ALTER DEFAULT PRIVILEGES ... REVOKE ...; -
移行が完了したら、移行先インスタンスでデフォルト権限を再適用してください:
ALTER DEFAULT PRIVILEGES ... GRANT ...;
空でないシステムテーブル (pg_parameter_acl および pg_db_role_setting)
警告メッセージ:
warning: Invalid system tables: [pg_parameter_acl, pg_db_role_setting], these system tables should be empty.
影響:
-
pg_parameter_aclは、カーネルパラメーターに対するユーザーごとのアクセス権限を記録します。 ApsaraDB RDS for PostgreSQL はこれらの権限を内部で管理するため、ソースのエントリを移行先に適用することはできません。 -
pg_db_role_settingは、データベースごと、ロールごとのデフォルトのパラメーター値を記録します。移行前にテーブルがクリアされていない場合、これらの設定は正しく引き継がれません。
[解決策:]
-
ソースインスタンスで両方のシステムテーブルをクリアしてください:
DELETE FROM pg_parameter_acl; DELETE FROM pg_db_role_setting; -
移行が完了した後、移行先インスタンスの異なるデータベースでユーザーのデフォルト権限を設定してください。
予約済みロールの権限チェック
チェック内容:ソースインスタンスのアカウントに対し、許可されていない予約済みロールの権限が付与されているかを確認します。
エラーメッセージ:
error: some disallowed reserved roles [pg_write_server_files] are granted to user. you should revoke these roles from their members
影響: ApsaraDB RDS for PostgreSQL は、マネージド環境で許可されていないサーバーファイルシステムの操作へのアクセスを提供する pg_write_server_files などの特定の組み込みロールを制限します。これらのロールがソースインスタンスのアカウントに付与されている場合、移行は失敗します。
[解決策:]
ソースインスタンスのすべてのアカウントから、許可されていない予約済みロールを取り消してください。例:
REVOKE pg_write_server_files FROM "user";