やりたいこと
Oracle Data Pumpエクスポートの使い方です。
前提条件
概要
CLIの場合
- NLS_LANGの設定
- コマンドラインの場合、以下の仕様により、NLS_LANGをデータベースに合わせる必要があります。
- Error ORA-39064 Might Be Encountered By DataPump Export (EXPDP) When NLS_LANG Is Different From Database Character Set
- expdpの実行
PL/SQLの場合
- ディレクトリ・オブジェクトの作成
- エクスポートの実行
手順(CLIの場合)
NLS_LANGの設定
以下のSQLで地域と言語を取得します。 最低でもcharsetだけ指定すれば動きますが・・・
SELECT PARAMETER, VALUE FROM NLS_DATABASE_PARAMETERS WHERE PARAMETER IN ('NLS_TERRITORY', 'NLS_LANGUAGE', 'NLS_CHARACTERSET');
それから、NLS_LANGを適切に設定します。
charsetのみ指定する場合は export NLS_LANG=.JA16EUC
のようにドット始まりで指定してください。
(以下の「注意」参照)
expdpコマンドの実行
例えば以下のようにします。
expdp <ユーザ>/<パスワード>@<接続文字列> directory=<ディレクトリ> dumpfile=<ファイル名> logfile=<ログファイル名> full=y
- DIRECTORY: ディレクトリ・オブジェクトの名前
- プロシージャの場合は大文字で指定する必要がありますが、こちらは小文字でもOKです。
- DUMPFILE
- FULL
- LOGFILE
- PARFILE: パラメータファイル
手順(PL/SQLの場合)
- 11gR2: DBMS_DATAPUMP
- 12cR1: DBMS_DATAPUMP
ディレクトリ・オブジェクトの作成
例えば /home/oracle
に作成する場合は以下のようにします。
create or replace directory DATA_PUMP_DIR as '/home/oracle';
エクスポート
日付付きでエクスポートする例は以下になります。 versionをつけているのは、RDSへのインポートを考慮したため。 reusefileは不要かな・・・
-- データのエクスポート
DECLARE
hdnl NUMBER;
today VARCHAR2(8);
BEGIN
hdnl := DBMS_DATAPUMP.open( operation => 'EXPORT', job_mode => 'FULL', job_name => null, version => '12.0.0');
select to_char(sysdate, 'YYYYMMDD') into today from dual;
DBMS_DATAPUMP.ADD_FILE( handle => hdnl, filename => 'exp_' || today || '.dmp', directory => 'DATA_PUMP_DIR', filetype => dbms_datapump.ku$_file_type_dump_file, reusefile => 1);
DBMS_DATAPUMP.add_file( handle => hdnl, filename => 'exp_' || today || '.log', directory => 'DATA_PUMP_DIR', filetype => dbms_datapump.ku$_file_type_log_file, reusefile => 1);
DBMS_DATAPUMP.start_job(hdnl);
END;
状況確認は以下のSQLで。 (From: DATAPUMP実行中のチェックSQLなど | RDBMS memo)
SELECT OPNAME, (SOFAR/TOTALWORK)*100 AS PCT
FROM V$SESSION_LONGOPS
WHERE OPNAME LIKE '%EXPORT%'
補足
DIRECTORYが未指定の場合、デフォルトの場所に作られます。
環境変数 DATA_PUMP_DIR
が設定されている場合はそのパス、
未指定の場合は以下のSQLを特権ユーザで実行した値が使用されるようです。
SELECT directory_name, directory_path FROM dba_directories WHERE directory_name='DATA_PUMP_DIR';