はじめに
Autonomous AI Database (ADB) では、Oracle AI Data Catalog(AICAT) を利用することでApache Iceberg表を作成・管理・参照できます!
Oracle AI Data Catalog(AICAT) は、「Oracle管理のIceberg RESTカタログ・サービス」です。Autonomous AI Database内で動作し、Object Storage上のIceberg表の作成・更新・削除、メタデータ管理、トランザクション処理を担います。
これにより、ADBからAICATを介して、Iceberg表をより簡単に扱えるようになります。Object Storage上のIceberg表をADBのSQLから直接作成し、データを書き込み、参照できるようになるため、ADBを使ったレイクハウス活用の幅を広げる注目のアップデートです!
今回は、このAICATを使い、Spark などのエンジンは利用せず、ADB の SQL Worksheet だけで Iceberg 表の作成、INSERT、SELECT を試してみます。
数ステップで簡単にADBでIcebergを扱えるようになるので、ぜひ試してみてください!
ADBからIceberg表のへ問い合わせについて、現時点ですべてのIceberg機能が利用できるわけではありません。たとえば、スナップショットID、バージョン、タイムスタンプを指定して過去時点を参照するクエリ時タイムトラベルは現時点ではサポートされていません。また、Iceberg表の構成や更新方式によっては制限があります。
【参考】OCIドキュメント-Apache Iceberg表の問い合わせ
今回できるようになったこと
AICAT(Oracle AI Data Catalog) は、Oracle管理のIceberg REST Catalogサービスです。
AICATの中には AICAT Iceberg RESTカタログ というRESTベースのIcebergカタログが組み込まれています。
クエリエンジンはAICATに問い合わせてIceberg表のメタデータを取得し、実データはObject Storageから読み取ります。このIceberg RESTカタログは、標準のApache Iceberg REST Catalog API仕様に従っており、Iceberg表のメタデータ管理、表に対するCRUD操作、トランザクション処理を行うためのAPIを提供します。
今回のポイントは、ADB側で Iceberg表を扱うためのカタログ機能 を利用できるようになったことです。これにより、外部で別途Icebergカタログを構築することなく、ADBからObject Storage上のIceberg表を扱えるようになります。
また、AICATは単一のADBだけに閉じた機能ではありません。テナンシ内の他のAutonomous AI Databaseからも利用でき、同じIcebergカタログを共有する構成を取ることができます。
さらに、AICATはADB内部のDBMS_CATALOG操作だけでなく、複数の処理エンジンや機能からも利用できます。pache Sparkなどの問合せエンジンで使用したり、AICAT表に外部表を追加したり、DBMSカタログにAICATをマウントしたり、Oracle Data Transformsを使用してApache Iceberg表を作成することができます。
ストレージとしては、現時点(2026年6月)で以下がサポートされています。
- OCI Object Storage S3互換API
- Azureストレージ(ADLSおよびBLOB)
- ZFSストレージ
今回の記事ではOCI Object Storageを使いますが、AICATは複数のストレージタイプに対応しています。詳細は、こちらを参照してください。
今回の構成
今回は以下のような流れで行っていきます。
Sparkを使わず、 Database ActionsのSQL WorksheetからSQLとPL/SQLを実行して確認します。
-
Autonomous Database
-> AICATに接続
-> Iceberg表を作成
-> Object Storageにデータとメタデータを保存
-> SQLでIceberg表をSELECT
構成は以下です。
[Autonomous Database]
|
| DBMS_CATALOG
|
[AICAT / Iceberg REST Catalog]
|
| OCI S3互換API
|
[OCI Object Storage Bucket]
|
| Iceberg table
| - data
| - metadata
AICATを使ってのIceberg表を作成すると、Iceberg表の実体はObject Storage上に作成されます。
Object Storage上には、以下のような構成でファイルが作成されます。data には実データ、metadata にはIceberg表の管理に必要なメタデータが格納されます。後ほど、実際にObject Storage側でも確認してみましょう。
<bucket>/
<namespace>/
<table>/
data/
*.parquet
metadata/
*.metadata.json
...
前提と注意
事前にADBは作成されている前提として手順を進めます。
今回は検証目的のため、すべてADMINユーザーで実行しています。
| 項目 | 例 | 用途 |
|---|---|---|
| Autonomous AI Database Serverless | ADB |
AICATを有効化するADB |
| Object Storageバケット | aicat-demo-wh |
Iceberg表のdata/metadata置き場 |
| OCIリージョン | ap-tokyo-1 |
エンドポイント指定に使用 |
| Object Storage namespace | axxxxxxxxxxx |
S3互換エンドポイントに使用 |
| Customer Secret Key | Access Key / Secret Key | Object Storageアクセスに使用 |
| ADB ADMINパスワード | - | AICAT認証に使用 |
- AICATを設定できるのは、テナンシ管理者またはADMINロールを持つユーザーのみです。
- AICATを有効化するデータベースは、カタログ・データベースとして機能します。テナンシ内の任意のAutonomous AI DatabaseでAICATを有効にすることは可能ですが、Oracleでは単一のデータベースで有効にすることが推奨されています。
- カタログ・サービスの使用パターンはほとんどがトランザクションとなるため、Autonomous AI Databaseはトランザクション処理ワークロード・タイプを使用が推奨されています。
- AICATサービス用に構成するオブジェクト・ストレージの場所が空であり、他の目的に使用されていないことが推奨されています。
手順
1. AICATを有効化する
現時点でAICATを利用するには、まず対象のADBでAICATを有効にする必要があります。
OCIコンソールで、AICATを有効化したいAutonomous Databaseを開きます。
対象のAutonomous Databaseに以下のタグを設定します。
タグ・キー名: ADB$TOOLS
タグ値: AI_CAT
このタグを設定すると、そのAutonomous DatabaseでAICATが有効になります。
2. Object Storageバケットを作成する
OCI Object Storageで、Iceberg用のバケットを作成します。
例: aicat-demo-wh
注意点として、AICAT用に構成するObject Storageの場所は、空で、他用途に使っていない場所にすることが推奨されています。
AICATサービス用に構成するオブジェクト・ストレージの場所が空であり、他の目的に使用されていないことを確認してください。
3. Customer Secret Key(顧客秘密キー)を作成する
OCIのユーザー設定から、Customer Secret Key(顧客秘密キー)を作成します。
手順は以下の記事を参照してください。
作成後、以下を控えます。
- Access Key(アクセスキー)
- Secret Key(秘密キー)
Secret Keyは作成直後しか表示されないため、必ず保存しておきます。
今回、AICATからOCI Object Storageへアクセスする際に、このキーを使います。
4. AICATにObject Storageを登録する
Database ActionsのSQL Worksheetを開きます。ADMINユーザーで接続します。次のPL/SQLを実行します。
BEGIN
oracle_ai_data_catalog.register_storage_oci(
p_warehouse => 's3://<bucket_name>',
p_endpoint => 'https://<object_storage_namespace>.compat.objectstorage.<region>.oci.customer-oci.com',
p_region => '<region>',
p_access_key => '<s3_access_key>',
p_secret_key => '<s3_secret_key>'
);
END;
/
BEGIN
oracle_ai_data_catalog.register_storage_oci(
p_warehouse => 's3://aicat-demo-wh',
p_endpoint => 'https://axxxxxxxxxxx.compat.objectstorage.ap-tokyo-1.oci.customer-oci.com',
p_region => 'ap-tokyo-1',
p_access_key => 'xxxxxxxxxxxxxxxx',
p_secret_key => 'xxxxxxxxxxxxxxxx'
);
END;
/
ここでは、AICATに対して「Iceberg表のデータ置き場はこのObject Storageバケットです」と教えています。
5. ネットワークACLを設定する
Autonomous DatabaseからAICATとObject StorageへHTTPS通信できるようにします。
BEGIN
dbms_network_acl_admin.append_host_ace(
host => '*.oraclecloudapps.com',
lower_port => 443,
upper_port => 443,
ace => xs$ace_type(
privilege_list => xs$name_list('http', 'http_proxy'),
principal_name => 'ADMIN',
principal_type => xs_acl.ptype_db
)
);
dbms_network_acl_admin.append_host_ace(
host => '*.oci.customer-oci.com',
lower_port => 443,
upper_port => 443,
ace => xs$ace_type(
privilege_list => xs$name_list('http', 'http_proxy'),
principal_name => 'ADMIN',
principal_type => xs_acl.ptype_db
)
);
END;
/
1つ目 *.oraclecloudapps.com はAICAT用、2つ目 *.oci.customer-oci.com はOCI Object StorageのS3互換エンドポイント用です。
環境によってObject Storageのエンドポイントが異なる場合は、実際のホスト名に合わせてください。
6. AICAT認証用の資格証明を作成する
DBMS_CATALOGからAICATに接続するために、Bearer Token用の資格証明を作ります。
BEGIN
DBMS_SHARE.CREATE_BEARER_TOKEN_CREDENTIAL(
CREDENTIAL_NAME => 'AICAT_TOKEN_CRED',
BEARER_TOKEN => 'BEARER_TOKEN',
TOKEN_ENDPOINT => '<auth_uri>',
CLIENT_ID => 'ADMIN',
CLIENT_SECRET => '<adb_admin_password>',
TOKEN_SCOPE => 'PRINCIPAL_ROLE:ALL'
);
END;
/
BEGIN
DBMS_SHARE.CREATE_BEARER_TOKEN_CREDENTIAL(
CREDENTIAL_NAME => 'AICAT_TOKEN_CRED',
BEARER_TOKEN => 'BEARER_TOKEN',
TOKEN_ENDPOINT => 'https://test1234.adb.ap-tokyo-1.oraclecloudapps.com/catalog/v1/auth/token',
CLIENT_ID => 'ADMIN',
CLIENT_SECRET => 'YourAdminPasswordHere',
TOKEN_SCOPE => 'PRINCIPAL_ROLE:ALL'
);
END;
/
※Token endpointはご自身の環境のものに置き換えてください。OCIコンソールから対象のADB詳細画面>ツール構成にて、ホスト名を確認してください。
https://xxxxxxxxxx.adb.<リージョン名>.oraclecloudapps.com
7. Object Storageアクセス用の資格証明を作成する
次に、Object Storageへアクセスするための資格証明を作ります。
BEGIN
DBMS_CLOUD.CREATE_CREDENTIAL(
credential_name => 'AICAT_S3_CRED',
username => '<s3_access_key>',
password => '<s3_secret_key>'
);
END;
/
BEGIN
DBMS_CLOUD.CREATE_CREDENTIAL(
credential_name => 'AICAT_S3_CRED',
username => 'xxxxxxxxxxxxxxxx',
password => 'xxxxxxxxxxxxxxxx'
);
END;
/
同じ名前の資格証明がすでにある場合はエラーになります。その場合は名前を変えるか、既存の資格証明を削除してから作り直します。
8. DBMS_CATALOGでAICATをマウントする
ここが今回のポイントです。AICATを、Autonomous Databaseから使えるIcebergカタログとしてマウントします!
BEGIN
DBMS_CATALOG.MOUNT_ICEBERG(
catalog_name => 'AICAT_DEMO',
endpoint => '<catalog_api_uri>',
catalog_credential => 'AICAT_TOKEN_CRED',
data_storage_credential => 'AICAT_S3_CRED',
catalog_type => 'ICEBERG_ORACLE'
);
END;
/
BEGIN
DBMS_CATALOG.MOUNT_ICEBERG(
catalog_name => 'AICAT_DEMO',
endpoint => 'https://test1234.adb.ap-tokyo-1.oraclecloudapps.com/catalog/v1',
catalog_credential => 'AICAT_TOKEN_CRED',
data_storage_credential => 'AICAT_S3_CRED',
catalog_type => 'ICEBERG_ORACLE'
);
END;
/
マウントできたか確認します。
SELECT c.catalog_name, c.catalog_type
FROM user_mounted_catalogs c
ORDER BY c.catalog_name;
以下のように表示されればOKです。
CATALOG_NAME CATALOG_TYPE
------------ ------------
AICAT_DEMO ICEBERG_ORACLE
9. Iceberg用スキーマを作成する
マウントしたカタログ内にスキーマを作成します。
BEGIN
DBMS_CATALOG.CREATE_SCHEMA(
catalog_name => 'AICAT_DEMO',
schema_name => 'DEMO_NS'
);
END;
/
確認します。
SELECT schema_name
FROM DBMS_CATALOG.GET_SCHEMAS('AICAT_DEMO');
Object Storage側も確認すると、DEMO_NSというディレクトリが作られているのを確認できます。
10. Iceberg表を作成する
次に、Iceberg表を作成します。
CREATE ICEBERG TABLE "DEMO_NS"."DEMO_CUSTOMERS"
(
id STRING,
name STRING,
city STRING
)
WITHIN CATALOG "AICAT_DEMO"
STORAGE LOCATION "s3://<bucket_name>/DEMO_NS/DEMO_CUSTOMERS/";
CREATE ICEBERG TABLE "DEMO_NS"."DEMO_CUSTOMERS"
(
id STRING,
name STRING,
city STRING
)
WITHIN CATALOG "AICAT_DEMO"
STORAGE LOCATION "s3://aicat-demo-wh/DEMO_NS/DEMO_CUSTOMERS/";
これで、AICAT管理下のIceberg表が作成されます。
テーブル一覧を確認します。
SELECT table_name
FROM DBMS_CATALOG.GET_TABLES('AICAT_DEMO', 'DEMO_NS');
11. ローカル表を作成する
作成したIceberg表にデータをいれてみます。Iceberg表へデータを入れるために、まずAutonomous Database上に普通の表を作ってデータを挿入しておきます。
CREATE TABLE TESTLOCAL (
id VARCHAR2(10),
name VARCHAR2(100),
city VARCHAR2(100)
);
INSERT INTO TESTLOCAL VALUES ('1', 'Taro', 'Tokyo');
INSERT INTO TESTLOCAL VALUES ('2', 'Hanako', 'Osaka');
INSERT INTO TESTLOCAL VALUES ('3', 'John', 'New York');
COMMIT;
--- 作成したテーブルを確認
SELECT * FROM TESTLOCAL;
12. ローカル表からIceberg表へINSERTする
ローカル表のデータを、Iceberg表へINSERTします。
INSERT INTO "DEMO_NS"."DEMO_CUSTOMERS"@AICAT_DEMO
SELECT id, name, city
FROM TESTLOCAL;
COMMIT;
ポイントは、表名の後ろに @AICAT_DEMO を付けるところです。これで、左記補マウントしたIcebergカタログ上の表を参照できます。
13. Iceberg表をSELECTする
最後に、Iceberg表をSELECTしてデータが入っているか確認します。
SELECT *
FROM "DEMO_NS"."DEMO_CUSTOMERS"@AICAT_DEMO;
これで、Autonomous DatabaseからAICAT経由でIceberg表を作成し、Object Storage上のIceberg表へデータを書き込み、SQLで参照できました!
14. Object Storage側を確認する
OCIコンソールでObject Storageバケットを開き、中身を確認してみましょう。
以下のような構造ができているはずです。
aicat-demo-wh/
DEMO_NS/
DEMO_CUSTOMERS/
data/
...
metadata/
...
データファイルが作られていることも確認できました。
まとめ
今回は、Oracle AI Data Catalog(AICAT) を利用して、Autonomous AI Database から Apache Iceberg 表を作成し、データの INSERT、SELECT までを SQL Worksheet だけで試してみました。
これまで Iceberg 表を扱う場合、Spark などの外部エンジンや、別途 Iceberg カタログの準備が必要になるケースもありましたが、AICAT を利用することで、Autonomous Database からよりシンプルに Iceberg 表を扱えるようになります。特に今回確認したように、ADB の SQL から Iceberg 表を作成し、Object Storage 上に Parquet データと Iceberg メタデータを配置し、そのまま SQL で参照できる点はとても便利です。ADB を中心にしながら、Object Storage 上のデータをレイクハウス形式で管理・活用できるため、既存のデータベース利用者にとっても Iceberg を試しやすくなったと思います。
また、AICAT は標準の Apache Iceberg REST Catalog API に準拠しているため、ADB だけでなく、Spark など他の処理エンジンとの連携にもつなげやすい構成になっています。まずは ADB の SQL Worksheet だけで手軽に試し、必要に応じて他のエンジンと組み合わせていく、という使い方もできそうです。
今回の記事では基本的な作成、書き込み、参照までを扱いましたが、今後は他の Autonomous Database から同じカタログを参照する構成や、外部エンジンとの連携、既存データの Iceberg 化なども試してみたいと思います。
AICAT によって、Autonomous Database から Iceberg を扱うハードルはかなり下がっています。ADB と Object Storage を使ったレイクハウス構成に興味がある方は、ぜひ一度試してみてください!
参考
- Oracle公式ドキュメント: Oracle AI Data Catalog
https://docs.oracle.com/ja-jp/iaas/autonomous-database-serverless/doc/oracle-ai-data-catalog.html









