はじめに
Data Pumpに関する以下のOCIチュートリアルを行いました。
自分なりのポイントをまとめてみました。
移行イメージ
手順①データをダンプファイルにエクスポート
【ポイント】ダンプファイルとは?
ダンプファイルとは、コンピュータのメインメモリ(RAM)やレジスタなどのある瞬間の内容を、ストレージ(外部記憶装置)上のファイルに丸ごと写し取ったもの。
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ユーザーについて
#作業ディレクトリ作成 & ディレクトリ変更
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 <ユーザ>/<パスワード>@<接続文字列> <オプション>
#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について
#エクスポートの実施
./expdp_hr.sh
DBCSインスタンス上の「/home/oracle/mig2adb/dumpdir」ディレクトリにダンプファイルが複数出力されているのでWinSCPといった任意のファイル転送ツールを利用し、DBCSインスタンス上から手元のPCにコピーする。
手順②オブジェクトストレージへのアクセストークンを取得
手順③ダンプファイルをオブジェクト・ストレージの任意のバケットにアップロード
ダンプファイル(export_hr_xx.dmp)をオブジェクト・ストレージの任意のバケットにアップロードし、アクセスURLを取得する
通常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ファイルを利用した接続のみを受け入れます。
インポートスクリプトを用意
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
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です
終わりに
工程が長いので一度にすべてを理解することは大変ですが、少しずつ紐解いていくことで理解を進めることができました。
オブジェクトストレージを介する点が特徴的だと感じました。
他のデータ移行方法についても順次学習を進めたいと思います。