LoginSignup
14
6

オブジェクト・ストレージからOracle DB 19c/21cにデータを導入する

Last updated at Posted at 2021-06-01

初めに
オブジェクト・ストレージに保存されるデータファイルをOracle DBに導入したいで、ODI (Oracle Data Integrator)以外に、何か方法がありますか?

答えはYESで、DBMS_CLOUDというパッケージを利用すれば可能です。

  • Autonomous DBの場合、DBMS_CLOUDは既に実装済で、そのままを利用すれば、簡単にOCIオブジェクト・ストレージに保存されるファイルが取り込めます。
  • Oracle DB(On-P/Cloud両方)の場合、DBMS_CLOUDが実装されていませんけど、手動のインストールは可能です。
    ※、オラクルが、下記のMOSドキュメントを提供しています。(アカウントは必要)
    How To Setup And Use DBMS_CLOUD Package (Doc ID 2748362.1)

OCIオブジェクト・ストレージだけではなく、AWS S3, Azure Blobストレージに保存されても導入できます。今回は、OCIオブジェクト・ストレージにあるCSVとDUMPファイルをOracle Base DBに導入する方法をご紹介します。

本記事は、以下の3部分の内容を含めています。

  • Oracle DBにDBMS_CLOUDをインストールする方法。
  • DBMS_CLOUDで、OCIオブジェクト・ストレージからCSVファイルをOracle DBへロードする方法。
  • DBMS_CLOUDで、OCIオブジェクト・ストレージからDUMPファイルをローカルにコピーしてから、Oracle DBへインポートする方法。

利用条件
Oracle DB 19cのバージョンは、19.9以上です。 Oracle DB 21cのバージョンは、21.3以上です。
(On-P/Cloud両方に、適用します。)

実施ステップ

STEP 1 - 事前準備

実施環境
この例は、OCI上のDB System(VM)を利用します。
リージョン:Tokyo
DBバージョン:19.10 Standard Edition

OCIユーザの認証トークン(Auth Token)を事前に用意してください。作成方法は、ドキュメントをご参考ください。ここで省略します。

関連スクリプトと証明書
MOSドキュメントに、実施用SQLスクリプトが用意されています。コピーペーストで、ファイルを作成しておいてください。
表内の各SQLファイルの内容は、MOSドキュメントと同じです。
(MOSドキュメントに、dbms_cloud_install.sqlとdcs_aces.sqlの2個だけ、名前があります。ほかのは自分より名前を付けました。)

No. 名前          目的 修正箇所 コメント
1 dbms_cloud_install.sql DBMS_CLOUDのインストール なし
2 dbc_aces.sql Access Control Entries (ACEs)の設定 define sslwalletdir=<Set SSL Wallet Directory>
3 verify_aces.sql ACEs設定後の確認 1. define sslwalletdir=<Set SSL Wallet Directory>
2. define sslwalletpwd=<Set SSL Wallet password>
3. GET_PAGE(<Object Storage URL>);
3.リージョンキーを置き換え:
ap-tokyo-1 (東京リージョン)
4 grant_user.sql 指定ユーザに権限を付与 define username='SCOTT' 4と5は、どちらを選ぶ
5 grant_role.sql 指定ユーザにロールを付与 1. define userrole='CLOUD_USER'
2. define username='SCOTT'
6 config_aces_for_user.sql 指定ユーザにACEsを設定 1. define clouduser=SCOTT
2. define sslwalletdir=<Set SSL Wallet Directory>
ユーザに権限を付与(上記の4)した場合、これを利用する
7 config_aces_for_role.sql 指定ロールにACEsを設定 1. define cloudrole=CLOUD_USER
2. define sslwalletdir=<Set SSL Wallet Directory>
ロールに権限を付与(上記の5)した場合、これを利用する
8 validate_user_config.sql 設定した権限を検証 1. define clouduser=SCOTT
2. define sslwalletdir=<Set SSL Wallet Directory>
3. define sslwalletpwd=<Set SSL Wallet password>
4. GET_PAGE(<Object Storage URL>);
4. リージョンキーを置き換え:
ap-tokyo-1 (東京リージョン)
9 dbc_certs.tar 証明書 なし 既に証明書を所有している場合、これは不要)

関連ファイルの保存先

No. パス ファイル名 コメント
1 /home/oracle/dbc (作成要) 上記8個のSQLファイル SQLスクリプト格納先
2 /home/oracle/cert (作成要) dbc_certs.tar 証明書格納先
3 /opt/oracle/dcs/commonstore/wallets/ssl (作成要) Wallet格納先
4 $ORACLE_HOME/network/admin sqlnet.ora

※MOSドキュメントに、SQLスクリプトと証明書が、同じディレクトリ(/home/oracle/dbc)の下に保存されますが、この例で分けて保存します。

STEP 2 - DBMS_CLOUDのインストール

SYSユーザのパスワードを用意してから、以下のコマンドを実施します。

コマンド
$ORACLE_HOME/perl/bin/perl $ORACLE_HOME/rdbms/admin/catcon.pl -u sys/<your_sys_password> --force_pdb_mode 'READ WRITE' -b dbms_cloud_install -d /home/oracle/dbc -l /home/oracle/dbc dbms_cloud_install.sql

[oracle@db19c dbc]$ pwd
/home/oracle/dbc
[oracle@db19c dbc]$ ll
total 32
-rwxr-xr-x 1 oracle oinstall 1639 May 21 06:37 config_aces_for_role.sql
-rwxr-xr-x 1 oracle oinstall 1551 May 21 07:15 config_aces_for_user.sql
-rwxr-xr-x 1 oracle oinstall 2118 May 19 07:07 dbc_aces.sql
-rwxr-xr-x 1 oracle oinstall 3736 May 21 03:43 dbms_cloud_install.sql
-rwxr-xr-x 1 oracle oinstall  691 May 21 06:16 grant_role.sql
-rwxr-xr-x 1 oracle oinstall  578 May 21 06:41 grant_user.sql
-rwxr-xr-x 1 oracle oinstall 1608 May 21 06:56 validate_user_config.sql
-rwxr-xr-x 1 oracle oinstall 1671 May 21 03:57 verify_aces.sql
[oracle@db19c dbc]$ echo $ORACLE_HOME
/u01/app/oracle/product/19.0.0.0/dbhome_1
[oracle@db19c dbc]$ $ORACLE_HOME/perl/bin/perl $ORACLE_HOME/rdbms/admin/catcon.pl -u sys/your_sys_password --force_pdb_mode 'READ WRITE' -b dbms_cloud_install -d /home/oracle/dbc -l /home/oracle/dbc dbms_cloud_install.sql
catcon::set_log_file_base_path: ALL catcon-related output will be written to [/home/oracle/dbc/dbms_cloud_install_catcon_35033.lst]

catcon::set_log_file_base_path: catcon: See [/home/oracle/dbc/dbms_cloud_install*.log] files for output generated by scripts

catcon::set_log_file_base_path: catcon: See [/home/oracle/dbc/dbms_cloud_install_*.lst] files for spool files, if any

catcon.pl: completed successfully
[oracle@db19c dbc]$

/home/oracle/dbcの下に、以下のログファイルが作成されましたので、それらを開きエラーがないことを確認します。


[oracle@db19c dbc]$ ls -l dbms*.log dbms*.lst
-rw------- 1 oracle oinstall 12184 May 31 03:27 dbms_cloud_install0.log
-rw------- 1 oracle oinstall  6439 May 31 03:27 dbms_cloud_install1.log
-rw------- 1 oracle oinstall   444 May 31 03:26 dbms_cloud_install_catcon_35033.lst
[oracle@db19c dbc]$ grep -i error dbms*.log dbms*.lst
dbms_cloud_install0.log:No errors.
<略>
[oracle@db19c dbc]$

CDBでインストール後の結果を確認します。
コマンド
select con_id, owner, object_name, status, sharing, oracle_maintained from cdb_objects where object_name = 'DBMS_CLOUD' order by con_id;

SQL> show con_name;
CON_NAME
------------------------------
CDB$ROOT
SQL> col OWNER format a20
SQL> col OBJECT_NAME format a15
SQL> set linesize 100
SQL> set pagesize 10
SQL> select con_id, owner, object_name, status, sharing, oracle_maintained from cdb_objects where object_name = 'DBMS_CLOUD' order by con_id;

確認結果: (DBMS_CLOUDの状態は"VALID"です。)

PDBで確認します。
コマンド
select owner, object_name, status, sharing, oracle_maintained from dba_objects where object_name = 'DBMS_CLOUD';

SQL> show con_name;
CON_NAME
------------------------------
DB19C_PDB1
SQL> select owner, object_name, status, sharing, oracle_maintained from dba_objects where object_name = 'DBMS_CLOUD';

確認結果: (DBMS_CLOUDの状態は"VALID"です。)

STEP 3 - Walletの作成

HTTPSでオブジェクトストレージにアクセスするため、Walletファイルは必要です。
現在、Oracle はRU(リリース更新)の一部として証明書を出荷していませんが、MOSドキュメントからdb_cert.tarのダウンロードは可能です。


[oracle@db19c cert]$ pwd
/home/oracle/cert
[oracle@db19c cert]$ ll
total 12
-rw-rw-r-- 1 oracle oinstall 10240 May 31 03:09 dbc_certs.tar
[oracle@db19c cert]$ tar xvf dbc_certs.tar
BaltimoreCyberTrust.cer
DigiCert.cer
VeriSign.cer
[oracle@db19c cert]$

tarファイル解凍後、以下のコマンドを実施し、Walletファイルを作成します。
コマンド
cd /opt/oracle/dcs/commonstore/wallets/ssl
orapki wallet create -wallet . -pwd <your_chosen_wallet_pw> -auto_login
orapki wallet add -wallet . -trusted_cert -cert /home/oracle/cert/VeriSign.cer -pwd <your_chosen_wallet_pw>
orapki wallet add -wallet . -trusted_cert -cert /home/oracle/cert/BaltimoreCyberTrust.cer -pwd <your_chosen_wallet_pw>
orapki wallet add -wallet . -trusted_cert -cert /home/oracle/cert/DigiCert.cer -pwd <your_chosen_wallet_pw>


[oracle@db19c ~]$ cd /opt/oracle/dcs/commonstore/wallets/ssl
[oracle@db19c ssl]$ orapki wallet create -wallet . -pwd your_chosen_wallet_pw -auto_login
Oracle PKI Tool Release 19.0.0.0.0 - Production
Version 19.4.0.0.0
Copyright (c) 2004, 2020, Oracle and/or its affiliates. All rights reserved.

Operation is successfully completed.
[oracle@db19c ssl]$ orapki wallet add -wallet . -trusted_cert -cert /home/oracle/cert/VeriSign.cer -pwd your_chosen_wallet_pw
Oracle PKI Tool Release 19.0.0.0.0 - Production
Version 19.4.0.0.0
Copyright (c) 2004, 2020, Oracle and/or its affiliates. All rights reserved.

Operation is successfully completed.
[oracle@db19c ssl]$ orapki wallet add -wallet . -trusted_cert -cert /home/oracle/cert/BaltimoreCyberTrust.cer -pwd your_chosen_wallet_pw
Oracle PKI Tool Release 19.0.0.0.0 - Production
Version 19.4.0.0.0
Copyright (c) 2004, 2020, Oracle and/or its affiliates. All rights reserved.

Operation is successfully completed.
[oracle@db19c ssl]$ orapki wallet add -wallet . -trusted_cert -cert /home/oracle/cert/DigiCert.cer -pwd your_chosen_wallet_pw
Oracle PKI Tool Release 19.0.0.0.0 - Production
Version 19.4.0.0.0
Copyright (c) 2004, 2020, Oracle and/or its affiliates. All rights reserved.

Operation is successfully completed.
[oracle@db19c ssl]$

作成されたWalletを確認します。
コマンド:orapki wallet display -wallet .


[oracle@db19c ssl]$ pwd
/opt/oracle/dcs/commonstore/wallets/ssl
[oracle@db19c ssl]$ orapki wallet display -wallet .
Oracle PKI Tool Release 19.0.0.0.0 - Production
Version 19.4.0.0.0
Copyright (c) 2004, 2020, Oracle and/or its affiliates. All rights reserved.

Requested Certificates:
User Certificates:
Trusted Certificates:
Subject:        CN=VeriSign Class 3 Public Primary Certification Authority - G5,OU=(c) 2006 VeriSign\, Inc. - For authorized use only,OU=VeriSign Trust Network,O=VeriSign\, Inc.,C=US
Subject:        CN=Baltimore CyberTrust Root,OU=CyberTrust,O=Baltimore,C=IE
Subject:        CN=DigiCert Global Root CA,OU=www.digicert.com,O=DigiCert Inc,C=US
[oracle@db19c ssl]$

STEP 4 - Wallet場所の設定

作成されたWalletファイルを利用するため、sqlnet.oraの関連箇所を編集します。
※RACの場合、全ノードで実施してください。

ファイル名:$ORACLE_HOME/network/admin/sqlnet.ora
編集(追加)箇所
WALLET_LOCATION=(SOURCE=(METHOD=FILE)(METHOD_DATA=(DIRECTORY=/opt/oracle/dcs/commonstore/wallets/ssl)))


[oracle@db19c admin]$ pwd
/u01/app/oracle/product/19.0.0.0/dbhome_1/network/admin
[oracle@db19c admin]$ cat sqlnet.ora
WALLET_LOCATION=(SOURCE=(METHOD=FILE)(METHOD_DATA=(DIRECTORY=/opt/oracle/dcs/commonstore/wallets/ssl)))
..略..

STEP 5 - ACEs(Access Control Entries)の設定

HTTPSでオブジェクト・ストレージとの通信を許可するため、ACEsの作成は必要です。
ACEsを作成するのに、dbc_aces.sqlの下記箇所を編集してから、実行します。

-- - SSL Wallet directory
編集前:define sslwalletdir=<Set SSL Wallet Directory>
編集後:define sslwalletdir=/opt/oracle/dcs/commonstore/wallets/ssl

プロキシサーバーを利用する場合、以下の行をアンコメントし、内容を編集します。
-- define proxy_uri=<your proxy URI address>
-- define proxy_host=<your proxy DNS name>
-- define proxy_low_port=<your_proxy_low_port>
-- define proxy_high_port=<your_proxy_high_port>

編集後、CDBにログインし、dbc_aces.sqlを実行します。

SQL> show con_name;

CON_NAME
------------------------------
CDB$ROOT
SQL> @dbc_aces.sql

Session altered.

old   9: principal_name => upper('&clouduser'),
new   9: principal_name => upper('C##CLOUD$SERVICE'),
Enter value for proxy_host:
old  16: -- host =>'&proxy_host',
new  16: -- host =>'',
Enter value for proxy_low_port:
old  17: -- lower_port => &proxy_low_port,
new  17: -- lower_port => ,
Enter value for proxy_high_port:
old  18: -- upper_port => &proxy_high_port,
new  18: -- upper_port => ,
old  21: -- principal_name => upper('&clouduser'),
new  21: -- principal_name => upper('C##CLOUD$SERVICE'),
old  29: wallet_path => 'file:&sslwalletdir',
new  29: wallet_path => 'file:/opt/oracle/dcs/commonstore/wallets/ssl',
old  32: principal_name => upper('&clouduser'),
new  32: principal_name => upper('C##CLOUD$SERVICE'),

PL/SQL procedure successfully completed.

old   4: execute immediate 'alter database property set ssl_wallet=''&sslwalletdir''';
new   4: execute immediate 'alter database property set ssl_wallet=''/opt/oracle/dcs/commonstore/wallets/ssl''';
Enter value for proxy_uri:
old   8: -- execute immediate 'alter database property set http_proxy=''&proxy_uri''';
new   8: -- execute immediate 'alter database property set http_proxy=''''';

PL/SQL procedure successfully completed.


Session altered.

SQL>

実行後、設定内容を確認します。

SQL> col PROPERTY_NAME format a15
SQL> col PROPERTY_VALUE format a40
SQL> col DESCRIPTION format a30
SQL> set linesize 100
SQL> select * from database_properties where property_name in ('SSL_WALLET','HTTP_PROXY');

PROPERTY_NAME   PROPERTY_VALUE                           DESCRIPTION
--------------- ---------------------------------------- ------------------------------
SSL_WALLET      /opt/oracle/dcs/commonstore/wallets/ssl  Location of SSL Wallet

SQL>

STEP 6 - DBMS_CLOUDの設定を検証

ここまで、Walletの作成とACEsの設定を実施しましたが、正しく設定されているかどうかを検証します。

事前に用意したverify_aces.sqlを開き、以下の箇所を編集します。

編集前:define sslwalletdir=<Set SSL Wallet Directory>
編集後:define sslwalletdir=/opt/oracle/dcs/commonstore/wallets/ssl

編集前:define sslwalletpwd=<Set SSL Wallet password>
編集後:define sslwalletpwd=<Wallet作成時、指定したパスワード>

編集前:GET_PAGE('https://objectstorage.eu-frankfurt-1.oraclecloud.com');
編集後:GET_PAGE('https://objectstorage.ap-tokyo-1.oraclecloud.com');
※リージョンキーを置き換えます。この例は東京リージョンを利用します。

編集後、SYSユーザでCDBかPDBにログインし、verify_aces.sqlを実行します。
"valid response"が表示されるのを確認します。

SQL> @verify_aces.sql
old   1: CREATE OR REPLACE PROCEDURE &clouduser..GET_PAGE(url IN VARCHAR2) AS
new   1: CREATE OR REPLACE PROCEDURE C##CLOUD$SERVICE.GET_PAGE(url IN VARCHAR2) AS
old  13: wallet_path => 'file:&sslwalletdir',
new  13: wallet_path => 'file:/opt/oracle/dcs/commonstore/wallets/ssl',
old  14: wallet_password => '&sslwalletpwd');
new  14: wallet_password => 'SSL Wallet password');

Procedure created.

old   2: &clouduser..GET_PAGE('https://objectstorage.ap-tokyo-1.oraclecloud.com');
new   2: C##CLOUD$SERVICE.GET_PAGE('https://objectstorage.ap-tokyo-1.oraclecloud.com');
valid response

PL/SQL procedure successfully completed.

old   1: drop procedure &clouduser..GET_PAGE
new   1: drop procedure C##CLOUD$SERVICE.GET_PAGE

Procedure dropped.

SQL>

ここまで、DBMS_CLOUDのインストールと設定は完了です。これから、対象のユーザ・ロールへの権限付与を実施します。

STEP 7 - ユーザ・ロールへの権限付与

以下の2つ方法があります。

  1. 直接に、対象ユーザにDBMS_CLOUDの利用権限を付与します。(grant_user.sqlを実行)
  2. 対象ユーザが付けられたロールに、DBMS_CLOUDの利用権限を付与します。(grant_role.sqlを実行)

この例は、方法1を利用し、PDBのUSER01というユーザに権限を付与します。
grant_user.sqlの以下の箇所を編集します。

編集前:define username='SCOTT'
編集後:define username='USER01'

編集後、SYSかSYSTEMユーザでPDBにログインし、grant_user.sqlを実行します。

SQL> alter session set container=DB19c_PDB1;

Session altered.

SQL> @grant_user.sql

Grant succeeded.


Grant succeeded.


Grant succeeded.

SQL>

STEP 8 - ユーザ・ロールのため、ACEsを設定

STEP7と同様、2つ方法があります。

  1. 直接に対象ユーザに設定した場合、config_aces_for_user.sqlを編集し実行します。
  2. ロールに設定した場合、config_aces_for_role.sqlを編集し実行します。

この例は、STEP7と同様、対象ユーザに設定しますので、config_aces_for_user.sqlを編集します。編集箇所は、以下となります。

編集前:define username='SCOTT'
編集後:define username='USER01'

編集前:define sslwalletdir=<Set SSL Wallet Directory>
編集後:define sslwalletdir=/opt/oracle/dcs/commonstore/wallets/ssl

編集後、SYSかSYSTEMユーザでPDBにログインし、config_aces_for_user.sqlを実行します。

SQL> alter session set container=DB19c_PDB1;

Session altered.

SQL> @config_aces_for_user.sql

Session altered.

old   9: principal_name => upper('&clouduser'),
new   9: principal_name => upper('USER01'),
old  17: -- host =>'&proxy_host',
new  17: -- host =>'<your',
old  18: -- lower_port => &proxy_low_port,
new  18: -- lower_port => <your_proxy_low_port>,
old  19: -- upper_port => &proxy_high_port,
new  19: -- upper_port => <your_proxy_high_port>,
old  22: -- principal_name => upper('&clouduser'),
new  22: -- principal_name => upper('USER01'),
old  30: wallet_path => 'file:&sslwalletdir',
new  30: wallet_path => 'file:/opt/oracle/dcs/commonstore/wallets/ssl',
old  33: principal_name => upper('&clouduser'),
new  33: principal_name => upper('USER01'),

PL/SQL procedure successfully completed.


Session altered.

SQL>

STEP 9 - クレデンシャルの作成と検証

OCIオブジェクト・ストレージ上のデータをアクセスするため、クレデンシャルは必要です。
OCIユーザと認証トークンを事前に用意しておいてください。

対象ユーザ(USER01)でPDBにログインします。

SQL> show con_name;

CON_NAME
------------------------------
DB19C_PDB1
SQL> show user;
USER is "USER01"
SQL>

DBMS_CLOUDを利用し、クレデンシャルを作成します。(認証トークンは事前に準備してください。)
スクリプト
BEGIN
DBMS_CLOUD.CREATE_CREDENTIAL(
credential_name => 'your credential name',
username => 'OCI user name',
password => 'auth token generated for OCI user'
);
END;
/

SQL> BEGIN
  2  DBMS_CLOUD.CREATE_CREDENTIAL(
  3  credential_name => 'TEST_CRED',
  4  username => 'oracleidentitycloudservice/user_name(略)',
  5  password => 'auth token(略)'
  6  );
  7  END;
  8  /

PL/SQL procedure successfully completed.

SQL>

作成後、以下のコマンドで、OCI上のバケットをアクセスし、オブジェクトの一覧を取得します。
select * from dbms_cloud.list_objects(<'CredentialName'>,'https://objectstorage.region.oraclecloud.com/n/ObjectStorageNameSpace/b/BucketName/o/');

<region>: ap-tokyo-1
<ObjectStorageNameSpace>: 確認方法はドキュメントをご参照ください。
OCIのテナンシー名ではないので、ご注意ください。

SQL> col OBJECT_NAME format a15
SQL> col CHECKSUM format a35
SQL> col CREATED format a10
SQL> col LAST_MODIFIED format a40
SQL> set linesize 120
SQL> select * from dbms_cloud.list_objects('TEST_CRED','https://objectstorage.ap-tokyo-1.oraclecloud.com/n/ObjectStorageNameSpace(略)/b/Bucket1/o/');

OBJECT_NAME          BYTES CHECKSUM                            CREATED    LAST_MODIFIED
--------------- ---------- ----------------------------------- ---------- ----------------------------------------
channels.txt           102 d892cb82bc99d45dc1119e04e44988c7               18-MAY-21 03.12.33.705000 AM +00:00

SQL>

今のユーザの設定を検証するため、validate_user_config.sqlの内容を編集してから、実行します。編集箇所は、以下となります。

編集前:define username='SCOTT'
編集後:define username='USER01'

編集前:define sslwalletdir=<Set SSL Wallet Directory>
編集後:define sslwalletdir=/opt/oracle/dcs/commonstore/wallets/ssl

編集前:define sslwalletpwd=<Set SSL Wallet password>
編集後:define sslwalletpwd=<Wallet作成時、指定したパスワード>

編集前:GET_PAGE('https://objectstorage.eu-frankfurt-1.oraclecloud.com');
編集後:GET_PAGE('https://objectstorage.ap-tokyo-1.oraclecloud.com');

編集後、USER01ユーザでPDBにログインし、validate_user_config.sqlを実行します。
"valid response"が表示されるのを確認します。

SQL> show user;
USER is "USER01"
SQL> @validate_user_config.sql
old   1: CREATE OR REPLACE PROCEDURE &clouduser..GET_PAGE(url IN VARCHAR2) AS
new   1: CREATE OR REPLACE PROCEDURE USER01.GET_PAGE(url IN VARCHAR2) AS
old  13: wallet_path => 'file:&sslwalletdir',
new  13: wallet_path => 'file:/opt/oracle/dcs/commonstore/wallets/ssl',
old  14: wallet_password => '&sslwalletpwd');
new  14: wallet_password => 'SSL Wallet password');

Procedure created.

old   2: &clouduser..GET_PAGE('https://objectstorage.ap-tokyo-1.oraclecloud.com');
new   2: USER01.GET_PAGE('https://objectstorage.ap-tokyo-1.oraclecloud.com');
valid response

PL/SQL procedure successfully completed.

old   1: drop procedure &clouduser..GET_PAGE
new   1: drop procedure USER01.GET_PAGE

Procedure dropped.

SQL>

STEP10 - オブジェクト・ストレージからCSVファイルをDBにコピー

この例は、以下のようなCSVファイルを利用します。OCI上のバケットに保存されます。

バケット名:Bucket1
オブジェクト名:channels.txt
オブジェクトの中身:


S,Direct Sales,Direct
T,Tele Sales,Direct
C,Catalog,Indirect
I,Internet,Indirect
P,Partners,Others

事前にテーブルを作成しておきます。(ユーザ"USER01")
コマンド
CREATE TABLE CHANNELS
(channel_id CHAR(1),
channel_desc VARCHAR2(20),
channel_class VARCHAR2(20)
);
/

SQL> show user;
USER is "USER01"
SQL> CREATE TABLE CHANNELS
  2     (channel_id CHAR(1),
  3      channel_desc VARCHAR2(20),
  4      channel_class VARCHAR2(20)
  5     );

Table created.

DBMS_CLOUD.COPY_DATAを利用し、データをコピーします。
コマンド
BEGIN
DBMS_CLOUD.COPY_DATA(
table_name =>'CHANNELS',
credential_name =>'your credential name',
file_uri_list =>'https://objectstorage.<region>.oraclecloud.com/n/<ObjectStorageNameSpace>/b/<BucketName>/o/<ObjectName>',
format => json_object('delimiter' value ',')
);
END;
/

実施例:

SQL> BEGIN
  2   DBMS_CLOUD.COPY_DATA(
  3      table_name =>'CHANNELS',
  4      credential_name =>'TEST_CRED',
  5      file_uri_list =>'https://objectstorage.ap-tokyo-1.oraclecloud.com/n/ObjectStorageNameSpace(略)/b/Bucket1/o/channels.txt',
  6      format => json_object('delimiter' value ',')
  7   );
  8  END;
  9  /

PL/SQL procedure successfully completed.

SQL>

コピー後、テーブルの中身を確認します。

SQL> select * from CHANNELS;

C CHANNEL_DESC         CHANNEL_CLASS
- -------------------- --------------------
S Direct Sales         Direct
T Tele Sales           Direct
C Catalog              Indirect
I Internet             Indirect
P Partners             Others

SQL>

ここまで、CSVファイルの導入例は完了です。

STEP11 - オブジェクト・ストレージからDUMPファイルをDBにインポート

CSVのようなテキストファイルだけではなく、オブジェクト・ストレージ上のDUMPファイルもDBに導入できます。

実施ステップ

  1. DBMS_CLOUD.GET_OBJECTで、オブジェクト・ストレージからDUMPファイルを取得し、ディレクトリに保存します。
  2. impdpコマンドで、通常のインポート処理を実施します。

事前準備
DUMPファイル用のディレクトリを作成し、権限を対象ユーザ(USER01)に付与します。
("/u01/app/oracle/dmp"を事前に作成しておきます。)

SQL> show user;
USER is "SYSTEM"
SQL> CREATE OR REPLACE DIRECTORY TEST_DIR AS '/u01/app/oracle/dmp/';

Directory created.

SQL> GRANT READ, WRITE ON DIRECTORY TEST_DIR TO USER01;

Grant succeeded.

SQL>

expdpでテーブルをエクスポートします。


[oracle@db19c dmp]$ pwd
/u01/app/oracle/dmp
[oracle@db19c dmp]$ expdp USER01/password@DB19C_PDB1 tables=CHANNELS directory=TEST_DIR dumpfile=channels.dmp logfile=expdp_channels.log

Export: Release 19.0.0.0.0 - Production on Thu Jun 3 07:57:33 2021
Version 19.10.0.0.0

Copyright (c) 1982, 2019, Oracle and/or its affiliates.  All rights reserved.

Connected to: Oracle Database 19c Standard Edition 2 Release 19.0.0.0.0 - Production
Starting "USER01"."SYS_EXPORT_TABLE_01":  USER01/********@DB19C_PDB1 tables=CHANNELS directory=TEST_DIR dumpfile=channels.dmp logfile=expdp_channels.log
Processing object type TABLE_EXPORT/TABLE/TABLE_DATA
Processing object type TABLE_EXPORT/TABLE/STATISTICS/TABLE_STATISTICS
Processing object type TABLE_EXPORT/TABLE/STATISTICS/MARKER
Processing object type TABLE_EXPORT/TABLE/TABLE
. . exported "USER01"."CHANNELS"                         6.031 KB       5 rows
ORA-39173: Encrypted data has been stored unencrypted in dump file set.
Master table "USER01"."SYS_EXPORT_TABLE_01" successfully loaded/unloaded
******************************************************************************
Dump file set for USER01.SYS_EXPORT_TABLE_01 is:
  /u01/app/oracle/dmp/channels.dmp
Job "USER01"."SYS_EXPORT_TABLE_01" successfully completed at Thu Jun 3 07:58:04 2021 elapsed 0 00:00:30

[oracle@db19c dmp]$

オブジェクト・ストレージへのファイル転送は、ここで省略します。
転送後、以下のコマンドで確認できます。
select * from dbms_cloud.list_objects(<'CredentialName'>,'https://objectstorage.region.oraclecloud.com/n/ObjectStorageNameSpace/b/BucketName/o/');

SQL> show user
USER is "USER01"
SQL> col OBJECT_NAME format a15
SQL> col CHECKSUM format a35
SQL> col CREATED format a10
SQL> col LAST_MODIFIED format a40
SQL> set linesize 120
SQL> select * from dbms_cloud.list_objects('TEST_CRED','https://objectstorage.ap-tokyo-1.oraclecloud.com/n/ObjectStorageNameSpace(略)/b/Bucket1/o/');

OBJECT_NAME          BYTES CHECKSUM                            CREATED    LAST_MODIFIED
--------------- ---------- ----------------------------------- ---------- ----------------------------------------
channels.dmp        176128 9c8b52350d09f5ab2f4bed2ace7b140b               03-JUN-21 08.05.37.762000 AM +00:00
channels.txt           102 d892cb82bc99d45dc1119e04e44988c7               18-MAY-21 03.12.33.705000 AM +00:00

SQL>

DUMPファイルの取得
DBMS_CLOUD.GET_OBJECTで、DUMPファイルを取得し、ディレクトリに保存します。
("USER01"で実行)

コマンド
BEGIN
DBMS_CLOUD.GET_OBJECT(
credential_name =>'your credential name',
object_uri =>'https://objectstorage.<region>.oraclecloud.com/n/<ObjectStorageNameSpace>/b/<BucketName>/o/<ObjectName>',
directory_name => 'your directory name');
END;
/

もし以下のようなエラーが発生した場合、ユーザ"C##CLOUD$SERVICE"にディレクトリへのアクセス権限を付与すれば回避できます。


ERROR at line 1:
ORA-20000: ORA-29289: directory access denied
ORA-06512: at "C##CLOUD$SERVICE.DBMS_CLOUD", line 921
ORA-06512: at "C##CLOUD$SERVICE.DBMS_CLOUD", line 2411
ORA-06512: at line 2

実施例:

SQL> show user
USER is "SYSTEM"
SQL> GRANT READ, WRITE ON DIRECTORY TEST_DIR TO C##CLOUD$SERVICE;

Grant succeeded.

SQL>

"USER01"でDBMS_CLOUD.GET_OBJECTを実施します。

SQL> show user
USER is "USER01"
SQL> BEGIN
  2       DBMS_CLOUD.GET_OBJECT(
  3       credential_name => 'TEST_CRED',
  4       object_uri => 'https://objectstorage.ap-tokyo-1.oraclecloud.com/n/ObjectStorageNameSpace(略)/b/Bucket1/o/channels.dmp',
  5       directory_name => 'TEST_DIR');
  6  END;
  7  /

PL/SQL procedure successfully completed.

SQL>

取得後、ディレクトリの下にDUMPファイルが作成されます。(既存ファイルがある場合、上書きされます。)


[oracle@db19c dmp]$ pwd
/u01/app/oracle/dmp
[oracle@db19c dmp]$ ls -l channels.dmp
-rw-r--r-- 1 oracle asmadmin 176128 Jun  3 10:05 channels.dmp
[oracle@db19c dmp]$

インポート処理
これから、impdpでインポート処理を実施します。(この例は、カラのテーブルにインポートします。)


[oracle@db19c dmp]$ impdp USER01/password@DB19C_PDB1 tables=CHANNELS directory=TEST_DIR dumpfile=channels.dmp logfile=impdp_channels.log ignore=y

Import: Release 19.0.0.0.0 - Production on Thu Jun 3 10:15:51 2021
Version 19.10.0.0.0

Copyright (c) 1982, 2019, Oracle and/or its affiliates.  All rights reserved.

Connected to: Oracle Database 19c Standard Edition 2 Release 19.0.0.0.0 - Production
Legacy Mode Active due to the following parameters:
Legacy Mode Parameter: "ignore=TRUE" Location: Command Line, Replaced with: "table_exists_action=append"
Master table "USER01"."SYS_IMPORT_TABLE_01" successfully loaded/unloaded
Starting "USER01"."SYS_IMPORT_TABLE_01":  USER01/********@DB19C_PDB1 tables=CHANNELS directory=TEST_DIR dumpfile=channels.dmp logfile=impdp_channels.log table_exists_action=append
Processing object type TABLE_EXPORT/TABLE/TABLE
Table "USER01"."CHANNELS" exists. Data will be appended to existing table but all dependent metadata will be skipped due to table_exists_action of append
Processing object type TABLE_EXPORT/TABLE/TABLE_DATA
. . imported "USER01"."CHANNELS"                         6.031 KB       5 rows
Processing object type TABLE_EXPORT/TABLE/STATISTICS/TABLE_STATISTICS
Processing object type TABLE_EXPORT/TABLE/STATISTICS/MARKER
Job "USER01"."SYS_IMPORT_TABLE_01" successfully completed at Thu Jun 3 10:15:56 2021 elapsed 0 00:00:03

[oracle@db19c dmp]$

インポート実施後、テーブルの内容を確認します。

SQL> show user
USER is "USER01"
SQL> select * from channels;

C CHANNEL_DESC         CHANNEL_CLASS
- -------------------- --------------------
S Direct Sales         Direct
T Tele Sales           Direct
C Catalog              Indirect
I Internet             Indirect
P Partners             Others

SQL>

ここまで、DUMPファイルの導入例は完了です。
上記方法は、AWS S3とAzure Blobにも適用しますので、導入例は、以下の関連記事をご参照ください。

以上


関連記事
オラクル・クラウドの個人シリーズ・ブログ
AWS S3からOracle DBにデータを導入する
Azure BlobからOracle DBにデータを導入する
Oracle DBからOCIオブジェクト・ストレージへデータをエクスポートする手順
マウント・ポイントを経由して、Oracle Base DBからオブジェクト・ストレージへデータをエクスポートする手順

14
6
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
14
6