OCIチュートリアルをやってみた。～Data Pump編～


## はじめに

Data Pumpに関する以下のOCIチュートリアルを行いました。
自分なりのポイントをまとめてみました。

https://oracle-japan.github.io/ocitutorials/database/adb303-datapump/

### 移行イメージ
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3072159/6f84d8a4-ad86-c6d7-0a87-f747e7a91612.png)




## 手順①データをダンプファイルにエクスポート

【ポイント】ダンプファイルとは？
> ダンプファイルとは、コンピュータのメインメモリ（RAM）やレジスタなどのある瞬間の内容を、ストレージ（外部記憶装置）上のファイルに丸ごと写し取ったもの。

https://e-words.jp/w/%E3%83%80%E3%83%B3%E3%83%97%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB.html


 HRスキーマをData Pumpを利用してDBCSインスタンスのOS上のファイルシステムにエクスポートします。
> パラレルオプションを利用する場合、ソースDBがEnterprise Editionである必要があります。
圧縮オプションを利用する場合、ソースDBが11g以上でありAdvanced Compression Optionが必要になります。

DBCSインスタンス上のPDBに接続し、ダンプファイルの出力先を指定します

Tera Termを利用してDBCSインスタンスにopcユーザーで接続します。

```
＃opcユーザーからoracleユーザーにスイッチ
sudo su - oracle
```

【ポイント】opcユーザー・oracleユーザーについて

https://docs.oracle.com/cd/E80594_01/dbcs_dbaas/CSDBI/GUID-70A912B7-9EAD-482B-A484-18F94A35356C.htm#CSDBI-GUID-70A912B7-9EAD-482B-A484-18F94A35356C

```
#作業ディレクトリ作成　&　ディレクトリ変更
mkdir -p ~/mig2adb/dumpdir
cd ~/mig2adb
```

```
sqlplus / as sysdba

alter session set container = pdb1 ;
```

```
#ディレクトリ・オブジェクトを作成し、ダンプファイルの出力先をデータベースに登録

create or replace directory TEST_DIR as '/home/oracle/mig2adb/dumpdir' ;
```
```
#ディレクトリ・オブジェクトに対する操作権限をHRスキーマに付与

grant read, write on directory TEST_DIR to HR ;

exit
```

```
#エクスポートを実行するスクリプトを作成
vi expdp_hr.sh
```

```

 #!/bin/sh

 expdp \"hr/WelCome123#123#@pdb1 \" \
 exclude=cluster,db_link \　　#処理対象をメタデータのオブジェクトのタイプ名 ［： オブジェクト名 ］ で除外フィルターする
 pararell=4 \                #並列度を決定
 schemas=hr \　　　　　　　　　#「スキーマモード」として指定のスキーマ名に対して処理を行う
 compression=all \ 　　　　　 #圧縮対象の範囲
 filesize=1GB \              #1ダンプファイルの最大値
 directory=test_dir \　　　　 #記録媒体がある「ディレクトリ・オブジェクト名」。　ダンプファイル、ログファイル、パラメータファイルのデフォルトディレクトリとなる
 dumpfile=export_hr_%u.dmp   #記録媒体ファイル名

```
【ポイント】expdp構文
expdp ＜ユーザ＞/＜パスワード＞@＜接続文字列＞ ＜オプション＞

https://docs.oracle.com/cd/F19136_01/sutil/oracle-data-pump-export-utility.html#GUID-FCB1FA15-5798-48C0-85ED-08E9DAC5E687


```
#catコマンドでファイルの中身を見ます（きちんと編集できているのか確認）
 cat expdp_hr.sh
```

>・データサイズが大きい場合は、データ転送、ロード性能の向上のため、parallelオプションを利用しましょう。指定する値は少なくとも移行先のADBのOCPU数と同じか、それよりも大きい値（2倍から3倍）がおススメです。
・dumpfile句に指定するファイル名にはワイルドカード（%u）を付けてください。複数のファイルを同時に出力することで高速化が可能です。
・filesize句は5GBよりも小さい値を指定してください。ブラウザ経由でオブジェクトストレージに転送できるデータは1ファイル辺り最大5GBの制限があるためです。
・excludeオプションを利用することで、不要なオブジェクトを除いてエクスポートすることが可能です。例えばADWを利用するような分析系のアプリの場合において、性能観点で付与した索引はExadataを利用すると不要になることが多いため、IndexをExcludeの引数に指定します。



```
#実行権限の付与
chmod +x expdp_hr.sh
```
【ポイント】chmodについて

https://qiita.com/shisama/items/5f4c4fa768642aad9e06


```
#エクスポートの実施
./expdp_hr.sh
```






DBCSインスタンス上の「/home/oracle/mig2adb/dumpdir」ディレクトリにダンプファイルが複数出力されているのでWinSCPといった任意のファイル転送ツールを利用し、DBCSインスタンス上から手元のPCにコピーする。


## 手順②オブジェクトストレージへのアクセストークンを取得

https://oracle-japan.github.io/ocitutorials/database/adb102-dataload/#anchor2

## 手順③ダンプファイルをオブジェクト・ストレージの任意のバケットにアップロード

ダンプファイル(export_hr_xx.dmp)をオブジェクト・ストレージの任意のバケットにアップロードし、アクセスURLを取得する

https://oracle-japan.github.io/ocitutorials/database/adb102-dataload/#anchor2

>通常Data Pumpを利用する場合、ディレクトリ・オブジェクトを作成しそこからインポートしますが、ADBは仕様上OS領域にアクセスできないため、オブジェクトストレージ経由でロードする必要があります。


## 手順④オブジェクトストレージ上のダンプファイルをADBインスタンスにインポート

TeraTermを起動し、仮想マシンにopcユーザーでログイン

```
sudo su - oracle

#ADBに接続するための環境変数の設定
export LD_LIBRARY_PATH=/usr/lib/oracle/21/client64/lib
export TNS_ADMIN=/home/oracle/labs/wallets

#移行先のADBインスタンスにログイン
sqlplus admin/Welcome12345#@atp01_low
```

```
#クレデンシャルの登録を行います

 BEGIN
   DBMS_CLOUD.CREATE_CREDENTIAL(
     credential_name => 'WORKSHOP_CREDENTIAL',
     username => 'adb@handson.com', 
     password => 'xxxxxx'
   );
 END;
 /

exit
```

> ウォレットを利用したADBインスタンスへの接続には、対象インスタンスへの接続情報が格納された クレデンシャル・ウォレット を利用する必要があります。 （より高いセキュリティを担保するために、ADBインスタンスはcredential.ssoファイルを利用した接続のみを受け入れます。

https://oracle-japan.github.io/ocitutorials/database/adb104-connect-using-wallet/


インポートスクリプトを用意

```
mkdir -p ~/labs/datapump
cd ~/labs/datapump

vi impdp_hr.sh


 #!/bin/sh

 impdp userid=admin/Welcome12345#@atp01_high \
 credential=WORKSHOP_CREDENTIAL \
 parallel=4 \
 schemas=HR \
 directory=DATA_PUMP_DIR \
 dumpfile=https://objectstorage.<region>.oraclecloud.com/n/<tenancy>/b/<bucket_name>/o/export_hr_%u.dmp \
 logfile=DATA_PUMP_DIR:import_hr.log


 cat impdp_hr.sh
```
https://docs.oracle.com/cd/E82638_01/sutil/datapump-import-utility.html#GUID-99A80D77-A155-4CBD-A723-C7730B229810

```
chmod +x impdp_hr.sh

./impdp_hr.sh
```

DataPumpによるデータ移行の完了です

最後にADBにログインしてきちんとできているのかの確認を行います。

```
export LD_LIBRARY_PATH=/usr/lib/oracle/21/client64/lib
export TNS_ADMIN=/home/oracle/labs/wallets

sqlplus admin/Welcome12345#@atp01_low


select count(1) from hr.COUNTRIES ;

#25件であればOKです
```


## 終わりに

工程が長いので一度にすべてを理解することは大変ですが、少しずつ紐解いていくことで理解を進めることができました。
オブジェクトストレージを介する点が特徴的だと感じました。
他のデータ移行方法についても順次学習を進めたいと思います。