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作成
- PostgreSQLインストール
- PostgreSQL のDB、検証用データを作成
- PostgreSQL に検証用データを追加
- PostgreSQLに対する Oracle 提供の必須ビュー作成
- Autonomous AI Database の private endpoint 事前準備
- DBMS_CLOUD_IMPORT で PostgreSQL から ADB へデータ移行
- 進行状況の確認
- 一時停止と再開
- 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.conf と pg_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 TABLE、CREATE INDEX、INSERT は以下の通り 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_CONNECTIONS を ENFORCE_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への移行をご検討の際は、ぜひ本機能をお試しください!