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 データベースへの接続を確立できませんでした。

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

特定の Oracle エラーコード(ORA-12170: TNS:Connect timeout occurredなど)が含まれている場合は、 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. もう一度ログを検索します。

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

エラー メッセージ: 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 のログで進行中の完全ダンプ アクティビティを確認し、完了するまで待ちます。 and wait until it's finished.

接続に関する問題

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

移行先データベースに接続できない: 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 プロジェクトがリストに含まれていません。

次の方法をお試しください: この問題を解決するには、次のいずれかを試してください。

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

    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 などのリバース プロキシ ソリューションを使用して、プライベート接続構成を作成します。