Oracleデータベースの運用で「特定のテーブルだけバックアップしたい」という場面は頻繁にあります。たとえば、大規模なリリース前に変更対象テーブルだけを退避しておく、開発環境に本番の一部テーブルを移送する、誤UPDATE前のスナップショットを取る、といったケースです。
Oracleには目的・状況に合わせた複数のバックアップ手法があります。本記事ではexpdp(Data Pump)・旧exp・CTAS・SQL Developer・スプールの5方法を実践的なコマンド例とともに解説します。各方法の使い分け比較表も掲載しています。
- expdp/impdpでテーブル単位にエクスポート・インポートする手順
- CTAS(CREATE TABLE AS SELECT)でDB内に即時複製する方法
- SQL DeveloperのGUIでエクスポートする手順
- スプールでINSERT文をファイルに出力する方法
- DIRECTORYオブジェクトが見つからない場合の対処法
方法1: expdp(Data Pump Export)でテーブル単位エクスポート【推奨】
Oracle 10g以降で利用できるData Pump(expdp)は、テーブル単位のエクスポートに最も適した方法です。高速・信頼性が高く、大規模テーブルにも対応しています。
ステップ1: ディレクトリオブジェクトの作成
expdpはOS上の物理ディレクトリをOracleの「ディレクトリオブジェクト」として登録する必要があります。DBA権限で実行してください。
-- ディレクトリオブジェクトの作成(DBA権限が必要) CREATE OR REPLACE DIRECTORY BACKUP_DIR AS '/home/oracle/backup'; -- 実行ユーザーに読み書き権限を付与 GRANT READ, WRITE ON DIRECTORY BACKUP_DIR TO scott; -- 登録済みディレクトリの確認 SELECT DIRECTORY_NAME, DIRECTORY_PATH FROM DBA_DIRECTORIES;
oracle)がそのディレクトリへの書き込み権限を持っている必要があります。ステップ2: expdpでテーブルをエクスポート
tables=スキーマ名.テーブル名 パラメータを指定するのが基本構文です。OSコマンドラインから実行します。
# 基本構文: 1テーブルをエクスポート expdp scott/tiger@orcl \ DIRECTORY=BACKUP_DIR \ DUMPFILE=emp_backup.dmp \ LOGFILE=emp_backup.log \ TABLES=SCOTT.EMP # スキーマ省略(接続ユーザー自身のテーブル) expdp scott/tiger@orcl \ DIRECTORY=BACKUP_DIR \ DUMPFILE=emp_backup.dmp \ TABLES=EMP
複数テーブルを一括エクスポート
カンマ区切りで複数テーブルをまとめてエクスポートできます。
# 複数テーブルを1つのdmpファイルにまとめてエクスポート expdp scott/tiger@orcl \ DIRECTORY=BACKUP_DIR \ DUMPFILE=multi_tables.dmp \ LOGFILE=multi_tables.log \ TABLES=SCOTT.EMP,SCOTT.DEPT,SCOTT.SALGRADE # ワイルドカードでパターン一致するテーブルを一括エクスポート expdp scott/tiger@orcl \ DIRECTORY=BACKUP_DIR \ DUMPFILE=emp_tables.dmp \ TABLES=SCOTT.EMP% \ INCLUDE=TABLE:"LIKE 'EMP%'"
impdpによるリストア手順
エクスポートしたdmpファイルからテーブルを復元するにはimpdpを使います。
# 基本的なリストア(同一スキーマに戻す) impdp scott/tiger@orcl \ DIRECTORY=BACKUP_DIR \ DUMPFILE=emp_backup.dmp \ LOGFILE=emp_restore.log \ TABLES=SCOTT.EMP # 別スキーマへのリストア(REMAP_SCHEMA使用) impdp system/manager@orcl \ DIRECTORY=BACKUP_DIR \ DUMPFILE=emp_backup.dmp \ REMAP_SCHEMA=SCOTT:SCOTT2 \ TABLES=SCOTT.EMP # テーブルが既に存在する場合はTABLE_EXISTS_ACTIONで制御 # REPLACE: 既存テーブルを削除して再作成 # TRUNCATE: データを空にして挿入 # APPEND: 追記 impdp scott/tiger@orcl \ DIRECTORY=BACKUP_DIR \ DUMPFILE=emp_backup.dmp \ TABLES=SCOTT.EMP \ TABLE_EXISTS_ACTION=REPLACE
方法2: 旧expユーティリティ(Oracle 10g以前・現在は非推奨)
Oracle 9i以前のバージョンや、レガシー環境ではオリジナルのexpツールが使われていました。現在のOracle 12c以降では非推奨(deprecated)となっており、将来のバージョンで削除される予定です。
# 旧expでテーブルをエクスポート exp scott/tiger@orcl \ FILE=emp_backup.dmp \ LOG=emp_backup.log \ TABLES=SCOTT.EMP # 複数テーブル exp scott/tiger@orcl \ FILE=multi.dmp \ TABLES=(SCOTT.EMP,SCOTT.DEPT)
expdp(Data Pump)を使用することを強く推奨します。expはOracle 21c以降では利用できない場合があります。方法3: CREATE TABLE AS SELECT(CTAS)でDB内複製
CTAS(Create Table As Select)はSQL一行でテーブルをデータごとコピーできる方法です。別サーバーへの転送は不要で、同じDB内にスナップショットを保持したい場合に最適です。
基本構文
-- EMPテーブルをEMP_BKとしてコピー(データも含む) CREATE TABLE EMP_BK AS SELECT * FROM EMP; -- WHERE句でデータを絞り込んでコピー CREATE TABLE EMP_BK_SALES AS SELECT * FROM EMP WHERE DEPTNO = 30; -- テーブル構造のみコピー(データなし) CREATE TABLE EMP_EMPTY AS SELECT * FROM EMP WHERE 1=0;
定期バックアップの命名規則
日付をテーブル名に含めることで、複数世代のバックアップを管理できます。
-- 日付付きバックアップテーブルの作成
CREATE TABLE EMP_BK_20240315 AS SELECT * FROM EMP;
CREATE TABLE ORDERS_BK_20240315 AS SELECT * FROM ORDERS;
-- 動的SQLで当日日付のバックアップテーブルを作成(PL/SQL)
DECLARE
v_sql VARCHAR2(200);
BEGIN
v_sql := 'CREATE TABLE EMP_BK_' || TO_CHAR(SYSDATE, 'YYYYMMDD')
|| ' AS SELECT * FROM EMP';
EXECUTE IMMEDIATE v_sql;
DBMS_OUTPUT.PUT_LINE('作成完了: ' || v_sql);
END;
/
方法4: SQL DeveloperのGUIでエクスポート
Oracle SQL Developerを使えば、コマンドを一切書かずにGUI操作でテーブルをエクスポートできます。CSV・Excel・INSERT文・XML・Excelなど多様な形式に対応しています。
エクスポート手順
- SQL Developerでデータベースに接続する
- 左のツリーから「接続」→「スキーマ」→「テーブル」を展開
- エクスポートしたいテーブルを右クリック → 「エクスポート」を選択
- エクスポート形式を選択(CSV / Excel(xlsx) / INSERT / XML / テキスト など)
- 出力先ファイルパスを指定して「完了」をクリック
複数テーブルを一括エクスポートする場合
- メニュー「ツール」→「データベース・エクスポート」を選択
- 接続を選択し、エクスポートするオブジェクト(テーブル)にチェックを入れる
- 出力形式・出力先を指定して実行
方法5: SQL*Plusのスプールでデータをファイル出力
SQL*PlusのSPOOLコマンドを使って、SELECTの結果やINSERT文をテキストファイルに書き出す方法です。簡易バックアップや他DBへのデータ移行に使われます。
INSERT文としてエクスポート
-- SQL*Plus上で実行
SPOOL /home/oracle/backup/emp_insert.sql
SET HEADING OFF
SET FEEDBACK OFF
SET PAGESIZE 0
SET TRIMSPOOL ON
SELECT 'INSERT INTO EMP VALUES(' ||
EMPNO || ',' ||
'''' || ENAME || '''' || ',' ||
'''' || JOB || '''' || ');'
FROM EMP;
COMMIT;
SPOOL OFF
CSVとしてエクスポート(簡易版)
SET COLSEP ',' SET PAGESIZE 0 SET FEEDBACK OFF SET TRIMSPOOL ON SPOOL /home/oracle/backup/emp.csv SELECT EMPNO, ENAME, JOB, SAL, DEPTNO FROM EMP; SPOOL OFF
各方法の比較表
目的や環境に応じて最適な方法を選んでください。
| 方法 | 対応バージョン | 別DBへ移行 | 大容量テーブル | 難易度 | 推奨度 |
|---|---|---|---|---|---|
| expdp(Data Pump) | 10g以降 | ◎ | ◎ | 中 | ★★★★★ |
| 旧exp | 〜9i(非推奨) | ◎ | ○ | 中 | ★☆☆☆☆ |
| CTAS | 全バージョン | △(同DB内のみ) | ○ | 低 | ★★★★☆ |
| SQL Developer | GUI版のみ | ○ | △ | 低 | ★★★☆☆ |
| スプール(SQL*Plus) | 全バージョン | ○ | △ | 中 | ★★☆☆☆ |
expdpのDIRECTORYが見つからない場合の対処法
expdpを実行したときに ORA-39002: invalid operation や ORA-39070: Unable to open the log file が出る場合、DIRECTORYオブジェクトの設定に問題がある可能性があります。
ディレクトリオブジェクトの確認
-- 登録済みディレクトリオブジェクトの一覧 SELECT DIRECTORY_NAME, DIRECTORY_PATH FROM DBA_DIRECTORIES ORDER BY DIRECTORY_NAME; -- 特定ユーザーのディレクトリ権限確認 SELECT GRANTEE, PRIVILEGE, DIRECTORY_NAME FROM DBA_TAB_PRIVS WHERE TABLE_NAME IN (SELECT DIRECTORY_NAME FROM DBA_DIRECTORIES) ORDER BY GRANTEE;
よくある原因と対処
| 原因 | 対処法 |
|---|---|
| OSにディレクトリが存在しない | mkdir -p /home/oracle/backup でディレクトリを作成する |
| Oracleユーザーに書き込み権限がない | chown oracle:oinstall /home/oracle/backup で所有者を変更する |
| Oracleユーザーに権限が付与されていない | GRANT READ, WRITE ON DIRECTORY BACKUP_DIR TO ユーザー; を実行する |
| DATAPUMPDIRを使いたい場合 | デフォルトのDATA_PUMP_DIRのパスをDBA_DIRECTORIESで確認し、そのディレクトリに書き込む |
-- デフォルトのDATA_PUMP_DIRの場所を確認 SELECT DIRECTORY_PATH FROM DBA_DIRECTORIES WHERE DIRECTORY_NAME = 'DATA_PUMP_DIR';
よくある質問
CONTENT=DATA_ONLY オプションを付けるとデータのみをエクスポートできます。CTASではWHERE句で全行を取得すれば構造ごとコピーされます。FILESIZE パラメータでファイルサイズの上限を指定し、DUMPFILE=backup_%U.dmp(%Uで連番)とすることで自動分割できます。関連記事
- 【Oracle】Data Pumpの使い方まとめ|expdp/impdpの基本と実用例
- 【Oracle】expdpでWHERE句を使って一部データだけをエクスポートする方法
- 【Oracle】表領域ごとにエクスポート・インポートする方法
- 【Oracle】バックアップの速度を上げる方法
- expdp(Data Pump): 最も推奨。高速・安全・impdpで確実にリストアできる。Oracle 10g以降で使用可能
- 旧exp: レガシー環境のみ。現行Oracle環境では非推奨
- CTAS: 同一DB内のスナップショットに最適。コマンド1行で即実行できる
- SQL Developer: GUIで手軽に操作でき、CSV/Excel等への出力も可能
- スプール: SQL*Plusからテキストファイルに柔軟に出力できる

