【手順】AutonomousDBでexpdp

手順概要

  1. expdpコマンドのインストール
  2. バケット作成
  3. 認証トークン生成
  4. expdpコマンドでローカルストレージ(DBFS)にダンプ出力
  5. Database Credential生成
  6. DBFSに出力したダンプファイルをバケットに転送

参考URL

expdpコマンドのインストール
expdpコマンドのオプション

1. expdpコマンドのインストール
1-1. oracle instant clientのダウンロード

このリンクからoracle instant clientのダウンロードを入手します。入手するのは、Basic, Tool, SQL*Plusの3つで、バージョン12.2.0.0.0以上かつ、3つとも同じバージョンに揃える必要があります。

$ mkdir /home/opc/rpm
$ cd /home/opc/rpm
$ wget https://download.oracle.com/otn_software/linux/instantclient/213000/oracle-instantclient-basic-21.3.0.0.0-1.x86_64.rpm
$ wget https://download.oracle.com/otn_software/linux/instantclient/213000/oracle-instantclient-sqlplus-21.3.0.0.0-1.x86_64.rpm
$ wget https://download.oracle.com/otn_software/linux/instantclient/213000/oracle-instantclient-tools-21.3.0.0.0-1.x86_64.rpm


まず、Basicからインストールします。

$ sudo rpm -i oracle-instantclient-basic-21.3.0.0.0-1.x86_64.rpm
$ sudo rpm -i oracle-instantclient-sqlplus-21.3.0.0.0-1.x86_64.rpm
$ sudo rpm -i oracle-instantclient-tools-21.3.0.0.0-1.x86_64.rpm


インストールが済むと /usr/lib/oracle/21/client64 ディレクトリが作成されるので、その下のbinにパスを通します。

$ export PATH=${PATH}:/usr/lib/oracle/21/client64/bin:


さらに、環境変数LD_LIBRARY_PATHも設定します。

$ LD_LIBRARY_PATH=/usr/lib/oracle/21/client64/lib:${LD_LIBRARY_PATH}
$ export LD_LIBRARY_PATH

これでexpdpコマンドのインストールは完了です。

1-2. datapumpに必要な権限

以下の権限が必要なようですが、今回は管理者ユーザであるadminを使用したので権限付与は行っていません。 Oracleのユーザ権限についてもいずれ勉強しないと。
create session
create table
create directory
read, write on directory

2. バケット作成

手順6で実行するプロシージャで、<namespace_string>がオブジェクトURLに含まれているため、オブジェクトストレージのネームスペースを確認しておきます。f:id:meisou-tsuru:20210920133152p:plain

3. 認証トークン生成

以前、手動バックアップの構成を行なったときの手順があるので、そちらを参考に認証トークンを生成しました。

4. expdpコマンドでローカルストレージ(DBFS)にダンプ出力

コンピュートインスタンスから下記コマンドを実行します。

expdp userid=<USER>/<PASSWORD>@<connect_string> \
   tables=<table_name> \
   directory=DATA_PUMP_DIR \
   dumpfile=DATA_PUMP_DIR:expdp.dmp \
   logfile=DATA_PUMP_DIR:expdp.log

'directory'に'DATA_PUMP_DIR'を指定すると、ADBが構成されているExadataのローカルストレージ(DBFS)にダンプファイルが出力されます。
'DATA_PUMP_DIR'自体にもあらかじめ何かを設定しておくものと思い込んでいたため、その調査にだいぶ無駄な時間を費やしました。リファレンスの記載通りで良かったのか。

5. Database Credentialの作成

ADBにログインし、以下のDBMS_CLOUDプロシージャを実行します。

SET DEFINE OFF;
BEGIN DBMS_CLOUD.create_credential(
    credential_name => 'DATAPUMP_CREDENTIAL',
    username => '<oci_username>',
    password => '<auth_token>');
END;
/

usernameには、認証トークンを払い出したOCIアカウント名を入力。passwordには、認証トークンの文字列を入力。

6. DBFSに出力したダンプファイルをバケットに転送

ADBにログインした状態で、以下のプロシージャを実行します。

BEGIN
DBMS_CLOUD.PUT_OBJECT(
  credential_name=>'DATAPUMP_CREDENTIAL',
  object_uri=>'https://swiftobjectstorage.<region>.oraclecloud.com/v1/<namespace_string>/<bucket_name>/expdp.dmp',
  directory_name=>'DATA_PUMP_DIR',
  file_name=>'expdp.dmp');
END;
/

これで、指定したバケットにダンプファイルがエクスポートされます。

インポートする場合

impdpでインポートする場合は、まずターゲットDBで以下のプロシージャを実行しておきます。ちなみにimpdpコマンドはToolsに含まれているので、手順1をやっていればインストール済みとなっているはずです。

BEGIN DBMS_CLOUD.create_credential(
    credential_name => 'DATAPUMP_CREDENTIAL',
    username => '<oci_username>',
    password => '<auth_token>');
END;
/


次に、コンピュートインスタンスから以下のコマンドを実行します。

impdp userid=admin/<admin_password>@<connect_string> parallel=<number_of_OCPU> credential=DATAPUMP_CREDENTIAL \
  tables=<table_name> directory=DATA_PUMP_DIR \
  dumpfile=https://swiftobjectstorage.<region>.oraclecloud.com/v1/<namespace_string>/<bucket_name>/<dumpfile_name>
  logfile=DATA_PUMP_DIR:impdp.log

'dumpfile'には、バケットに置いたダンプファイルを指定します。

感想

最初、expdpコマンドがOSコマンドだとは知らず、AutonomousDBに接続した状態でトライし続けていました。そしてInstant Clientというもがあるということを知り、このリンクを参考にしていたのですが、私の環境ではパスを通すべきbinの場所が違っていたのでここでも少しつまづきました。

OCIのリファレンスには、expdpコマンドが使えるようになるまでの手順など書いてありません。Oracle Database自体のことは、Oracle Databaseのリファレンスを見るべきなんですね。気づいてしまえば何ということもないのですが、Oracleもよく分かっていない私にとっては難しかった。。

社内のベテランOracleユーザーいわく、「OCIはOracleを分かっていれば結構簡単。OCIで提供されているもろもろの機能は、Oracleの機能を分解して提供されているだけだと思う」だそうです。Oracleの勉強もやりますか、、

/*** Original ***/