Oracle から Cloud SQL for PostgreSQL への移行に関する問題を診断する

このページでは、次の既知のエラーと推奨されるトラブルシューティングの手順について説明します。

移行ジョブのエラー

移行ジョブ プロセスで、ランタイム中にエラーが発生することがあります。

  • エラーには、ソース データベースの不正なパスワードなど、回復可能なものもあります。これらのエラーが修正されると、移行ジョブは自動的に再開されます。
  • データ レプリケーションのエラーなど、一部のエラーは復元できません。これらのエラーを修正したら、移行ジョブを再起動する必要があります。

エラーが発生すると、移行ジョブのステータスは Failed に変わり、サブステータスは失敗前の最後のステータスを反映します。エラーのトラブルシューティングを行うには、失敗した移行ジョブに移動してエラーを表示し、エラー メッセージに記載されている手順に沿って操作します。エラーの詳細を表示するには、移行ジョブのリンクを使用して Cloud Monitoring に移動します。ログは特定の移行ジョブにフィルタされます。

次の表に、問題の例とその解決方法を示します。

症状 考えられる原因 次の方法をお試しください
エラー メッセージ: Database Migration Service can't set up a tunnel to be connected to the bastion host Database Migration Service が踏み台インスタンスにアクセスできなかったか、踏み台インスタンスが接続を受け入れていません。 ソース接続プロファイル SSH トンネル サーバー構成で転送 SSH トンネルの設定を確認し、もう一度お試しください。
エラー メッセージ: Database Migration Service can't connect to the database または Database Migration Service private connectivity error, cannot connect to the database Database Migration Service は、移行元の Oracle データベースへの接続を確立できませんでした。

プロジェクトからソース データベースにアクセスできることを確認します。 移行元の接続構成方法に関連する設定を確認します。

ORA-12170: TNS:Connect timeout occurred などの特定の Oracle エラーコードが含まれている場合は、 Oracle のドキュメントで詳細を確認してください。

エラー メッセージ: Archiving mode is not ARCHIVELOG ソース データベースが ARCHIVELOG モードで実行されていない。 ARCHIVELOG モードを使用するようにソース データベースを構成します。詳細については、 移行元 Oracle データベースを構成するをご覧ください。
エラー メッセージ: Supplemental logging ("ALL COLUMN LOGGING") isn't turned on for the tables listed below ソース データベースで補助ログデータが有効になっていません。 補足ログデータを有効にして、そのモードを ALL に設定します。詳細については、 移行元 Oracle データベースを構成するをご覧ください。
エラー メッセージ: No Archive Log Files were found in the source Database Migration Service は、閉じられたアーカイブ ログのみを読み取りますが、移行元データベースにログは見つかりませんでした。
  1. 移行元データベースで次のコマンドを実行して、現在のログファイル ALTER SYSTEM SWITCH LOGFILE を閉じます。
  2. ログをもう一度探します。

データベースにアクティブな書き込みオペレーションがない場合は、ログの作成をトリガーするために INSERT オペレーションを 1 つ以上実行する必要があります。

エラー メッセージ: We're missing the necessary permissions to read from the source 移行元データベースの移行ユーザー アカウントに必要な権限がありません。

Database Migration Service は、移行元の接続プロファイルで構成したユーザー アカウントとして移行元に接続します。このアカウントには、ソース データベースのデータを読み取るための特定の権限セット(SELECT ANY TABLE など)が必要です。

移行ユーザー アカウントに必要な権限があることを確認します。詳細については、 移行元 Oracle データベースを構成するをご覧ください。

エラー メッセージ: Unable to connect to the destination database 宛先データベースへの接続中に問題が発生しました。 プロジェクトから宛先データベースにアクセスできることを確認します。 宛先接続の構成方法に関連する設定を確認します。
エラー メッセージ: The following tables don't exist in the destination database: {table_names} 移行しようとしているテーブルが、宛先データベースに存在しません。 Database Migration Service は、移行元のスキーマを変換するときに必要なテーブルと定義を作成します。
エラー メッセージ: password authentication failed for user {username} 宛先データベースのユーザー名またはパスワードが正しく構成されていません。 移行先の PostgreSQL 接続プロファイルが、正しいユーザー名とパスワードで正しく構成されていることを確認します。
エラー メッセージ: The following tables in the destination database don't have primary keys: {table_names} エラー メッセージに表示されるテーブルは宛先データベースに存在しますが、主キーがありません。

Database Migration Service のコンバージョン ワークスペースでは、スキーマを変換するときに、主キーがないテーブルに主キーが自動的に追加されます。

以前のコンバージョン ワークスペースを使用している場合は、移行先で主キーを手動で作成する必要があります。詳細については、 以前のコンバージョン ワークスペースをご覧ください。

警告: The following tables have foreign keys: {table_names} エラー メッセージに表示されるテーブルは宛先データベースに存在しますが、外部キーがあります。

Database Migration Service はトランザクション モードでデータを複製しないため、テーブルが順序どおりに移行されない可能性があります。外部キーが存在し、外部キーを使用する子テーブルが親テーブルの前に移行された場合、レプリケーション エラーが発生することがあります。

このようなデータの整合性の問題を回避するには、移行ユーザーの REPLICATION オプションを使用して外部キーをスキップします。詳細については、 外部キーとトリガーに関する考慮事項をご覧ください。

エラー メッセージ: Unable to resume replication as log position is lost このエラーは、レプリケーション プロセスが長時間一時停止され、ログ位置が失われた場合に発生することがあります。 移行ジョブは、ログの保持期間より長く(またはそれに近い期間)一時停止しないでください。ログ位置が失われた場合は、移行ジョブを再作成する必要があります。
エラー メッセージ: ORA-00942: table or view does not exist このエラーは、Oracle サーバーでのキャッシュ保存が原因で発生することがあります。 データベース ユーザーを再作成して、キャッシングの問題を解決します。
移行ジョブは完全ダンプ フェーズのままで、変更データ キャプチャ(CDC)フェーズに進みません。 Database Migration Service が一部テーブルのフルダンプを引き続き実行している、またはエラーが原因で 1 つ以上のテーブルのフルダンプが完了できない。
  • 移行ジョブのエラーを確認し、テーブルに適用されるエラーを修正するか、関連するテーブルをジョブから削除します。
  • Database Migration Service のログで、進行中の完全ダンプ アクティビティを確認し、完了するまで待ちます。

接続に関する問題

このセクションでは、ネットワーク接続に関する潜在的な問題のトラブルシューティング手順について説明します。

宛先データベースに接続できません: EOF

接続テストを実行すると、[DATABASE] unable to connect to the destination database: EOF エラー メッセージが返されます。

考えられる原因: サービス アタッチメントが正しく構成されていません。

試すことができる操作: サービス アタッチメントの Terraform 構成ファイルで、enable_proxy_protocolfalse に設定されていることを確認します。プロキシ プロトコルは、NGINX や Apache などの HTTP サーバーに対してのみサポートされています。

gcloud を使用して Private Service Connect の設定を作成する場合は、プロキシ プロトコルはデフォルトで無効になっています。

接続タイムアウト、接続拒否

接続テストの実行が失敗するか、タイムアウトします。これは、Private Service Connect の設定内のルーティングが正しく構成されていないことが原因である可能性が高いです。この問題にはいくつかの原因が考えられます。

考えられる原因: Private Service Connect NAT CIDR 範囲が、踏み台が配置されている Private Service Connect サブネット(特に踏み台 VM nic0 インターフェース)にアクセスできるようにするファイアウォール ルールがありません。

試すことができる操作: 組織のポリシーで内部ファイアウォール ルールが制限されていないことを確認します。たとえば、 PSC が有効でない Cloud SQL インスタンスの宛先プライベート IP 接続を構成するための Terraform スクリプトの例で定義されている psc_sp_in_fw ファイアウォール ルールなどです。

考えられる原因: プロキシが停止している。指定されたポートにリスナーがないため、接続がハングします。

試すことができる操作: 踏み台 VM への SSH 接続を確立し、次のコマンドを使用してプロキシを検索できます。

  • netstat -tunalp | grep PORT

コマンドに対するレスポンスを分析します。

  • レスポンスが空の場合、プロキシは停止しています。次のコマンドを実行してみてください。

    sudo su; cd / を実行し、sudo dpkg -s dante-server を実行して Dante サーバーがインストールされているかどうかを確認します。

    • プロキシがインストールされている場合は、次のメッセージが表示されます。

      Status: install ok installed

    • プロキシがインストールされていない場合は、ルーターがないことが原因と考えられます。ルーターを追加し、apt-get install dante-server を実行してプロキシをダウンロードできるかどうかを確認します。

  • プロキシが実行されていて、指定されたポートでリッスンしている場合は、次の手順でプロキシへの接続を開いてみましょう。

    1. PostgreSQL クライアントをインストールします。

      sudo apt-get install postgresql-client

    2. PostgreSQL データベースに接続します。

      psql -h 127.0.0.1 -p PORT -U DBUSERNAME -W(パスワードの入力を求められます)。

      次のように置き換えます。

      • PORT: データベースのポート番号。
      • DBUSERNAME: PostgreSQL データベースへの接続に使用するユーザー名。
    3. telnet クライアントをインストールします。

      sudo apt-get install telnet

    4. telnet クライアントに接続します。

      telnet 127.0.0.1 PORT

      PORT は、データベースのポート番号に置き換えます。

    コマンドの結果に応じて、次の対応を行います。

    • コマンドで接続を開くことができない場合は、プロキシ ログを調べて根本原因を特定してみてください。根本原因は、Cloud SQL インスタンスの設定によって異なる場合があります。

    • telnet を使用して接続が開かれたが、クライアントでハングする場合は、踏み台の IP アドレス ルーティングに問題がある可能性があります。VM で、ターミナルに ip route と入力します。セカンダリ nicnic1DB_SUBNETWORK_GATEWAY IP アドレス)を使用して、Cloud SQL インスタンスのプライベート IP アドレスに接続を転送するルーティング ルールが見つかるかどうかを確認します。

考えられる原因: サービス アタッチメントが、Database Migration Service からのエンドポイント接続を受け入れません。サービス アタッチメントには、承認されたプロジェクトのリストが保持されます。このリストに Database Migration Service プロジェクトは含まれていません。

試すことができる対応: この問題を解決するには、次のいずれかをお試しください。

  • Google Cloud コンソールで [Private Service Connect] に移動します。

    [Private Service Connect] に移動

    [公開サービス] タブで、サービス アタッチメントの Database Migration Service からの接続を承認します(保留中の場合)。

  • リクエスト元のプロジェクトを、サービス アタッチメントの許可リストに登録します(拒否された場合)。

    それでも問題が解決しない場合は、接続プロファイルを再作成します。

  • Private Service Connect 接続に関連付けられている 接続プロファイルを削除し、再作成します。

Oracle SCAN エラーのトラブルシューティング

このセクションでは、単一クライアント アクセス名(SCAN)機能を使用して Oracle Real Application Clusters(RAC)ソースから移行する際に発生する可能性のある問題について説明します。

Oracle SCAN データベースへの接続を確立できない

接続テストの実行が失敗するか、タイムアウトします。

考えられる原因: Oracle SCAN ソース データベースに直接接続しようとしている可能性があります。Database Migration Service は、Oracle RAC 環境の SCAN 機能を使用するデータベースへの直接接続をサポートしていません。

試すことができる対応: この問題を解決するには、次のいずれかをお試しください。

  • いずれかのノードに直接接続します。

  • Oracle Connection Manager を使用する。

  • HAProxy などのリバース プロキシ ソリューションを使用して、プライベート接続構成を作成します。