【Oracle】指定したテーブルのみバックアップを取る方法完全ガイド|expdp・exp・CTAS・SQL Developer

【Oracle】指定したテーブルのみバックアップを取る方法 Oracle

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;
注意: ディレクトリオブジェクトが指すOSパスは、Oracleサーバー上に実際に存在する必要があります。また、Oracleプロセスの実行ユーザー(通常 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
Data Pumpの詳しい使い方は 【Oracle】Data Pumpの使い方まとめ|expdp/impdpの基本と実用例 を参照してください。WHERE句でエクスポート対象を絞り込む方法は 【Oracle】expdpでWHERE句を使って一部データだけをエクスポートする方法 で解説しています。

方法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;
/
CTASのメリット: DBサーバー外への転送不要で即時実行可能。デメリット: 別スキーマや別DBへの移行には不向き。古いバックアップテーブルが溜まると表領域を圧迫するため定期削除が必要です。

方法4: SQL DeveloperのGUIでエクスポート

Oracle SQL Developerを使えば、コマンドを一切書かずにGUI操作でテーブルをエクスポートできます。CSV・Excel・INSERT文・XML・Excelなど多様な形式に対応しています。

エクスポート手順

  1. SQL Developerでデータベースに接続する
  2. 左のツリーから「接続」→「スキーマ」→「テーブル」を展開
  3. エクスポートしたいテーブルを右クリック → 「エクスポート」を選択
  4. エクスポート形式を選択(CSV / Excel(xlsx) / INSERT / XML / テキスト など)
  5. 出力先ファイルパスを指定して「完了」をクリック

複数テーブルを一括エクスポートする場合

  1. メニュー「ツール」→「データベース・エクスポート」を選択
  2. 接続を選択し、エクスポートするオブジェクト(テーブル)にチェックを入れる
  3. 出力形式・出力先を指定して実行
活用シーン: 開発環境での軽量なデータ移行や、非エンジニアがデータを取得・確認する場面に最適です。コマンドライン不要で直感的に操作できます。

方法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 operationORA-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';
表領域のエクスポート・インポートについては 【Oracle】表領域ごとにエクスポート・インポートする方法 も合わせてご覧ください。バックアップの処理速度を改善したい場合は 【Oracle】バックアップの速度を上げる方法 を参照してください。

よくある質問

expdpとexpの違いは何ですか?
expdp(Data Pump)はOracle 10gで導入された新世代のエクスポートツールで、サーバーサイドで動作するため高速です。旧expはクライアントサイドで動作し現在は非推奨です。新規構築では必ずexpdpを使用してください。
テーブルのデータだけをバックアップしたい(DDLは不要)場合は?
expdpでは CONTENT=DATA_ONLY オプションを付けるとデータのみをエクスポートできます。CTASではWHERE句で全行を取得すれば構造ごとコピーされます。
expdpで特定の列だけをエクスポートすることはできますか?
列単位の選択は直接はできません。特定列だけのバックアップにはCTASでビューまたはサブクエリを使った別テーブルを作成するか、スプールでSELECTする列を指定するのが実用的です。
バックアップ先のファイルサイズを分割したい場合は?
expdpの FILESIZE パラメータでファイルサイズの上限を指定し、DUMPFILE=backup_%U.dmp(%Uで連番)とすることで自動分割できます。
CTASでバックアップしたテーブルのインデックスや制約は引き継がれますか?
CTASはデータと列定義のみをコピーします。主キー・外部キー・インデックス・トリガーは引き継がれません。完全な構造ごとのバックアップにはexpdpを使用してください。

関連記事

まとめ

  • expdp(Data Pump): 最も推奨。高速・安全・impdpで確実にリストアできる。Oracle 10g以降で使用可能
  • 旧exp: レガシー環境のみ。現行Oracle環境では非推奨
  • CTAS: 同一DB内のスナップショットに最適。コマンド1行で即実行できる
  • SQL Developer: GUIで手軽に操作でき、CSV/Excel等への出力も可能
  • スプール: SQL*Plusからテキストファイルに柔軟に出力できる