6
4

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Non-OracleからADBへ最短移行!DBMS_CLOUD_IMPORTを試してみた(PostgreSQL→ADB)

6
Last updated at Posted at 2026-06-16

OCI Autonomous AI Databaseにおける2026年5月の新機能により、Oracle DBやNon-Oracle DBからのデータ移行をより簡単にする DBMS_CLOUD_IMPORT がリリースされました。
Non-Oracle DBとしては MySQL、PostgreSQL、Amazon Redshift が現状サポートされるソースとなっています。
今回はその中でも PostgreSQL に対して本機能を検証してみましたので、その内容をまとめたいと思います。

本機能を簡単に説明すると DBMS_CLOUD_IMPORT.CREATE_IMPORT_TASK プロシージャの実行によりDB丸ごと、もしくは指定したスキーマごと自動でデータ移行してくれる機能になります。
詳細は以下マニュアルをご参照ください。

ただし上記ドキュメントに記載されている制約として、Oracle 以外のソースではキー、索引、制約などは移行先のADBに自動作成されません。
またパーティションはソースがレンジ・パーティションの場合のみ、ターゲットにもレンジ・パーティションが自動作成されます。

目次

検証環境

ADBは26aiを用意しました。
PostgreSQLはOracle Linux 8.10のOCI Computeに PostgreSQL 17.10 を構築しました。
ちなみに PostgreSQL 18.4 でも試しましたが、こちらはADB側のドライバの関係で上手く動きませんでした。
将来的には18系も対応するかもしれません。

ADB作成

以下を参考にプライベート・エンドポイントのADBを作成します。

DBMS_CLOUD_IMPORT.CREATE_IMPORT_TASK に指定するPostgreSQLの宛先はIP直指定ができず、ホスト名から名前解決する必要があります。
そのためプライベートDNSで名前解決できるよう、プライベート・エンドポイントを使ったADBを用意します。

PostgreSQLインストール

あらかじめPostgreSQL用のOCI ComputeをADBと同じVCN内に作成しておきます。
Computeにログインし、PGDG (PostgreSQL Global Development Group) リポジトリを登録します。

sudo dnf install -y \
  https://download.postgresql.org/pub/repos/yum/reporpms/EL-8-x86_64/pgdg-redhat-repo-latest.noarch.rpm

PGDG 版と競合しないよう、先にOS標準の PostgreSQL モジュールを無効化します。

sudo dnf -qy module disable postgresql

PostgreSQL 17 をインストールします。

sudo dnf install -y postgresql17-server postgresql17 postgresql17-contrib

DBを初期化します。

sudo /usr/pgsql-17/bin/postgresql-17-setup initdb

自動起動を設定しつつサービスを起動させます。

sudo systemctl enable --now postgresql-17
sudo systemctl status postgresql-17 --no-pager

接続してバージョンを確認します。

sudo -iu postgres psql -c "select version();"
                                                 version
----------------------------------------------------------------------------------------------------------
 PostgreSQL 17.10 on x86_64-pc-linux-gnu, compiled by gcc (GCC) 8.5.0 20210514 (Red Hat 8.5.0-28), 64-bit
(1 row)

ADBから接続できるよう、postgresql.confpg_hba.conf を編集します。
まず /var/lib/pgsql/18/data/postgresql.conf を以下のように編集します。

listen_addresses = '*'
port = 5432

/var/lib/pgsql/18/data/pg_hba.conf も以下のように編集します。

host    all    all    <ADBのプライベート・エンドポイントIP>/32    scram-sha-256

設定変更後に再起動します。

sudo systemctl restart postgresql-17

Firewalld を使っている場合は 5432/TCP を開けます。

sudo firewall-cmd --permanent --add-port=5432/tcp
sudo firewall-cmd --reload
sudo firewall-cmd --list-all

OCIのセキュリティ・リストまたはNSGも事前に設定し、ADBからPostgreSQLのComputeの 5432/tcp へ接続できるようにしておきます。

PostgreSQL のDB、検証用データを作成

以下内容でDBとスキーマ、ユーザを作成します。

  • PostgreSQL の新規DB名: migpgdb
  • PostgreSQL の検証用スキーマ名: mig_pg
  • スキーマ mig_pg の管理ユーザ: mig_pg_owner

またOracle DBとPostgreSQLの仕様の違いから、以下注意点があります。

  • スキーマ名やテーブル名にクォーテーションがない場合、PostgreSQL は小文字化、Oracle は大文字化されます。
  • 以上から、本記事では PostgreSQL 側をクォーテーションなしでコマンド実行し、Oracle 側はクォーテーションありの小文字表記でコマンドを実行します。

それではDBやスキーマ、管理ユーザを作成します。
postgres などの管理者ユーザーで実行します。

sudo su - postgres
psql
CREATE ROLE mig_pg_owner
  LOGIN
  PASSWORD 'your password';

CREATE DATABASE migpgdb
  OWNER mig_pg_owner
  ENCODING 'UTF8'
  TEMPLATE template0;

このあと移行時のデータ読み取りでも利用する mig_pg_owner には適切な権限が必要なのですが、具体的に何が付与されていれば良いか分からなかったため、本記事では SUPERUSER 権限を付与しています。。

ALTER USER mig_pg_owner WITH SUPERUSER;

DB作成後、migpgdb に接続してスキーマを作成します。

psql -d migpgdb
CREATE SCHEMA mig_pg AUTHORIZATION mig_pg_owner;
ALTER SCHEMA mig_pg OWNER TO mig_pg_owner;
ALTER ROLE mig_pg_owner SET search_path = mig_pg, public;

PostgreSQL に検証用データを追加

検証用データとして架空の受発注履歴を用意します。
また以降のデータ作成用DDL/DMLは、一部テーブル(sales_order)で次の要件を満たすようにしています。

  • レンジ・パーティション表を使う
  • 数値主キーを持つ
  • ANALYZE により数値列のヒストグラム統計を作る

というのも、冒頭ドキュメントに記載の通り、PostgreSQL からの移行でパラレル処理と中断時の途中再開を有効にする条件として以下があるためです。

  • ソース表がレンジ・パーティション化されていること
  • 少なくとも1つの数値列にヒストグラム統計があること
  • 数値索引または主キーがあること

なお以降の CREATE TABLECREATE INDEXINSERT は以下の通り mig_pg_owner でログインして実行します。

psql -d migpgdb -U mig_pg_owner -h localhost -p 5432

テーブルを作ります。

SET search_path TO mig_pg, public;

CREATE TABLE mig_pg.customer_master (
    customer_id      BIGINT PRIMARY KEY,
    customer_name    VARCHAR(200) NOT NULL,
    customer_name_kana VARCHAR(200),
    country_name     VARCHAR(100) NOT NULL,
    city_name        VARCHAR(100) NOT NULL,
    remarks          TEXT,
    created_at       TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP
);

CREATE TABLE mig_pg.sales_order (
    order_date       DATE NOT NULL,
    order_id         BIGINT NOT NULL,
    customer_id      BIGINT NOT NULL,
    order_amount     NUMERIC(12,2) NOT NULL,
    tax_amount       NUMERIC(12,2) NOT NULL,
    quantity         INTEGER NOT NULL,
    status_code      INTEGER NOT NULL,
    order_title      VARCHAR(200) NOT NULL,
    order_note       TEXT,
    shipping_name    VARCHAR(200) NOT NULL,
    shipping_city    VARCHAR(100) NOT NULL,
    created_at       TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
    CONSTRAINT sales_order_pk PRIMARY KEY (order_date, order_id)
) PARTITION BY RANGE (order_date);

2025年1月から2025年12月までの12パーティションを作成します。

DO $$
DECLARE
    v_start_date DATE := DATE '2025-01-01';
    v_end_date   DATE := DATE '2026-01-01';
    v_from_date  DATE;
    v_to_date    DATE;
    v_part_name  TEXT;
BEGIN
    v_from_date := v_start_date;

    WHILE v_from_date < v_end_date LOOP
        v_to_date := (v_from_date + INTERVAL '1 month')::DATE;
        v_part_name := 'sales_order_' || to_char(v_from_date, 'YYYYMM');

        EXECUTE format(
            'CREATE TABLE mig_pg.%I PARTITION OF mig_pg.sales_order
               FOR VALUES FROM (%L) TO (%L)',
            v_part_name,
            v_from_date,
            v_to_date
        );

        v_from_date := v_to_date;
    END LOOP;
END
$$;

customer_master テーブルにマスターデータを追加します。

INSERT INTO mig_pg.customer_master (
    customer_id,
    customer_name,
    customer_name_kana,
    country_name,
    city_name,
    remarks
)
VALUES
    (1,  'A社',              'エーシャ',                   '日本', '東京',   '月末締め請求'),
    (2,  'B社',              'ビーシャ',                   '日本', '大阪',   '午前納品指定'),
    (3,  'C社',              'シーシャ',                   '日本', '大阪',   '請求書郵送希望'),
    (4,  'D社',              'ディーシャ',                 '日本', '名古屋', '担当営業: 中部営業部'),
    (5,  'E社',              'イーシャ',                   '日本', '福岡',   '直送案件あり'),
    (6,  'F社',              'エフシャ',                   '日本', '札幌',   '冷蔵便指定'),
    (7,  'G社',              'ジーシャ',                   '日本', '仙台',   '納品書同梱希望'),
    (8,  'H社',              'エイチシャ',                 '日本', '横浜',   '倉庫受け取り'),
    (9,  'I社',              'アイシャ',                   '日本', '神戸',   '月初一括納品'),
    (10, 'J社',              'ジェイシャ',                 '日本', '広島',   '午後納品指定');

sales_order テーブルにトランザクションデータを追加します。
以下では120万件を追加しています。

INSERT INTO mig_pg.sales_order (
    order_date,
    order_id,
    customer_id,
    order_amount,
    tax_amount,
    quantity,
    status_code,
    order_title,
    order_note,
    shipping_name,
    shipping_city
)
SELECT
    DATE '2025-01-01' + ((gs - 1) % 365) AS order_date,
    gs AS order_id,
    ((gs - 1) % 10) + 1 AS customer_id,
    round((50 + ((gs * 13) % 900000))::numeric / 10, 2) AS order_amount,
    round((50 + ((gs * 13) % 900000))::numeric / 100, 2) AS tax_amount,
    ((gs - 1) % 20) + 1 AS quantity,
    (gs % 5) AS status_code,
    CASE mod(gs, 6)
        WHEN 0 THEN '定期補充発注'
        WHEN 1 THEN '四半期一括納品'
        WHEN 2 THEN '店舗向け追加発注'
        WHEN 3 THEN '新規導入分'
        WHEN 4 THEN '月次仕入注文'
        ELSE '倉庫在庫補充分'
    END || '_' || gs AS order_title,
    CASE mod(gs, 8)
        WHEN 0 THEN '午前中納品希望'
        WHEN 1 THEN '納品書を同梱'
        WHEN 2 THEN '西館搬入口で受領'
        WHEN 3 THEN '担当者へ事前連絡希望'
        WHEN 4 THEN '東京物流センター経由'
        WHEN 5 THEN '大阪第一倉庫出荷'
        WHEN 6 THEN '月末最終便で手配'
        ELSE '翌営業日着指定'
    END AS order_note,
    CASE mod(gs - 1, 10)
        WHEN 0 THEN 'John'
        WHEN 1 THEN 'Emily'
        WHEN 2 THEN 'Michael'
        WHEN 3 THEN 'Sarah'
        WHEN 4 THEN 'David'
        WHEN 5 THEN 'Olivia'
        WHEN 6 THEN 'Daniel'
        WHEN 7 THEN 'Emma'
        WHEN 8 THEN 'James'
        ELSE 'Sophia'
    END AS shipping_name,
    CASE mod(gs - 1, 10)
        WHEN 0 THEN '東京'
        WHEN 1 THEN '大阪'
        WHEN 2 THEN '大阪'
        WHEN 3 THEN '名古屋'
        WHEN 4 THEN '福岡'
        WHEN 5 THEN '札幌'
        WHEN 6 THEN '仙台'
        WHEN 7 THEN '横浜'
        WHEN 8 THEN '神戸'
        ELSE '広島'
    END AS shipping_city
FROM generate_series(1, 1200000) AS gs;

統計サンプリング数を引き上げてから ANALYZE を実行し、ヒストグラム統計を収集します。

ALTER TABLE mig_pg.sales_order
    ALTER COLUMN order_amount SET STATISTICS 1000;

ANALYZE mig_pg.sales_order;

パラレル処理・中断後の途中再開に関する前提条件が満たされているか確認します。

数値列に対するヒストグラム収集の有無

SELECT
    schemaname,
    tablename,
    attname,
    histogram_bounds IS NOT NULL AS has_histogram
FROM pg_stats
WHERE schemaname = 'mig_pg'
  AND tablename = 'sales_order'
  AND attname IN ('order_amount')
ORDER BY attname;

 schemaname |  tablename  |   attname    | has_histogram
------------+-------------+--------------+---------------
 mig_pg     | sales_order | order_amount | t
(1 row)

レンジ・パーティションの有無

SELECT
    n.nspname AS schema_name,
    c.relname AS table_name,
    pg_get_partkeydef(c.oid) AS partition_key
FROM pg_class c
JOIN pg_namespace n
  ON n.oid = c.relnamespace
WHERE n.nspname = 'mig_pg'
  AND c.relname = 'sales_order';

 schema_name | table_name  |   partition_key
-------------+-------------+--------------------
 mig_pg      | sales_order | RANGE (order_date)
(1 row)

数値列に対する索引の有無

SELECT
    indexname,
    indexdef
FROM pg_indexes
WHERE schemaname = 'mig_pg'
  AND tablename = 'sales_order'
ORDER BY indexname;

         indexname          |                                             indexdef
----------------------------+--------------------------------------------------------------------------------------------------
 sales_order_customer_id_ix | CREATE INDEX sales_order_customer_id_ix ON ONLY mig_pg.sales_order USING btree (customer_id)
 sales_order_pk             | CREATE UNIQUE INDEX sales_order_pk ON ONLY mig_pg.sales_order USING btree (order_date, order_id)
(2 rows)

PostgreSQLに対する Oracle 提供の必須ビュー作成

冒頭のドキュメントでは、PostgreSQL からの移行でパラレル処理および中断位置からの自動再開を使うために、ソース PostgreSQL に Oracle 提供の GitHub スクリプトで必要なビューを作成するよう案内されています。
該当スクリプトは以下よりダウンロードできます。

views.sql というファイル名でスクリプトを用意し、以下の通り実行します。

psql -d migpgdb -U mig_pg_owner -h localhost -p 5432 -f views.sql

ちなみに作成されたViewに問い合わせると以下のような結果が返ってきます。

View問い合わせ結果
select * from mig_pg."ALL_PART_KEY_COLUMNS";
 OWNER  |    NAME     | OBJECT_TYPE | COLUMN_NAME | COLUMN_POSITION
--------+-------------+-------------+-------------+-----------------
 mig_pg | sales_order | TABLE       | order_date  |               1
(1 row)

select * from mig_pg."ALL_PART_TABLES";
 OWNER  | TABLE_NAME  | PARTITION_COUNT | PARTITIONING_KEY_COUNT | PARTITIONING_TYPE
--------+-------------+-----------------+------------------------+-------------------
 mig_pg | sales_order |              12 |                      1 | RANGE
(1 row)

select * from mig_pg."ALL_TAB_PARTITIONS";
 TABLE_OWNER | TABLE_NAME  |   PARTITION_NAME   | PARTITION_POSITION | HIGH_VALUE | HIGH_VALUE_LENGTH | PARTITIONING_TYPE | PARTITION_KEY_COUNT
-------------+-------------+--------------------+--------------------+------------+-------------------+-------------------+---------------------
 mig_pg      | sales_order | sales_order_202501 |                  1 | 2025-02-01 |                10 | RANGE             |                   1
 mig_pg      | sales_order | sales_order_202502 |                  2 | 2025-03-01 |                10 | RANGE             |                   1
 mig_pg      | sales_order | sales_order_202503 |                  3 | 2025-04-01 |                10 | RANGE             |                   1
 mig_pg      | sales_order | sales_order_202504 |                  4 | 2025-05-01 |                10 | RANGE             |                   1
 mig_pg      | sales_order | sales_order_202505 |                  5 | 2025-06-01 |                10 | RANGE             |                   1
 mig_pg      | sales_order | sales_order_202506 |                  6 | 2025-07-01 |                10 | RANGE             |                   1
 mig_pg      | sales_order | sales_order_202507 |                  7 | 2025-08-01 |                10 | RANGE             |                   1
 mig_pg      | sales_order | sales_order_202508 |                  8 | 2025-09-01 |                10 | RANGE             |                   1
 mig_pg      | sales_order | sales_order_202509 |                  9 | 2025-10-01 |                10 | RANGE             |                   1
 mig_pg      | sales_order | sales_order_202510 |                 10 | 2025-11-01 |                10 | RANGE             |                   1
 mig_pg      | sales_order | sales_order_202511 |                 11 | 2025-12-01 |                10 | RANGE             |                   1
 mig_pg      | sales_order | sales_order_202512 |                 12 | 2026-01-01 |                10 | RANGE             |                   1
(12 rows)

Autonomous AI Database の private endpoint 事前準備

冒頭で述べた通り、DBMS_CLOUD_IMPORT.CREATE_IMPORT_TASK に指定するPostgreSQLの宛先はIP直指定ができず、ホスト名から名前解決する必要があります。
そのため DBMS_CLOUD_IMPORT で PostgreSQL に接続させる前提として、ADB を private endpoint 構成にし、アウトバウンド接続を private endpoint 経由に設定します。

上記を実現する方法として、ROUTE_OUTBOUND_CONNECTIONSENFORCE_PRIVATE_ENDPOINT に設定します。
ADMIN で接続して以下を実行します。

ALTER DATABASE PROPERTY
  SET ROUTE_OUTBOUND_CONNECTIONS = 'ENFORCE_PRIVATE_ENDPOINT';

現在の値を確認します。

SELECT property_name, property_value
FROM database_properties
WHERE property_name = 'ROUTE_OUTBOUND_CONNECTIONS';

PROPERTY_NAME                 PROPERTY_VALUE
_____________________________ ___________________________
ROUTE_OUTBOUND_CONNECTIONS    ENFORCE_PRIVATE_ENDPOINT

DBMS_CLOUD_IMPORT で PostgreSQL から ADB へデータ移行

いよいよPostgreSQLからADBへのデータ移行を行います。
まずはPostgreSQLへDBログインするための資格証明をADB上に ADMIN で作成します。

BEGIN
  DBMS_CLOUD.CREATE_CREDENTIAL(
    credential_name => 'PG_MIG_CRED',
    username        => 'mig_pg_owner',
    password        => 'your password'
  );
END;
/

続いてインポート・タスクを作成し、データ移行を実行します。

BEGIN
  DBMS_CLOUD_IMPORT.CREATE_IMPORT_TASK(
    task_name       => 'PG_IMPORT_MIG_PG_01',
    hostname        => '<postgres_host_name>',
    port            => '5432',
    service_name    => 'migpgdb',
    credential_name => 'PG_MIG_CRED',
    directory_name  => NULL,
    gateway_params  => '{"db_type":"postgres","longtovarchar":"true"}',
    schema_list     => '["mig_pg"]'
  );
END;
/

補足:

  • service_name には PostgreSQL のデータベース名を指定します。この例では migpgdb です。
  • Non-Oracleがソースの場合、以下に従う必要があります。
    • gateway_params パラメータに longtovarchar => 'true'を指定します(Oracle以外のデータベースのメタデータがLONG列で構成されているため)。
    • Non-Oracleがソースの場合 table_list は使えず schema_list のみ利用可能です。

進行状況の確認

データ移行の進捗を確認するためのビューが提供されています。

タスク全体の状態確認は以下のような感じで出力されます。

SELECT
    task_name,
    job_status,
    ellapsed_timeg,
    currently_loading,
    summary
FROM dba_data_import_task_status;

TASK_NAME             JOB_STATUS    ELLAPSED_TIME          CURRENTLY_LOADING                                                                   SUMMARY                                                                             
_____________________ _____________ ______________________ ___________________________________________________________________________________ ___________________________________________________________________________________ 
PG_IMPORT_MIG_01    RUNNING       0d 0h 0m 11.020318s    [{"schema":"mig_pg","table":"sales_order","task_name":"2063338112","total_chunks    {"total_schemas":1,"completed_schemas":0,"schema_completion_percentage":0,"total    

表ごとの状態確認は以下のような感じで出力されます。

SELECT
    import_task_name,
    table_task_name,
    schema_name,
    partitioned,
    status,
    created_ts,
    completed_ts,
    errors
FROM dba_data_import_table_status
ORDER BY created_ts, table_task_name;

IMPORT_TASK_NAME      TABLE_TASK_NAME    SCHEMA_NAME    PARTITIONED    STATUS       CREATED_TS                     COMPLETED_TS                   ERRORS    
_____________________ __________________ ______________ ______________ ____________ ______________________________ ______________________________ _________ 
PG_IMPORT_MIG_01    1618768017         mig_pg         NO             SUCCEEDED    26-06-14 17:19:13.710677000    26-06-14 17:19:17.407147000              
PG_IMPORT_MIG_01    2063338112         mig_pg         NO             SUCCEEDED    26-06-14 17:19:17.409912000    26-06-14 17:19:39.561602000              

上記の PARTITIONED 列を見て分かる通り、今回はなぜかターゲット側にレンジ・パーティションが自動作成されませんでした。。

一時停止と再開

今回は試していないためご参考までですが、移行タスクの中断、再開は以下のコマンドで実行可能です。

移行タスクの中断

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

移行タスクの再開

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

ADB上で移行後の確認

mig_pg スキーマ内のテーブルを確認

select table_name from all_tables where owner='mig_pg';

TABLE_NAME
__________________
customer_master
sales_order

テーブル定義を確認

SQL> desc "mig_pg"."customer_master"

Name                  Null?    Type
_____________________ ________ __________________
customer_id                    NUMBER(20)
customer_name                  VARCHAR2(200)
customer_name_kana             VARCHAR2(200)
country_name                   VARCHAR2(100)
city_name                      VARCHAR2(100)
remarks                        VARCHAR2(32767)
created_at                     DATE
SQL> desc "mig_pg"."sales_order"

Name             Null?    Type
________________ ________ __________________
order_date                DATE
order_id                  NUMBER(20)
customer_id               NUMBER(20)
order_amount              NUMBER(12,2)
tax_amount                NUMBER(12,2)
quantity                  NUMBER(10)
status_code               NUMBER(10)
order_title               VARCHAR2(200)
order_note                VARCHAR2(32767)
shipping_name             VARCHAR2(200)
shipping_city             VARCHAR2(100)
created_at                DATE

テーブル内のデータを確認

SQL> select count(*) from "mig_pg"."customer_master";

   COUNT(*)
___________
         10

SQL> select count(*) from "mig_pg"."sales_order";

   COUNT(*)
___________
    1200000

SQL> select * from "mig_pg"."customer_master" fetch first 5 rows only;

   customer_id customer_name    customer_name_kana    country_name    city_name    remarks        created_at
______________ ________________ _____________________ _______________ ____________ ______________ _____________
             1 A               エーシャ                  日本              東京           月末締め請求         14-JUN-26
             2 B               ビーシャ                  日本              大阪           午前納品指定         14-JUN-26
             3 C               シーシャ                  日本              大阪           請求書郵送希望        14-JUN-26
             4 D               ディーシャ                 日本              名古屋          担当営業: 中部営業部    14-JUN-26
             5 E               イーシャ                  日本              福岡           直送案件あり         14-JUN-26

SQL> select * from "mig_pg"."sales_order" fetch first 5 rows only;

order_date       order_id    customer_id    order_amount    tax_amount    quantity    status_code order_title        order_note    shipping_name    shipping_city    created_at
_____________ ___________ ______________ _______________ _____________ ___________ ______________ __________________ _____________ ________________ ________________ _____________
10-JAN-25          275220             10           87791        8779.1          20              0 定期補充発注_275220      東京物流センター経由    Sophia           広島               14-JUN-26
11-JAN-25          275221              1         87792.3       8779.23           1              1 四半期一括納品_275221     大阪第一倉庫出荷      John             東京               14-JUN-26
12-JAN-25          275222              2         87793.6       8779.36           2              2 店舗向け追加発注_275222    月末最終便で手配      Emily            大阪               14-JUN-26
13-JAN-25          275223              3         87794.9       8779.49           3              3 新規導入分_275223       翌営業日着指定       Michael          大阪               14-JUN-26
14-JAN-25          275224              4         87796.2       8779.62           4              4 月次仕入注文_275224      午前中納品希望       Sarah            名古屋              14-JUN-26

どうやら無事に移行できたようです。

事後作業

実は移行タスクを作成すると 移行タスク名_db_link という名前でADBへ内部的にDBLinkが作成されます。
例えば以下のような感じでADBからPostgreSQLのデータを参照できます。

select count(*) from "customer_master"@PG_IMPORT_MIG_01_db_link;

このDBLinkを残しておくのは何となく気になるので、移行完了後に削除しておきます。
DBLinkの削除は移行タスクを削除すればOKです。

BEGIN
    DBMS_CLOUD_IMPORT.DROP_IMPORT_TASK('PG_IMPORT_MIG_01');
END;
/

PL/SQLプロシージャが正常に完了しました。

おわりに

以上、DBMS_CLOUD_IMPORT.CREATE_IMPORT_TASK を使ったPostgreSQLからのデータ移行でした。
本検証では事前作業としてPostgreSQLを用意したり、OCI仮想ネットワークの設定を行うステップはありましたが、データ移行だけであれば「資格証明の作成」と「DBMS_CLOUD_IMPORT.CREATE_IMPORT_TASK の実行」だけで実現できます。
ソースがNon-Oracleの場合、ADB側に索引や制約、レンジ以外のパーティションは引き継がれないため、実際は移行後の作業もそれなりに必要とはなります。
ただデータ自体が2ステップで移行できるというのは、それなりの効率化に繋がるのではないでしょうか。
Non-OracleからADBへの移行をご検討の際は、ぜひ本機能をお試しください!

6
4
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
6
4

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?