Oracle Databaseの論理バックアップ・リストアツール「DataPump」の使い方について紹介します。
Datapumpを利用するには準備が必要で使う時にも少々癖がありますが、この記事では丁寧に使い方と事前準備手順を紹介します。
またDatapumpは並列実行・暗号化・圧縮など様々な機能があり、使いこなすと強力なバックアップツールになります。
今後オススメの使い方をどんどん紹介したいと思います。
なおDatapumpはexpdpとimpdpの2つのツールの総称なので間違わないようにしましょう。
この記事の目的
- Datapump(expdp/impdp)を行うための準備
- Datapump(expdp/impdp)でバックアッ/リストアが出来るようになる
- Datapumpでよく使うオプションとその使い所を紹介
Datapump(expdp/impdp)を行うための準備作業
まずはDatapumpを使うための準備作業ですが、大きく3つの設定が必要です。
- ディレクトリオブジェクトの作成
- ディレクトリオプジェクトへの読み書き権限付与
- Datapumpの実行権限付与
なお設定手順時のユーザはSYSユーザで実施します。 最初はディレクトリオブジェクトの作成です。
create or replace directory <ディレクトリオブジェクト名> as '<対象ディレクトリパス>';
次に先ほど作成したディレクトリオブジェクトへ読み書き権限をDatapumpは実行ユーザへ付与します。
grant read, write on directory <ディレクトリオブジェクト名> to <ユーザ名 or ロール名>;
最後にDatapumpの実行権限の付与です。
この権限は非常に強い権限であるため権限を付与するユーザは限定してください。
grant DATAPUMP_EXP_FULL_DATABASE to <ユーザ名 or ロール名>;
grant DATAPUMP_IMP_FULL_DATABASE to <ユーザ名 or ロール名>;
エクスポートは「DATAPUMP_EXP_FULL_DATABASE」、
インポートは「DATAPUMP_IMP_FULL_DATABASE」権限をそれぞれ付与してください。
これでDatapumpに必要な設定は完了です。
expdpでダンプデータ(バックアップデータ)をエクスポート
expdpコマンドでダンプデータ(バックアップデータ)をエクスポートする手順を紹介します。
下が基本のコマンドになります。
expdp <ユーザ名>/<パスワード> directory=<ディレクトリオブジェクト名> dumpfile=<ダンプファイル名> logfile=<ログファイル名>
何をエクスポートしたか分からなくなってしまうので、出力先ファイル名とログファイル名は必ず指定しましょう。
ではここからエクスポート対象を指定したexpdpの使い方を紹介します。 – データベース全体
データベース全体をバックアップするには「full=y」オプションを使用します。
expdp <ユーザ名>/<パスワード> directory=<ディレクトリオブジェクト名> full=y
下がサンプルコマンドです。
expdp dpuser/oracle directory=DATAPUMPDIR \
dumpfile=FULL_ORCL.dmp \
logfile=FULL_ORCL.log \
full=y
- スキーマ単位
スキーマ単位でバックアップするには「schemas=<スキーマ名>」オプションを使用します。
expdp <ユーザ名>/<パスワード> directory=<ディレクトリオブジェクト名> schemas=<スキーマ名>
下がサンプルコマンドになります。
expdp dpuser/oracle directory=DATAPUMPDIR \
dumpfile=ORCL_USER_DPUSER.dmp \
logfile=ORCL_USER_DPUSER.log \
schemas=dpuser
- 表領域単位
expdp <ユーザ名>/<パスワード> directory=<ディレクトリオブジェクト名> tablespaces=<表領域名>
下がサンプルコマンドになります。
expdp dpuser/oracle directory=DATAPUMPDIR \
dumpfile=ORCL_TS_SYSTEM.dmp \
logfile=ORCL_TS_SYSTEM.log \
tablespaces=users
- テーブル単位
expdp <ユーザ名>/<パスワード> directory=<ディレクトリオブジェクト名> tables=<テーブル名>
カンマ区切りでテーブルを複数指定して、1回で複数のテーブルをエクスポートすることは可能です。
下がサンプルコマンドになります。
expdp dpuser/oracle directory=DATAPUMPDIR \
dumpfile=ORCL_TAB_TEST001-TAB001002.dmp \
logfile=ORCL_TAB_TEST001-TAB001002.log \
tables=test001.tab001,test001.tab002
私の個人的な意見になりますが、最も利用するのは「テーブル単位」です。
理由は、Datapumpはアプリ担当がピンポイントでテーブルをバックアップするツールだからです。
データベース単位・スキーマ単位・表領域単位でバックアップするのはRMANを利用することをオススメします。
impdpでダンプデータ(バックアップデータ)をインポート
impdpコマンドでダンプデータ(バックアップデータ)をインポートする手順を紹介します。
impdp <ユーザ名>/<パスワード> directory=<ディレクトリオブジェクト名> dumpfile=<ダンプファイル名> logfile=<ログファイル名>
インポートが正常に終了したのか分からなくなってしまうので**、ログファイル名**は必ず指定しましょう。
ではここからはインポート対象を指定したimpdpの使い方を紹介します。
インポートの時は注意が必要です、
エクスポートした対象(スキーマ名・表領域名・テーブル名)とインポートした対象が異なる場合は変換オプションが必要になります。
スキーマ名・表領域名・テーブル名が同じ時のインポート
- データベース全体
impdp <ユーザ名>/<パスワード> directory=<ディレクトリオブジェクト名> full=y
下がサンプルコマンドになります。
impdp dpuser/oracle directory=DATAPUMPDIR \
dumpfile=FULL_ORCL.dmp \
logfile=FULL_ORCL.log \
full=y
- スキーマ単位
impdp <ユーザ名>/<パスワード> directory=<ディレクトリオブジェクト名> schemas=<スキーマ名>
下がサンプルコマンドになります。
impdp dpuser/oracle directory=DATAPUMPDIR \
dumpfile=ORCL_USER_DPUSER.dmp \
logfile=ORCL_USER_DPUSER.log \
schemas=dpuser
- 表領域単位
impdp <ユーザ名>/<パスワード> directory=<ディレクトリオブジェクト名> tablespaces=<表領域名>
下がサンプルコマンドになります。
impdp dpuser/oracle directory=DATAPUMPDIR \
dumpfile=ORCL_TS_USERS.dmp \
logfile=ORCL_TS_USERS.log \
tablespaces=users
- テーブル単位
impdp <ユーザ名>/<パスワード> directory=<ディレクトリオブジェクト名> tables=<テーブル名>
カンマ区切りでテーブルを複数指定して、1回で複数のテーブルをインポートすることは可能です。
下がサンプルコマンドになります。
impdp dpuser/oracle directory=DATAPUMPDIR \
dumpfile=ORCL_TAB_TEST001-TAB001002.dmp \
logfile=ORCL_TAB_TEST001-TAB001002.log \
tables=test001.tab001,test001.tab002
スキーマ名・表領域名・テーブル名が異なる場合のインポート
ここからはスキーマ名・表領域名・テーブル名が異なる場合の紹介になります。 基本的には「remap_XXXXX」を利用して、コロンを使用して「<元の名前>:<対象の名前>」の形で指定します。
- スキーマが異なる場合の変換方法
impdp <ユーザ名>/<パスワード> directory=<ディレクトリオブジェクト名> remap_schema=<元スキーマ名>:<対象スキーマ名>
下がサンプルコマンドになります。
impdp dpuser/oracle directory=DATAPUMPDIR \
dumpfile=ORCL_USER_DPUSER.dmp \
logfile=ORCL_USER_DPUSER.log \
remap_schema=dpuser:dpuser001
- 表領域名が異なる場合の変換方法
impdp <ユーザ名>/<パスワード> directory=<ディレクトリオブジェクト名> remap_tablespace=<元の表領域名>:<対象の表領域名>
下がサンプルコマンドになります。
impdp dpuser/oracle directory=DATAPUMPDIR \
dumpfile=ORCL_TS_USERS.dmp \
logfile=ORCL_TS_USERS.log \
remap_tablespace=users:users001
- テーブル名が異なる場合の変換方法
impdp <ユーザ名>/<パスワード> directory=<ディレクトリオブジェクト名> remap_table=<元のテーブル名>:<対象のテーブル名>
下がコマンドになります。複数のテーブルも指定する時は「カンマ」を使用して区切ってください。
impdp dpuser/oracle directory=DATAPUMPDIR \
dumpfile=ORCL_TAB_TEST001-TAB001002.dmp \
logfile=ORCL_TAB_TEST001-TAB001002.log \
remap_table=test001.tab001:tab101,test001.tab002:tab102
本記事のまとめ
– Datapump(expdp/impdp)を実行するために**ディレクトリオブジェクトの作成**と**権限の付与**が必要
– expdpでエクスポートする時は**テーブル単位**でバックアップを行う
– impdpでインポート対象を変更する時は**変換用のオプション**を付ける
Oracle Databaseをもっと勉強したい方は↓の記事もオススメです。