本ブログは、オラクル・クラウドの個人ブログの1つです。
初めに
Autonomous DBからOCIオブジェクト・ストレージへデータをエクスポートするのは、一般的な要件です。今回は、データ・ポンプをエクスポートする方法を紹介したいと思います。
※、「Computeインスタンス(クライアント) → Autonomous DB → サービスGW → オブジェクト・ストレージ」の流れは、すべてOCI内部の通信で完結する。
※、本記事には、エクスポートの準備に関連する以下の手順も含まれる。
- Oracle Linuxに、Oracle Instant Client (21c)をインストールする方法 (STEP 1-5)。
- Oracle Linuxから、SQL*Plusを使用してAutonomous DBに接続する方法 (STEP 1-6)。
検証環境
ADB ワークロード・タイプ: Autonomous Data Warehouse (Serverless)
アクセス・タイプ: プライベート・エンドポイント
Computeインスタンス:Oracle Linux 8 (VM)
ステップ
1. 事前準備
1-1. 関連ネットワーキング・リソースの設定
タイプ | 項目 | 内容 | コメント |
---|---|---|---|
VCN | CIDR | 10.0.0.0/16 | |
プライベート・サブネット | CIDR | 10.0.1.0/24 | VMとADBの格納先 |
サービスGW | サービス | All <Region-ID> Services in Oracle Services Network (※1) | |
ルート表 (サブネットに付ける) |
ルール | ターゲット・タイプ: サービスGW 宛先サービス:All <Region-ID> Services in Oracle Services Network (※1) |
|
NSG (VM用) | Ingress | ソース CIDR: 接続元のIP プロトコル: TCP, ポート: 22 |
接続元からの通信を許可 |
Egress | ADBのプライベートIP, TCP 1522 | ADBへのアクセス (sqlplus, expdp) |
|
Egress | 宛先タイプ:サービス 宛先サービス:All <Region-ID> Services in Oracle Services Network |
yum レポジトリへ | |
NSG (ADB用) | Ingress | ソース CIDR: VMのIP プロトコル: TCP, ポート: 1522 |
DBクライアントからの通信を許可 |
Egress | 宛先タイプ:サービス 宛先サービス:OCI <Region-ID> Object Storage |
オブジェクト・ストレージへ |
※1、オブジェクト・ストレージのみを利用する場合、"OCI <Region-ID> Object Storage"を指定すればよいが、この例では、Computeインスタンスに、オラクル・インスタント・クライアントをインストールするため、サービスGWを経由して、yum レポジトリにアクセスする。
外部からプライベート・サブネット内のVMに接続する際には、複数の方法があります。お好みの方法を選択してください。詳細については、以下の記事を参照してください。
プライベート・サブネット内のOCI Computeインスタンスに接続する方法のまとめ
1-2. 認証トークンの作成
アイデンティティ → ドメイン → ドメイン名 → ユーザー → ユーザー名 → 認証トークン
作成後、コピーしてください(二度と表示されないので、ご注意を)。
※、ユーザー毎、最大2個の認証トークンが作成できます。
1-3. バケットの作成
Autonomous DBと同じコンパートメントの下に、データ・ポンプ格納用のバケットを作成します。
※、公開の必要がなければ、デフォルトのプライベートにしてください。
1-4. オブジェクト・ストレージ・ネームスペースの確認
OCIのオブジェクト・ストレージ・ネームスペースは、自動に付与されるものです。一部の古いテナンシは、ネームスペースとテナンシ名は同じですけど、そもそも別物なので、間違いようにご注意ください。
AWSは初クラウドの方は、特にこれをご注意ください。なぜかと言いますと、AWS S3のバケット名は、グローバル一意で、ネームスペースという概念がないわけです。
Azureは初クラウドの方は、このネームスペースをAzureのストレージ・アカウントの名前だと理解していただければOKです。
テナンシ詳細 → オブジェクト・ストレージ設定:
OCI CLIは既にインストールと設定済であれば、oci os ns get
のコマンドでも簡単にネームスペースが取れます (Cloud Shellの場合、OCI-CLIのインストールは不要)。
$ oci os ns get
{
"data": "<中略>"
}
1-5. オラクル・インスタント・クライアントの準備
Computeインスタンス(DBクライアント)から、expdpを実行しますので、事前にオラクル・インスタント・クライアントをインストールしてください。
以下は、Oracle Linux 8のコマンド例です(SQL*Plusと各種ツールをインストールする)。
※、expdpとimpdpは、oracle-instantclient-tools
のパッケージに入っている。
- 1) インストール済かどうかをチェック
[opc@linux8-client ~]$ sudo dnf list installed | grep instantclient
[opc@linux8-client ~]$
- 2) リリース・パッケージのインストール
[opc@linux8-client ~]$ sudo dnf install oracle-instantclient-release-el8 -y
<中略>
Installed:
oracle-instantclient-release-el8-1.0-2.el8.x86_64
Complete!
[opc@linux8-client ~]$
-
3) SQL*Plusと各種ツールのインストール
SQL*Plus:sudo dnf install oracle-instantclient-sqlplus -y
各種ツール:sudo dnf install oracle-instantclient-tools -y
(コマンドの結果を省略)
インストール後、もう一度チェックすると:
[opc@linux-client ~]$ sudo dnf list installed | grep instantclient
oracle-instantclient-basic.x86_64 21.9.0.0.0-1.el8 @ol8_oracle_instantclient21
oracle-instantclient-release-el8.x86_64 1.0-2.el8 @ol8_baseos_latest
oracle-instantclient-sqlplus.x86_64 21.9.0.0.0-1.el8 @ol8_oracle_instantclient21
oracle-instantclient-tools.x86_64 21.9.0.0.0-1.el8 @ol8_oracle_instantclient21
[opc@linux-client ~]$
下記場所に、SQL*Plusと各種ツールがインストールされました。
[opc@linux-client ~]$ ls /usr/lib/oracle/21/client64/bin
adrci exp expdp genezi imp impdp sqlldr sqlplus wrc
[opc@linux-client ~]$
1-6. クライアントからADBへの接続
このステップは、SQL*Plusを使ってADBへの接続設定です。もちろん、SQL Devloperを使っていただいてもOKです。GUIツールの愛用者は、次の記事をご参照ください。
Oracle LinuxでSQL Developerを利用する方法
環境変数の設定
export ORACLE_HOME=/usr/lib/oracle/21/client64
export TNS_ADMIN=$ORACLE_HOME/lib/network/admin
export PATH=$PATH:$ORACLE_HOME/bin
ADBウォレットの準備
OCIコンソールから、ADBのウォレットをダウンロードし、DBクライアントにアップロードします(詳細を省略)。
ADBのウォレットを変数TNS_ADMIN
に指定しているディレクトリに移動します。
[opc@linux-client ~]$ echo $TNS_ADMIN
/usr/lib/oracle/21/client64/lib/network/admin
[opc@linux-client ~]$ sudo mv Wallet_adwprivate.zip $TNS_ADMIN
[opc@linux-client ~]$
ウォレットの圧縮ファイルを解凍します。
[opc@linux-client ~]$ cd $TNS_ADMIN
[opc@linux-client admin]$ sudo mv README README.old
[opc@linux-client admin]$ sudo unzip Wallet_adwprivate.zip
Archive: Wallet_adwprivate.zip
inflating: ewallet.pem
inflating: README
inflating: cwallet.sso
inflating: tnsnames.ora
inflating: truststore.jks
inflating: ojdbc.properties
inflating: sqlnet.ora
inflating: ewallet.p12
inflating: keystore.jks
[opc@linux-client admin]$
sqlnet.oraの編集
次の行を編集し、Walletの保存先を置き換えます。
編集前:
WALLET_LOCATION = (SOURCE = (METHOD = file) (METHOD_DATA = (DIRECTORY="?/network/admin")))
編集後:
WALLET_LOCATION = (SOURCE = (METHOD = file) (METHOD_DATA = (DIRECTORY="$TNS_ADMIN")))
tnsnames.oraの情報を確認
tnsnames.oraから、接続用のサービス名を確認します。
通常は以下となります。(dbname_high, dbname_medium, dbname_low)
SQL*PlusでADBに接続
コマンド:sqlplus <ユーザ名>/<パスワード>@<サービス名>
[opc@linux-client admin]$ sqlplus admin/<replace_with_your_password>@adwprivate_high
SQL*Plus: Release 21.0.0.0.0 - Production on Wed Jul 12 07:48:03 2023
Version 21.9.0.0.0
Copyright (c) 1982, 2022, Oracle. All rights reserved.
Connected to:
Oracle Database 19c Enterprise Edition Release 19.0.0.0.0 - Production
Version 19.20.0.1.0
SQL>
1-7. 検証用ユーザーとテーブルの準備
エクスポート専用ユーザーの作成
管理者ユーザーで、次のSQLを実行して、エクスポート専用ユーザーを作成します。
※、既存ユーザーを利用したい場合、権限付与の部分(最後の3行)を実行してください(ユーザー名を置き換え)。この例では、DWROLE
というロールを付与していますが、必ずそれを使わなければならないというわけではありません。
-- USER SQL
CREATE USER "DATA_PUMP_USER" IDENTIFIED BY "<replace_with_your_password>"
DEFAULT TABLESPACE "DATA"
TEMPORARY TABLESPACE "TEMP";
-- QUOTAS
ALTER USER "DATA_PUMP_USER" QUOTA UNLIMITED ON "DATA";
-- ROLES
GRANT "DWROLE" TO "DATA_PUMP_USER";
-- SYSTEM PRIVILEGES
GRANT CREATE TABLE to DATA_PUMP_USER;
GRANT read, write on directory DATA_PUMP_DIR to DATA_PUMP_USER;
GRANT EXECUTE on DBMS_CLOUD to DATA_PUMP_USER;
テーブルの準備
検証用テーブルを用意します(ユーザー: DATA_PUMP_USER
)。
SQL> select count(*) from zipcodejp;
COUNT(*)
----------
124523
SQL>
2. クレデンシャルの作成
ADBからOCIオブジェクト・ストレージへアクセスするため、クレデンシャルは必要です。
エクスポート対象のユーザー(DATA_PUMP_USER)でADBにログインします。DBMS_CLOUDを使って、クレデンシャルを作成します。(STEP 1-2で作成した認証トークンを使う。)
スクリプト:
BEGIN
DBMS_CLOUD.CREATE_CREDENTIAL(
credential_name => 'your credential name',
username => 'OCI user name',
password => 'auth token generated for OCI user'
);
END;
/
※、ユーザー名は、OCIユーザーであることにご注意ください(DBユーザーではない)。
作成例:
SQL> BEGIN
2 DBMS_CLOUD.CREATE_CREDENTIAL(
3 credential_name => 'EXPORT_CRED',
4 username => '<replace_with_your_oci_user_name>',
5 password => '<replace_with_your_auth_token>'
6 );
7 END;
8 /
PL/SQL procedure successfully completed.
SQL>
オブジェクト・ストレージへアクセス
次のSQLコマンドで、出力先のバケットの中身を確認できます。
※、クレデンシャルを作成したDBユーザーで実行。
コマンド例:select * from dbms_cloud.list_objects('<Credential_Name>','https://objectstorage.ap-tokyo-1.oraclecloud.com/n/ObjectStorageNameSpace/b/BucketName/o/');
この時点、まだエクスポートを実施していないので、カラの状態は想定通りです。
SQL> select * from dbms_cloud.list_objects('EXPORT_CRED','https://objectstorage.ap-tokyo-1.oraclecloud.com/n/<replace_with_your_namespace>/b/Data_Pump/o/');
no rows selected
SQL
3. エクスポートの実施
クイック・スタート
クライアントから、次のコマンドを実行して、エクスポートを開始します。
expdp DATA_PUMP_USER/<password>@adwprivate_high \
credential=EXPORT_CRED \
dumpfile=https://objectstorage.ap-tokyo-1.oraclecloud.com/n/<ObjectStorageNamespace>/b/Data_Pump/o/data_pump_file.dmp \
logfile=export.log \
directory=data_pump_dir
パラメータの意味:
credential
: 上記ステップで作成したクレデンシャルの名前
dumpfile
: https://objectstorage.region.oraclecloud.com/n/ObjectStorageNameSpace/b/BucketName/o/ObjectName
data_pump_dir
: ADBの標準ディレクトリです。次のコマンドで、ディレクトリの情報を確認できます。
logfile
: ログの保存先は、ADBのディレクトリであり、クライアント側ではない。
SQL> select owner, directory_name, directory_path FROM dba_directories where directory_name='DATA_PUMP_DIR';
OWNER DIRECTORY_NAME DIRECTORY_PATH
---------- -------------------- ----------------------------------------------------------------------
SYS DATA_PUMP_DIR /u03/dbfs/FFA038E37518AFA8E0534310000AC205/data/dpdump
SQL>
コマンドの出力結果
[opc@linux-client ~]$ expdp DATA_PUMP_USER/<password>@adwprivate_high \
> credential=EXPORT_CRED \
> dumpfile=https://objectstorage.ap-tokyo-1.oraclecloud.com/n/<ObjectStorageNamespace>/b/Data_Pump/o/data_pump_file.dmp \
> logfile=export.log \
> directory=data_pump_dir
Export: Release 21.0.0.0.0 - Production on Wed Jul 12 11:56:36 2023
Version 21.9.0.0.0
Copyright (c) 1982, 2023, Oracle and/or its affiliates. All rights reserved.
Connected to: Oracle Database 19c Enterprise Edition Release 19.0.0.0.0 - Production
Starting "DATA_PUMP_USER"."SYS_EXPORT_SCHEMA_01": DATA_PUMP_USER/********@adwprivate_high credential=EXPORT_CRED dumpfile=https://objectstorage.ap-tokyo-1.oraclecloud.com/n/<ObjectStorageNamespace>/b/Data_Pump/o/data_pump_file.dmp logfile=export.log directory=data_pump_dir
Processing object type SCHEMA_EXPORT/TABLE/TABLE_DATA
Processing object type SCHEMA_EXPORT/TABLE/INDEX/STATISTICS/INDEX_STATISTICS
Processing object type SCHEMA_EXPORT/TABLE/STATISTICS/TABLE_STATISTICS
Processing object type SCHEMA_EXPORT/STATISTICS/MARKER
Processing object type SCHEMA_EXPORT/USER
Processing object type SCHEMA_EXPORT/SYSTEM_GRANT
Processing object type SCHEMA_EXPORT/ROLE_GRANT
Processing object type SCHEMA_EXPORT/DEFAULT_ROLE
Processing object type SCHEMA_EXPORT/TABLESPACE_QUOTA
Processing object type SCHEMA_EXPORT/PASSWORD_HISTORY
Processing object type SCHEMA_EXPORT/PRE_SCHEMA/PROCACT_SCHEMA
Processing object type SCHEMA_EXPORT/TABLE/TABLE
Processing object type SCHEMA_EXPORT/TABLE/COMMENT
Processing object type SCHEMA_EXPORT/TABLE/INDEX/INDEX
Processing object type SCHEMA_EXPORT/POST_SCHEMA/PROCOBJ
Processing object type SCHEMA_EXPORT/POST_SCHEMA/PROCACT_SCHEMA
. . exported "DATA_PUMP_USER"."ZIPCODEJP" 6.006 MB 124523 rows
ORA-39173: Encrypted data has been stored unencrypted in dump file set.
Master table "DATA_PUMP_USER"."SYS_EXPORT_SCHEMA_01" successfully loaded/unloaded
******************************************************************************
Dump file set for DATA_PUMP_USER.SYS_EXPORT_SCHEMA_01 is:
https://objectstorage.ap-tokyo-1.oraclecloud.com/n/<ObjectStorageNamespace>/b/Data_Pump/o/data_pump_file.dmp
Job "DATA_PUMP_USER"."SYS_EXPORT_SCHEMA_01" successfully completed at Wed Jul 12 11:57:22 2023 elapsed 0 00:00:43
[opc@linux-client ~]$
OCIコンソールから、オブジェクトを確認
※、「select * from dbms_cloud.list_objects('<Credential_Name>', '<Object_URL>');
」のコマンドでもオブジェクト一覧を確認できる。
ここまで、エクスポートは無事に完了しました。
テーブルサイズが大きい場合
テーブルが大きくて、出力ファイルのサイズが大きい場合、ファイルの分割ができます。次は、5GBごとでファイルを分割する例です。
expdp DATA_PUMP_USER/<password>@adwprivate_high \
filesize=5GB \
credential=EXPORT_CRED \
dumpfile=https://objectstorage.ap-tokyo-1.oraclecloud.com/n/<ObjectStorageNamespace>/b/Data_Pump/o/data_pump_file%U.dmp \
parallel=16 \
logfile=export.log \
directory=data_pump_dir
4. インポートの実施(オプション)
エクスポートされたファイルを使って、インポート可否を試したほうがよいと思います。次は、指定したテーブルにインポートする例です。
impdp DATA_PUMP_USER/<password>adwprivate_high \
credential=EXPORT_CRED \
dumpfile=https://objectstorage.ap-tokyo-1.oraclecloud.com/n/<ObjectStorageNamespace>/b/Data_Pump/o/data_pump_file.dmp \
tables=ZIPCODEJP \
table_exists_action=append \
logfile=import.log \
directory=data_pump_dir
コマンドの出力結果:
[opc@linux-client ~]$ impdp DATA_PUMP_USER/<password>@adwprivate_high \
> credential=EXPORT_CRED \
> dumpfile=https://objectstorage.ap-tokyo-1.oraclecloud.com/n/<ObjectStorageNamespace>/b/Data_Pump/o/data_pump_file.dmp \
> tables=ZIPCODEJP \
> table_exists_action=append \
> logfile=import.log \
> directory=data_pump_dir
Import: Release 21.0.0.0.0 - Production on Wed Jul 12 13:28:59 2023
Version 21.9.0.0.0
Copyright (c) 1982, 2023, Oracle and/or its affiliates. All rights reserved.
Connected to: Oracle Database 19c Enterprise Edition Release 19.0.0.0.0 - Production
Master table "DATA_PUMP_USER"."SYS_IMPORT_TABLE_01" successfully loaded/unloaded
Starting "DATA_PUMP_USER"."SYS_IMPORT_TABLE_01": DATA_PUMP_USER/********@adwprivate_high credential=EXPORT_CRED dumpfile=https://objectstorage.ap-tokyo-1.oraclecloud.com/n/<ObjectStorageNamespace>/b/Data_Pump/o/data_pump_file.dmp tables=ZIPCODEJP table_exists_action=append logfile=import.log directory=data_pump_dir
Processing object type SCHEMA_EXPORT/TABLE/TABLE
Table "DATA_PUMP_USER"."ZIPCODEJP" 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 SCHEMA_EXPORT/TABLE/TABLE_DATA
Warning: Statistics not gathered while loading data for table "DATA_PUMP_USER.ZIPCODEJP"
. . imported "DATA_PUMP_USER"."ZIPCODEJP" 6.006 MB 124523 rows
Processing object type SCHEMA_EXPORT/TABLE/STATISTICS/TABLE_STATISTICS
Processing object type SCHEMA_EXPORT/STATISTICS/MARKER
Job "DATA_PUMP_USER"."SYS_IMPORT_TABLE_01" successfully completed at Wed Jul 12 13:29:07 2023 elapsed 0 00:00:06
[opc@linux-client ~]$
トラブル・シューティング
- クレデンシャルを作成する時、次のエラーが発生した。
エラーメッセージ:PLS-00904: insufficient privilege to access object C##CLOUD$SERVICE.DBMS_CLOUD
可能の原因:実行したユーザーは、DBMS_CLOUDに対するアクセス権限がない。
対策:管理者より、対象ユーザーに権限を付与してから再作成する。
付録
Cloud-init スクリプト
Computeインスタンス(DBクライアント)作成用のスクリプトです。
#!/bin/bash
sudo dnf install oracle-instantclient-release-el8 -y
sudo dnf install oracle-instantclient-sqlplus -y
sudo dnf install oracle-instantclient-tools -y
OPC_HOME=/home/opc
echo "# Env variables for Oracle Instant Client" >> ${OPC_HOME}/.bashrc
echo "export ORACLE_HOME=/usr/lib/oracle/21/client64" >> ${OPC_HOME}/.bashrc
echo 'export TNS_ADMIN=$ORACLE_HOME/lib/network/admin' >> ${OPC_HOME}/.bashrc
echo 'export PATH=$PATH:$ORACLE_HOME/bin' >> ${OPC_HOME}/.bashrc
source ${OPC_HOME}/.bashrc
関連記事
オラクル・クラウドの個人ブログ一覧
Autonomous DBをエクスポート・インポートする方法のまとめ
Oracle DBからOCIオブジェクト・ストレージへデータをエクスポートする手順
オブジェクト・ストレージからOracle DB 19c/21cにデータを導入する
ドキュメント (英語)
Oracle Instant Client Downloads
Installing Oracle Instant Client Using RPMs
Connect SQL*Plus with a Wallet (mTLS)