DBMS_CLOUD_IMPORTを使用したデータの移行

DBMS_CLOUD_IMPORTを使用すると、シンプルで一貫性のあるアプローチを使用して、OracleデータベースおよびOracle以外のデータベースからOracle Autonomous AI Databaseにデータをインポートできます。

DBMS_CLOUD_IMPORTを使用したデータの移行

複数のデータベース・システムで作業する場合、テクノロジ、フォーマットおよびツールの違いにより、データの移動が複雑になることがあります。DBMS_CLOUD_IMPORTは、プラットフォーム間でデータをインポートするための統一されたアプローチを提供し、複数のツールやワークフローを管理する必要をなくすことで、このプロセスを簡素化します。

DBMS_CLOUD_IMPORTは、高パフォーマンスで信頼性の高いデータ転送もサポートします。インポート・プロセスでは、パラレル実行を使用してスループットが向上し、メンテナンス中やソース・データベースへの接続が失われるなど、インポートが中断された場合、インポートは中断された場所から自動的に再開され、インポートを再開することなく完了が保証されます。

OracleデータベースおよびサポートされているOracle以外のデータベース(MySQL、PostgreSQL、Amazon Redshiftなど)からデータをインポートできます。Oracleソースの場合、データ・オブジェクトとデータベース・オブジェクトの両方がインポートされます。Oracle以外のソースの場合、インポートでは、Oracle互換フォーマットへのデータ型の自動変換によるデータ移動に重点を置きます。

この機能により、柔軟なデータ・インポートがサポートされます。要件に基づいて、データベース全体またはデータのサブセット(選択したスキーマや表など)をインポートできます。Oracleには、進捗をモニターし、インポート・ステータスを追跡するためのデータ・ディクショナリ・ビューも用意されています。

主な利点

  • プラットフォーム間の統合データ・インポート: 複数のツールを使用せずに、OracleデータベースおよびOracle以外のデータベースからデータをインポートします。
  • 高パフォーマンスのデータ転送: パラレル実行を使用して大量のデータを移動します。
  • 組込みのレジリエンシ: ソース・データベースへのメンテナンスまたは接続の損失など、中断後にインポート操作を自動的に再開します。
  • 柔軟なデータ選択: データベース全体またはデータのサブセット(特定のスキーマまたは表を含む)をインポートします。

前提条件

Autonomous AI Databaseへのインポートを実行するための前提条件をリストします。

インポートを開始する前に、次の前提条件が満たされていることを確認してください。

  • ADMINユーザーとしてログインする必要があります。

  • DBMS_CLOUD_IMPORTサブプログラムは、インポート・タスクの一部として暗黙的に作成されたデータベース・リンクを使用してソース・データベースにアクセスします。この接続を確立するには、リモート・データベース資格証明を使用して資格証明オブジェクトを作成し、インポート・タスクの作成時にそれを参照する必要があります。詳細は、「CREATE_CREDENTIALプロシージャ」を参照してください。

  • Oracle以外のソース・データベースの場合、DBMS_CLOUD_IMPORT.CREATE_IMPORT_TASKをコールするときにgateway_paramsパラメータにlongtovarchar => 'true'を指定します。これは、Oracle以外のデータベースのメタデータがLONG列で構成されているため必要です。例: gateway_params => JSON_OBJECT('db_type' VALUE <db_type>, 'longtovarchar' VALUE 'true')

  • service_nameで指定されたデータベースがターゲット・スキーマに接続してアクセスできることを確認します。

  • インポート・ジョブは、計画メンテナンス・イベントや予期しない停止の後など、中断の時点から再開されます。パラレル処理および自動再開は、Oracle、MySQL、PostgreSQLおよびAmazon Redshiftソース・データベースでサポートされています。Oracle以外のソース・データベースの場合、パラレル処理および自動再開を有効にするには、次の前提条件が必要です(ソース・データベース・タイプに応じて追加の前提条件が適用される場合があります)。

    • ソース表はレンジ・パーティション化されています。

    • 少なくとも1つの数値列にヒストグラム統計が存在します。

    • 数値索引または主キーが存在します。

これらの前提条件が満たされない場合、表はCREATE TABLE AS SELECT (CTAS)を使用してコピーされます。この場合、パラレル処理はサポートされておらず、ジョブが中断されると、中断の時点から再開するのではなく、表の先頭から再開されます。

ソース・データベース・タイプに応じて、パラレル処理と信頼性の高い再起動性をサポートするために追加の前提条件が必要になる場合があります。詳細については、次を参照してください。

  • PostgreSQLソース・データベース
    • ソースPostgreSQLデータベースで必要なビューを作成します。PostgreSQLからの移行時にパラレル処理と信頼性の高い再起動性をサポートするには、ソース・データベースで必要なビューを作成します。ビューが存在しない場合、インポートではCREATE TABLE AS SELECT(CTAS)が使用され、そのモードではパラレル処理はサポートされず、表のロードが中断されると、最初から再起動されます。詳細は、CREATE TABLE AS SELECTを参照してください。
    • これらのビューは、GitHubで使用可能なOracle提供のスクリプトを使用して作成できます。インポートを開始する前に、ソースPostgreSQLデータベースでスクリプトを確認して実行します。

詳細は、PostgreSQL 18.3のドキュメントを参照してください。

  • MySQLソース・データベース
    • MySQLはスキーマを使用しないため、MySQLソースではschema_listはサポートされていません。REATE_IMPORT_TASKを起動する場合は、schema_list ([])に空の配列を指定します。

    • service_nameに指定した値がスキーマ名として使用されます。

    • ソースMySQLデータベースで必要なビューを作成します。MySQLからの移行時にパラレル処理と信頼性の高い再起動性をサポートするには、ソース・データベースで必要なビューを作成します。ビューが存在しない場合、インポートではCREATE TABLE AS SELECT (CTAS)が使用され、そのモードではパラレル処理はサポートされず、表のロードが中断されると、最初から再起動されます。詳細は、CREATE TABLE AS SELECTを参照してください。

    • これらのビューは、Githubで使用可能なOracle提供のスクリプトを使用して作成できます。インポートを開始する前に、ソースMySQLデータベースでスクリプトを確認して実行します。

詳細は、MySQLリファレンスを参照してください。

  • Amazon Redshiftソース・データベース
    • データベース・リンク・アクセスの権限を付与します。 リモート表からデータを読み取るには、データベース・リンクの作成に使用するアカウントに、次のような必要な権限があることを確認する必要があります。

      • GRANT USAGE ON SCHEMA <remote_schema> TO <dblink_user>;

      • GRANT SELECT ON <remote_schema>.<remote_table> TO <dblink_user>;

    • public以外のスキーマのメタデータの可視性を保証します。リモート・スキーマがpublicでなく、インポートでメタデータを問い合せる必要がある場合(たとえば、pg_table_defを使用)、スキーマをデータベース・リンク・ユーザーのsearch_pathに含める必要があります。次に例を示します。

      • ALTER USER <dblink_user> SET search_path TO <new_value>;

詳細は、Amazon Redshiftのドキュメントを参照してください。

DBMS_CLOUD_IMPORTを使用したデータのインポート

DBMS_CLOUD_IMPORTを使用してAutonomous AIデータベースにデータをインポートする方法について説明します。

Autonomous AI Databaseにデータをインポートするには、DBMS_CLOUD_IMPORT.CREATE_IMPORT_TASKプロシージャを使用します。このプロシージャでは、必要な接続詳細およびオプションでインポートするオブジェクトを指定して、Oracleおよびサポートされている非Oracleデータベースからデータをインポートできます。

schema_listtable_listなどのパラメータを指定することで、データベース全体またはデータのサブセット(特定のスキーマや表など)をインポートできます。このプロシージャを実行すると、Oracle Databaseによって、インポート・タスクを管理するOracle Schedulerジョブが作成されます。ジョブでは、指定された接続の詳細および資格証明を使用して、ソース・データベースへのデータベース・リンクを作成し、Autonomous AI Databaseにデータを転送します。

インポートの動作は、ソース・データベース・タイプによって異なります。

  • OracleからOracleへのインポート:データ・オブジェクトとデータベース・オブジェクトの両方が移行されます。索引、制約およびパーティションは、ターゲットAutonomous AIデータベースに自動的に作成されます。インポートが中断された場合(たとえば、メンテナンスのため)、中断時点から再開されます。
  • Oracle以外のデータベースからのインポート:データのみが移行されます。キー、索引、制約およびその他の依存オブジェクトは作成されません。パーティションが作成されるのは、ソース表がレンジ・パーティションの場合のみです。再開機能は前提条件によって異なります。それ以外の場合、インポートは最初から再開されます。

インポートは、ADMINユーザーとして実行する必要があります。ターゲットAutonomous AI Databaseはインポート中も使用可能なままですが、Oracleでは、インポートが完了するまでターゲット・データベースでの他のアクティビティを回避することをお薦めします。インポート・ジョブが(たとえば、計画メンテナンスや予期しない停止のために)中断された場合、ソース・データベース・タイプおよび前提条件が満たされているかどうかに応じて、中断または再起動の時点から再開できます。一時停止および再開を使用してジョブを一時停止してから続行することもできます。

インポート・タスクの作成

インポート・タスクを作成するステップについて説明します。

インポート・タスクを作成して開始する前に、ソース・データベースに対する認証を設定します。DBMS_CLOUD_IMPORTは、資格証明オブジェクトを使用してソースに安全に接続します(また、タスクに必要なデータベース・リンクを作成します)。

インポート・タスクを作成するには、次のステップに従います。

  1. ソース・データベースの資格情報を作成します。これらの資格証明は、ソース・システムに安全に認証および接続するために使用されます。次に例を示します。
    BEGIN
      DBMS_CLOUD.CREATE_CREDENTIAL(
        credential_name => 'db1_cred',
        username        => '<username>',
        password        => '<password>'
      );
    END;
    /

    詳細は、「CREATE_CREDENTIALプロシージャ」を参照してください。

  2. インポート・タスクの作成:

    資格証明を作成した後、DBMS_CLOUD_IMPORT.CREATE_IMPORT_TASKプロシージャを使用してインポート・タスクを作成および開始します。このプロシージャは、OracleおよびMySQL、PostgreSQL、Amazon RedshiftなどのサポートされているOracle以外のデータベースからデータをインポートします。

    このプロシージャを実行する場合は、必要な接続の詳細および資格証明を指定します。schema_listtable_listなどのパラメータを使用して、インポートするデータを制御することもできます。

    Oracle Databaseは、Oracle Schedulerジョブとしてインポートを実行します。このジョブは、操作を管理し、進行状況を追跡します。ジョブでは、インポートの状態が表レベルで維持されます。インポートが中断されると、操作全体を再開するのではなく、最後の不完全な表から続行して、自動的に再開されます。

    次の例では、必要な接続の詳細および資格証明を指定して、様々なソース・データベース・タイプのインポート・タスクを作成する方法を示します。

    : Oracleソースに接続し、指定された表(ADMIN.TABLE1ADMIN.TABLE2など)のみをターゲットAutonomous AIデータベースに移行するインポート・タスクを作成します。
    BEGIN
      DBMS_CLOUD_IMPORT.CREATE_IMPORT_TASK(
        task_name          => '<orcl_import_job>',
        hostname           => '<example1.oraclecloud.com>',
        port               => '<port>',
        service_name       => '<service_name>',
        ssl_server_cert_dn => '<cn=remote_db_cn_name>',
        directory_name     => '<walletdb1>',
        credential_name    => 'db1_cred',
        table_list         => '[{"schema_name": "admin", "table_name": "table1"},
                               {"schema_name": "admin",  "table_name": "table2"}]'
      );
    END;
    /

    : 指定された接続の詳細および資格証明を使用してソースOracleデータベースに接続し、ADMINスキーマ全体を移行するインポート・タスクを作成します。個々の表を指定するのではなく、1つ以上のスキーマを移行する場合は、schema_listを使用します。
    BEGIN
      DBMS_CLOUD_IMPORT.CREATE_IMPORT_TASK(
        task_name          => 'orcl_import_job',
        hostname           => '<remote_db_hostname>',
        port               => '<remote_db_port>',
        service_name       => '<remote_db_service_name>',
        ssl_server_cert_dn => '<cn=remote_db_cn_name>',
        directory_name     => '<walletdb>',
        credential_name    => 'db1_cred',
        schema_list        => '["admin"]'
      );
    END;
    /
    ノート

    • インポートの範囲を制限するには:
      • schema_listを使用して、1つ以上のスキーマをインポートします。

      • table_listを使用して、複数のスキーマにまたがる特定の表をインポートします。

    • table_listパラメータは、ソース・データベースがOracleであり、Oracle以外のデータベースではサポートされていない場合にのみサポートされます。
    • table_listを使用する場合:
      • 関連付けられたスキーマのスキーマ・メタデータは、必要に応じてインポートされます。

      • データは、table_listで明示的に指定された表に対してのみインポートされます。

    • schema_listtable_listの両方に重複するオブジェクトを指定しないでください。特定のスキーマまたは表を選択するには、1つのオプションのみを使用してください。

    : MySQLソースのインポート・タスクを作成するには、db_typemysqlに設定してgateway_paramsを指定し、schema_listを使用して移行する対象を識別します(ゲートウェイ構成に適用可能)。

    BEGIN
      DBMS_CLOUD_IMPORT.CREATE_IMPORT_TASK(
        task_name        => 'mysql_import_job',
        hostname         => '<mysql_hostname>',
        port             => '<mysql_port>',
        service_name     => '<mysql_service>',
        credential_name  => '<mysql_cred>',
        gateway_params   => JSON_OBJECT('db_type' VALUE 'mysql'),
        schema_list      => '["dg4odbc"]'
      );
    END;
    /

    : db_typepostgresに設定してgateway_paramsを指定することにより、PostgreSQLソースのインポート・タスクを作成します。タスクは、PostgreSQLに接続し、タスク構成に基づいてターゲットAutonomous AI Databaseにデータを移行します。

    BEGIN
      DBMS_CLOUD_IMPORT.CREATE_IMPORT_TASK(
        task_name        => '<postgres_import_job>',
        hostname         => '<postgres_hostname>',
        port             => '<5432>',
        service_name     => '<postgres_serv>',
        credential_name  => '<postgres_cred>',
        gateway_params   => JSON_OBJECT('db_type' VALUE 'postgres')
      );
    END;
    /

    これらの例では、hostnameportおよびservice_nameはソース・データベース・エンドポイントを識別し、接続を確立するタスク(必要なデータベース・リンクの作成を含む)によって使用されます。credential_nameはソース・データベースに対して認証されるため、リンクを作成できます。Oracleソースの場合は、table_listを使用して特定の表を移行するか、schema_listを使用して1つ以上のスキーマを移行します。Oracle以外のデータベースの場合、ソース・データベース・タイプ(MySQLやPostgreSQLなど)を指定し、インポートに適切なゲートウェイベースの接続を有効にするために、gateway_paramsも必要です。

インポートの中断と再開

インポート操作を中断および再開する方法について説明します。

必要に応じて、SUSPEND_IMPORT_TASKプロシージャを使用してインポートを一時的に一時停止できます。

BEGIN
  DBMS_CLOUD_IMPORT.SUSPEND_IMPORT_TASK(
    task_name => 'orcl_import_job'
 );
END;
/

これにより、すべての進行状況とメタデータを保持しながら、スケジューラ・ジョブが停止します。詳細は、SUSPEND_IMPORT_TASKプロシージャを参照してください。

インポートを続行するには、RESUME_IMPORT_TASKプロシージャを使用します。

BEGIN
  DBMS_CLOUD_IMPORT.RESUME_IMPORT_TASK(
    task_name => 'orcl_import_job'
  );
END;
/

ジョブは最後のチェックポイントから再開し、完了した表をスキップして残りの作業を続行します。

ノート

再開の動作は、ソース・データベースのタイプおよび前提条件によって異なります。並列処理と自動再開の前提条件が満たされると、インポートは中断の時点から続行されます。それ以外の場合、インポートではCREATE TABLE AS SELECT (CTAS)が使用されます。このモードでは、パラレル処理はサポートされず、ジョブが中断されると、表の先頭から再開されます。

詳細は、「RESUME_IMPORT_TASKプロシージャ」を参照してください。

インポート進捗のモニター

インポート・タスクを開始すると、スケジューラ・ジョブがバックグラウンドで実行され、Autonomous AI Databaseによってタスク・レベルと表レベルの両方で進行状況が記録されます。

次のデータ・ディクショナリ・ビューを使用して、インポートの進行状況およびステータスをモニターできます。
  • DBA_DATA_IMPORT_TASK_STATUS: タスク・レベルの進捗(全体的なステータス、完了率、アクティビティのサマリーなど)が表示されます(現在進行中の表など)。
  • DBA_DATA_IMPORT_TABLE_STATUS: 失敗した表のステータスやエラーの詳細など、インポートされる各表の表レベルの進行状況が表示されます。

たとえば、DBA_DATA_IMPORT_TABLE_STATUSを問い合せて、表レベルの進行状況およびエラーを表示します。STATUS列は、各表の現在の状態(SUCCEEDEDFAILEDLOADINGSTOPPEDなど)を示します。

BEGIN
  DBMS_CLOUD.CREATE_CREDENTIAL(
    credential_name => 'db1_cred',
    username        => '<username>',
    password        => '<password>'
  );
END;
/

出力は次のようになります:

IMPORT_TASK_NAME   SCHEMA_NAME   SCHEMA_OBJECT   STATUS
------------------ ------------- --------------- ----------
IMPORT_JOB1        SALES         ORDERS          SUCCEEDED
IMPORT_JOB1        SALES         CUSTOMERS       SUCCEEDED
IMPORT_JOB1        HR            EMPLOYEES       LOADING
IMPORT_JOB1        HR            DEPARTMENTS     FAILED

インポートが完了すると、スケジューラ・ジョブは自動的に無効になります。詳細は、異機種間インポートのモニターおよび診断を参照してください。

インポート・タスクの削除

インポート・タスクを削除するステップについて説明します。

インポートが完了し、不要になったら、インポート・タスクを削除できます。タスクを削除すると、スケジューラ・ジョブ、データベース・リンクおよび関連するメタデータが削除されます。ターゲット・スキーマにすでに作成されているオブジェクトまたはデータはロールバックされず、進行中の表を部分的にロードしたままにできます。

同じスキーマのインポートを再実行する場合は、部分的にロードされた表のクリーンアップを手動で行う必要がある場合があります。不完全な表を識別するには、クリーンアップを実行する前に、DBA_DATA_IMPORT_TABLE_STATUSなどのデータ・ディクショナリ・ビューを問い合せて表のステータスを確認します。

BEGIN
  DBMS_CLOUD_IMPORT.DROP_IMPORT_TASK(
    task_name => 'orcl_import_job'
  );
END;
/

この例では、ORCL_IMPORT_JOBインポート・ジョブを削除します。詳細は、DROP_IMPORT_TASKプロシージャを参照してください。

異機種間インポートのモニターおよび診断

問題を診断し、データ・インポート操作の進行状況を監視するには、次のデータ・ディクショナリ・ビューを問い合せます。これらのビューは、タスク・ステータス、実行の進行状況、パラレル操作および関連オブジェクトに関する詳細情報を提供します。

ビューの名前 摘要
DBA_DATA_IMPORT_TASK_STATUSビュー 処理中に発生したエラーを含め、インポート・タスク内の各表のステータスが表示されます。
DBA_DATA_IMPORT_TABLE_STATUSビュー 処理済、ロード済および正常に完了した表の数などの進捗情報を含む、タスク・レベルの全体的な詳細が表示されます。