移行ジョブのプロセスで、ランタイム中にエラーが発生することがあります。
- エラーには、ソース データベースの不正なパスワードなど、回復可能なものもあります。つまり、エラーを修正して移行ジョブを自動的に再開できます。
- データのレプリケーション エラーなど、回復できないものもあります。この場合、移行ジョブを最初から再開する必要があります。
エラーが発生すると、移行ジョブのステータスが Failed に変わり、サブステータスには失敗する前の最後のステータスが反映されます。
エラーをトラブルシューティングするには、失敗した移行ジョブに移動してエラーを表示し、エラー メッセージに記載されている手順に沿って操作します。
エラーの詳細を表示するには、移行ジョブのリンクを使用して Cloud Monitoring に移動します。ログは、特定の移行ジョブにフィルタリングされます。
次の表に、問題の例と解決方法を示します。
| この問題については... | 次のような問題が考えられます... | 次のことを試します... |
|---|---|---|
既存の移行先インスタンスに移行すると、次のエラー メッセージが表示されます。
The destination instance contains existing data or user defined
entities (for example databases, tables, or functions). You can only
migrate to empty instances. Clear your destination instance and retry
the migration job. |
移行先の Cloud SQL インスタンスに余分なデータが含まれています。移行できるのは、空の既存のインスタンスのみです。 既知の制限事項をご覧ください。 | 移行先インスタンスをプロモートして読み取り/書き込みインスタンスにし、余分なデータを削除して、移行ジョブを再試行します。既存の移行先インスタンスから余分なデータを削除するをご覧ください。 |
| ソース データベース インスタンスに接続できません。 | ソース データベース インスタンスと移行先インスタンスの間に接続の問題がありました。 | 接続のデバッグの手順に沿って操作します。 |
| ソース データベースと移行先データベースのバージョンに互換性がないため、移行ジョブを実行できません。 | ソース データベースと移行先データベースのバージョンは、サポートされている組み合わせではありません。具体的には、指定されたソース データベースのバージョンは、移行先データベースのバージョンと互換性がありません。 | 移行先データベースのバージョンが、ソース データベースのバージョンと同じか、1 つ上のメジャー バージョンであることを確認します。次に、新しい移行ジョブを作成します。 |
| ソースでデータ定義言語(DDL)またはデータ操作言語(DML)がブロックされています。 | ACCESS EXCLUSIVE ロックを必要とし、完全なダンプフェーズ中に実行される DDL はブロックされます。 |
最初の同期プロセス(完全なダンプ)では、 たとえば、テーブルが最初の同期プロセス中であり、同じテーブルで |
エラー メッセージ: No pglogical extension installed on databases (X)
|
1 つ以上のソース データベースに pglogical がインストールされていません。 |
移行元インスタンスのデータベースに pglogical をインストールするには、次のガイドラインに沿って操作します。 |
PostgreSQL バージョン 15 に移行する際に、接続の再試行を複数回行った後、次のいずれかの現象が発生します。
|
この問題は、
拡張機能のデッドロックの問題が原因であることがよくあります。pglogical詳細については、GitHub の
pglogical Issue Tracker をご覧ください。 |
移行ジョブを再試行するか、最初に中間バージョンの PostgreSQL に移行します
。詳細については、
エラー メッセージ: Cannot connect to invalid databaseをご覧ください。
|
エラー メッセージ: Replication user 'x' doesn't have sufficient privileges.
|
Database Migration Service を使用しているユーザーに、指定されたオペレーションを実行するために必要な権限がありません。 | このユーザーに必要な権限があることを確認するには、次のガイドラインに沿って操作します。 |
エラー メッセージ: Unable to connect to source database server.
|
Database Migration Service は、ソース データベース サーバーへの接続を確立できません。 | 移行元データベース インスタンスと移行先データベース インスタンスが相互に通信できることと、移行ジョブの設定を定義したときに表示された必要な前提条件をすべて満たしていることを確認します。 |
エラー メッセージ: The source database 'wal_level' configuration must be equal to 'logical'.
|
ソース データベースの wal_level が logical 以外の値に設定されています。 |
wal_level を logical に設定します。 |
エラー メッセージ: The source database 'max_replication_slots' configuration is not sufficient.
|
max_replication_slots パラメータが正しく構成されていません。 |
このパラメータを正しく設定するには、次のガイドラインに沿って操作します。 |
エラー メッセージ: The source database 'max_wal_senders' configuration is not sufficient.
|
max_wal_senders パラメータが正しく構成されていません。 |
このパラメータを正しく設定するには、次のガイドラインに沿って操作します。 |
エラー メッセージ: The source database 'max_worker_processes' configuration is not sufficient.
|
max_worker_processes パラメータが正しく構成されていません。 |
このパラメータを正しく設定するには、次のガイドラインに沿って操作します。 |
|
エラー メッセージ: または
エラー メッセージ: |
移行ジョブの昇格中に、レプリケーションに必要な設定をクリーンアップできません。 | データベースごとに、 実行するコマンドの詳細については、レプリケーション スロットをクリーンアップするをご覧ください。 |
|
エラー メッセージ: |
Database Migration Service に提供されたソース CA 証明書にルート証明書のみが含まれている可能性があります。ただし、ソース証明書にはルート証明書と中間証明書が必要です。 たとえば、Amazon Relational Database Service の場合、rds-ca-2019-root.pem 証明書を使用すると、この問題が発生する可能性があります。 |
ルート証明書と必要な中間証明書をすべて含む、結合されたソース CA 証明書を作成します。 Amazon Relational Database Service のユースケースでは、rds-ca-2019-root.pem 証明書の代わりに rds-combined-ca-bundle.pem 証明書を使用します。 |
|
エラー メッセージ: |
max_locks_per_transaction パラメータに設定された値が十分ではありません。 |
このパラメータの値を {max_number_of_tables_per_database}/(max_connections + max_prepared_transactions) 以上に設定します。 |
|
エラー メッセージ: |
pglogical パッケージが移行元インスタンスに正しくインストールされていません。 | このパッケージを正しくインストールする方法の詳細については、移行元インスタンスに pglogical パッケージをインストールするをご覧ください。 |
|
エラー メッセージ: |
構成されているソースが復旧モードになっています。 | 復旧モードではないソースを構成します。 |
| 完全なダンプに時間がかかります。 | Cloud SQL の移行先で、ソース データベースから大量のデータをインポートするのに時間がかかることがあります。 |
|
エラー メッセージ: subscriber {subscriber_name} initialization failed during nonrecoverable step (d), please try the setup again |
完全なダンプフェーズ中に移行ジョブが失敗し、ジョブを復旧できません。ソース データベース インスタンスが再起動されたか復旧モードになっているか、 問題の根本原因を特定するには:
|
|
エラー メッセージ: ERROR: unknown column name {column_name} |
プライマリ ノードのレプリケートされたテーブルに列が追加されましたが、レプリカノードには追加されていません。 |
継続的な移行では、データ操作言語(DML)の変更のみが自動的に更新されます。移行元と移行先のデータベースの互換性を維持するようにデータ定義言語(DDL)の変更を管理するのはユーザーの責任であり、次の 2 つの方法があります。
継続的な移行で |
エラー メッセージ: ERROR: cannot truncate a table referenced in a foreign key constraint |
ユーザーが外部キー制約のあるテーブルを切り捨てようとしました。 |
最初に外部キー制約を削除してから、テーブルを切り捨てます。 |
エラー メッセージ: ERROR: connection to other side has died |
|
|
警告メッセージ: migration job test configuration has returned the following warnings: Some table(s) have limited support. |
ソースには、サポートが制限されているテーブル(主キーのないテーブルなど)があります。 |
これは警告メッセージです。移行を続行できますが、サポートされていないエンティティ(主キーのないテーブルなど) は移行されません。詳細については、 移行元データベースを構成するをご覧ください。 |
| 選択したデータベースを移行し、移行ジョブが 1 つ以上のデータベースにデータをレプリケートできない場合、データベースのリストに [失敗] ステータスが表示されます。 | 移行ジョブのエラーはさまざまです。 | [エラー] 列で [エラーを表示] をクリックして修正します。失敗したデータベースを移行ジョブから削除することもできます。 移行ジョブから失敗したデータベースを削除する方法の詳細については、移行ジョブを管理するをご覧ください。 |
既存の移行先インスタンスから余分なデータを削除する
既存の移行先インスタンスに移行すると、次のエラー メッセージが表示されます。The destination instance contains existing data or user defined
entities (for example databases, tables, or functions). You can only
migrate to empty instances. Clear your destination instance and retry
the migration job.
この問題は、移行先インスタンスに余分なデータが含まれている場合に発生することがあります。 移行できるのは、空の既存のインスタンスのみです。 既知の制限事項をご覧ください。
次のことを試します
次の手順で、移行先インスタンスから余分なデータを削除し、移行ジョブを再開します。
- 移行ジョブを停止します。
- この時点で、移行先の Cloud SQL インスタンスは `read-only` モードになっています。 移行先インスタンスを昇格させて書き込みアクセス権を取得します。
- 移行先の Cloud SQL インスタンスに接続します。
- 移行先インスタンスのデータベースから余分なデータを削除します。移行先には、システム構成データのみを含めることができます。移行先データベース
にユーザーデータ(テーブルなど)を含めることはできません。データベースで実行してシステム以外のデータを検索できる SQL ステートメントは次のとおりです。
たとえば、
システム以外のデータベースを取得する SQL ステートメントの例(クリックして展開)
SELECT datname FROM pg_catalog.pg_database WHERE datname NOT IN ('cloudsqladmin', 'template1', 'template0', 'postgres');
postgresデータベース内のシステム以外のデータを取得する SQL ステートメントの例(クリックして展開)postgresデータベースはシステム データベースですが、システム以外のデータを含めることができます。postgresデータベースでこれらのステートメントを実行してください。psqlクライアントを使用して移行先インスタンスに接続する場合は、\connect {database_name_here}コマンドを使用して、接続をリセットせずに別のデータベースに切り替えることができます。SELECT table_schema, table_name FROM information_schema.tables WHERE table_schema != 'information_schema' AND table_schema not like 'pg\_%'; SELECT routine_schema, routine_name FROM information_schema.routines WHERE routine_schema != 'information_schema' AND routine_schema not like 'pg\_%'; SELECT extname FROM pg_extension WHERE extname != 'plpgsql';
- 移行ジョブを開始します。
レプリケーション スロットをクリーンアップする
次のいずれかのメッセージが表示されます。
Cleanup may have failed on source due to error: generic::unknown: failed to connect to on-premises database.Error promoting EM replica: finished drop replication with errors.
次のような問題が考えられます
Cloud SQL インスタンスを昇格させる際に、ソース インスタンスが Cloud SQL インスタンスから到達できない場合(ソース インスタンスが実行されていない場合や、ソース インスタンスの許可リストから Cloud SQL インスタンスを削除した場合など)、移行ジョブの昇格中にレプリケーションに必要な設定をクリーンアップできません。レプリケーション スロットを手動でクリーンアップする必要があります。
次のことを試します
データベースごとに、superuser 権限を持つユーザーとして次のコマンドを実行します。
エラー メッセージからレプリケーション スロット名を取得し、次のコマンドを実行してスロットを 1 つずつ削除します。
select pg_drop_replication_slot({slot_name});-
エラー メッセージにレプリケーション スロット名が表示されない場合は、次のコマンドを実行して既存のレプリケーション スロットをクエリします。
select pg_drop_replication_slot(slot_name) from pg_replication_slots where slot_name like '%cloudsql%' and active = 'f';
-
ソース インスタンスを使用している Cloud SQL レプリカがない場合は、次のコマンドを実行して
pglogical設定をクリーンアップします。select pglogical.drop_node(node_name) from pglogical.node where node_name like
'cloudsql'; -
pglogical拡張機能が不要になった場合は、次のコマンドを実行して拡張機能をアンインストールします。DROP EXTENSION IF EXISTS pglogical;
エラー メッセージ:
Cannot connect to invalid database
PostgreSQL バージョン 15 に移行する際に、接続の再試行を複数回行った後、次のいずれかの現象が発生します。
-
Cannot connect to invalid databaseエラー メッセージが表示されます。 - 移行ジョブがデータベースの完全なダンプを実行しているときに、ストレージ使用量移行ジョブ指標が長時間経過しても進捗を示しません。
次のような問題が考えられます
この問題は、pglogical 拡張機能のデッドロックの問題が原因であることがよくあります。詳細については、GitHub の
pglogical Issue Tracker をご覧ください。
次のことを試します
新しい移行先インスタンスで移行ジョブを再度実行する
問題が発生した移行先データベースを削除して、移行ジョブを再作成してみてください。手順は次のとおりです。
- 問題が発生した移行先インスタンスを削除します。 Cloud SQL for PostgreSQL のドキュメントでインスタンスを削除する をご覧ください。
- 失敗した移行ジョブを削除します。 移行ジョブを確認するをご覧ください。
- 移行ジョブを再作成します。 移行ジョブを作成するをご覧ください。
中間バージョンに移行する
PostgreSQL 14 などの以前の PostgreSQL バージョンに移行することを検討してください。 移行が成功したら、目的の PostgreSQL 15 インスタンスにアップグレードできます。Cloud SQL for PostgreSQL のドキュメントで データを移行してデータベースのメジャー バージョンをアップグレードするをご覧ください。
ユーザーとロールを管理する
既存のユーザーを移行する
現在、Database Migration Service は、移行元インスタンスから移行先 Cloud SQL インスタンスへの既存のユーザーの移行をサポートしていません。この移行を管理するには、Cloud SQL でユーザーを手動で作成します。
cloudsqlexternalsync ユーザーについて
移行中、Cloud SQL レプリカのすべてのオブジェクトは cloudsqlexternalsync ユーザーが所有します。データの移行後、次の手順でオブジェクトのオーナーシップを他のユーザーに変更できます。
GRANT cloudsqlexternalsync to {USER}コマンドを実行します。- データベースごとに、
reassign owned by cloudsqlexternalsync to {USER};コマンドを実行します。 cloudsqlexternalsyncユーザーを削除するには、drop role cloudsqlexternalsyncコマンドを実行します。
新しい Cloud SQL インスタンスにデータをインポートする
Database Migration Service が Cloud Storage に移行した Cloud SQL インスタンスからデータをエクスポートし、Cloud Storage からスタンドアロンの Cloud SQL インスタンスにデータをインポートすると、移行先インスタンスに cloudsqlexternalsync ユーザーが存在しないため、インポートが失敗することがあります。
この問題を軽減するには、移行先インスタンスに ユーザーcloudsqlexternalsyncを作成するか、移行したインスタンスからユーザーを削除します。