【Oracle】RMAN で特定の表領域だけを復元する方法|OFFLINE→RESTORE→RECOVER→ONLINE・データファイル単位・VALIDATE・TSPITR まで解説

【Oracle】RMAN で特定の表領域だけを復元する方法|OFFLINE→RESTORE→RECOVER→ONLINE・データファイル単位・VALIDATE・TSPITR まで解説 Oracle

Oracle データベースで特定の表領域のデータファイルが破損した場合、データベース全体を停止・リストアする必要はありません。RMAN を使えば、DB を稼働させたまま対象の表領域だけをOFFLINE にしてリストア・リカバリし、ONLINE に戻すことができます。これにより障害の影響範囲とダウンタイムを最小限に抑えられます。

本記事では、表領域の部分リストアの基本手順データファイル単位のリストアRMAN VALIDATE による事前検証TSPITR(表領域の Point-in-Time リカバリ)、そしてSYSTEM / UNDO 表領域の特別な扱いまで解説します。

この記事でわかること
・DB 稼働中に表領域を部分リストアする手順(OFFLINE → RESTORE → RECOVER → ONLINE)
・データファイル単位でリストアする方法
・RMAN VALIDATE でバックアップの有効性を事前検証する方法
・TSPITR(表領域の Point-in-Time リカバリ)
・BLOCK RECOVER で破損ブロックだけ修復する方法
・SYSTEM / UNDO / TEMP 表領域の復元時の注意点
・表領域の状態確認に使う SQL
スポンサーリンク

前提条件

条件 詳細
ARCHIVELOG モード 部分リストア後のリカバリにアーカイブログが必要。必須
RMAN バックアップ 対象表領域を含むバックアップが存在すること
表領域の特定 障害が発生した表領域名またはデータファイル番号を把握していること
SYSTEM / UNDO 以外 SYSTEM と UNDO 表領域はオンライン中に部分リストアできない(後述)
SQL(障害の確認: データファイルの状態)
-- データファイルの状態を確認
SELECT file#, name, status, tablespace_name
FROM v$datafile
ORDER BY file#;
-- status: ONLINE / OFFLINE / RECOVER(要リカバリ)

-- 表領域の状態を確認
SELECT tablespace_name, status FROM dba_tablespaces ORDER BY 1;
-- status: ONLINE / OFFLINE / READ ONLY

-- RMAN でバックアップの存在を確認
-- RMAN> LIST BACKUP OF TABLESPACE USERS;

表領域の部分リストア手順(DB 稼働中)

DB を停止せずに、対象表領域だけを OFFLINE にしてリストア・リカバリします。対象表領域以外のテーブルへのアクセスは継続可能です。

Shell(表領域の部分リストア: 基本手順)
rman target /

# (1) 対象表領域を OFFLINE にする
RMAN> SQL 'ALTER TABLESPACE users OFFLINE IMMEDIATE';
# IMMEDIATE: 障害ファイルがあっても強制的に OFFLINE にする

# (2) 表領域をリストア(バックアップからデータファイルを復元)
RMAN> RESTORE TABLESPACE users;

# (3) 表領域をリカバリ(アーカイブログを適用して最新状態に復旧)
RMAN> RECOVER TABLESPACE users;

# (4) 表領域を ONLINE に戻す
RMAN> SQL 'ALTER TABLESPACE users ONLINE';

# 完了: users 表領域が最新の状態で復旧
RESTORE と RECOVER の違い
RESTORE: バックアップからデータファイルをディスクに書き出す(バックアップ時点の状態)
RECOVER: アーカイブログ(REDO ログ)を適用して最新の状態に復旧する
RESTORE だけでは「バックアップ取得時点」のデータしか復元されないため、必ず RECOVER も実行して最新状態にしてください。

複数の表領域を同時にリストアする

Shell(複数表領域の部分リストア)
# 複数表領域を同時に指定可能
RMAN> SQL 'ALTER TABLESPACE users OFFLINE IMMEDIATE';
RMAN> SQL 'ALTER TABLESPACE app_data OFFLINE IMMEDIATE';

RMAN> RESTORE TABLESPACE users, app_data;
RMAN> RECOVER TABLESPACE users, app_data;

RMAN> SQL 'ALTER TABLESPACE users ONLINE';
RMAN> SQL 'ALTER TABLESPACE app_data ONLINE';

データファイル単位でリストアする

表領域に複数のデータファイルがあり、そのうち 1 つだけが破損している場合、データファイル単位でリストアすれば復旧範囲をさらに絞り込めます。

Shell(データファイル単位のリストア)
-- データファイル番号を確認
RMAN> REPORT SCHEMA;
-- File  Size(MB) Tablespace    RB segs  Datafile Name
-- ----  -------- ----------    -------  ----------------------------
-- 4     500      USERS         ***      /oracle/oradata/ORCL/users01.dbf
-- 5     300      USERS         ***      /oracle/oradata/ORCL/users02.dbf

# ファイル番号 4 だけリストア
RMAN> SQL "ALTER DATABASE DATAFILE 4 OFFLINE";
RMAN> RESTORE DATAFILE 4;
RMAN> RECOVER DATAFILE 4;
RMAN> SQL "ALTER DATABASE DATAFILE 4 ONLINE";

# ファイルパスでも指定可能
RMAN> RESTORE DATAFILE '/oracle/oradata/ORCL/users01.dbf';

RMAN VALIDATE で事前検証する

リストアを実行する前に、RMAN バックアップが正常に読み取れるかをVALIDATE コマンドで事前に検証できます。壊れたバックアップでリストアを開始して途中で失敗するリスクを回避します。

Shell(VALIDATE コマンド)
# 表領域のバックアップが有効か検証(実際にはリストアしない)
RMAN> RESTORE TABLESPACE users VALIDATE;

# データベース全体のバックアップ検証
RMAN> RESTORE DATABASE VALIDATE;

# データファイルの物理的な破損チェック
RMAN> VALIDATE DATAFILE 4;

# 表領域のデータファイル検証
RMAN> VALIDATE TABLESPACE users;
本番のリストア前に必ず VALIDATE を実行
VALIDATE は実際にデータファイルを書き換えないため安全に実行でき、バックアップの完全性を確認できます。特に長期間経過したバックアップやテープから復元する場合は必須の確認手順です。

BLOCK RECOVER で破損ブロックだけ修復する

データファイル全体ではなく、破損した特定のブロックだけをバックアップから修復することもできます。表領域を OFFLINE にする必要がなく、影響範囲が最小です。

Shell(ブロックレベルのリカバリ)
# 破損ブロックを確認
RMAN> LIST FAILURE;
-- または
SELECT * FROM v$database_block_corruption;

# 特定ブロックを修復(ファイル 4、ブロック 1234)
RMAN> BLOCKRECOVER DATAFILE 4 BLOCK 1234;

# 破損ブロックを全て自動修復
RMAN> BLOCKRECOVER CORRUPTION LIST;
BLOCK RECOVER の前提条件
・対象ブロックを含む RMAN バックアップ(フルまたは増分)が存在すること
・ARCHIVELOG モードであること
・破損がデータブロックであること(制御ファイルやオンラインログの破損には使えない)

TSPITR(表領域の Point-in-Time リカバリ)

TSPITR(Tablespace Point-in-Time Recovery)は、特定の表領域だけを過去の特定時点の状態に戻す機能です。誤った大量 UPDATE や TRUNCATE を表領域単位で取り消す場合に使います。

Shell(TSPITR の実行)
# USERS 表領域を 2 時間前の状態に戻す
RMAN> RECOVER TABLESPACE users
      UNTIL TIME "TO_DATE('2026-03-29 12:00:00','YYYY-MM-DD HH24:MI:SS')"
      AUXILIARY DESTINATION '/tmp/rman_aux';

# 処理の流れ:
# 1. 補助インスタンスを自動作成
# 2. 対象表領域を指定時点まで復旧
# 3. Data Pump で元の DB にインポート
# 4. 補助インスタンスを自動削除
TSPITR の制約
・SYSTEM / SYSAUX / UNDO 表領域には使えない
・他の表領域と外部キー制約で結ばれている場合、関連表領域も同時にリカバリが必要
・補助インスタンス用のディスク領域が必要(AUXILIARY DESTINATION)
・TSPITR 後、対象表領域は RESETLOGS 前の状態になるため、リカバリ対象時点以降のアーカイブログは表領域に適用できない

SYSTEM / UNDO / TEMP 表領域の復元

表領域 オンライン中の部分リストア 復元方法
USERS / APP_DATA(一般) 可能(OFFLINE → RESTORE → RECOVER → ONLINE) 本記事の基本手順
SYSTEM 不可 DB を MOUNT モードにしてリストア・リカバリ後に OPEN
SYSAUX 不可(12c 以降は部分的に可能な場合あり) DB を MOUNT モードが安全
UNDO 不可 DB を MOUNT モードにしてリストア・リカバリ
TEMP リストア不要 TEMP は一時データなので DROP + 再作成で復旧
Shell(SYSTEM 表領域のリストア: DB MOUNT 必須)
# SYSTEM / UNDO はオンライン中に部分リストアできない
# → DB を MOUNT モードにして全体リストアに近い手順が必要

RMAN> SHUTDOWN IMMEDIATE;
RMAN> STARTUP MOUNT;

RMAN> RESTORE TABLESPACE system;
RMAN> RECOVER TABLESPACE system;

RMAN> ALTER DATABASE OPEN;
SQL(TEMP 表領域の復旧: リストア不要)
-- TEMP 表領域はバックアップ/リストア不要
-- 破損した場合は再作成するだけ

-- 既存の TEMP を DROP
ALTER TABLESPACE temp DROP TEMPFILE '/oracle/oradata/ORCL/temp01.dbf';

-- 新しい TEMPFILE を追加
ALTER TABLESPACE temp ADD TEMPFILE '/oracle/oradata/ORCL/temp01.dbf' SIZE 500M AUTOEXTEND ON;

実務パターン集

パターン(1): ディスク障害で USERS 表領域が破損

Shell
# (1) アラートログで障害を確認
# ORA-01116: error in opening database file 4
# ORA-27041: unable to open file

# (2) RMAN で部分リストア
rman target /
RMAN> SQL 'ALTER TABLESPACE users OFFLINE IMMEDIATE';
RMAN> RESTORE TABLESPACE users;
RMAN> RECOVER TABLESPACE users;
RMAN> SQL 'ALTER TABLESPACE users ONLINE';

# (3) 復旧確認
RMAN> SQL "SELECT COUNT(*) FROM hr.employees";

パターン(2): 特定ブロックの破損(ORA-01578)

Shell
# ORA-01578: ORACLE data block corrupted (file # 4, block # 1234)

# 表領域を OFFLINE にせず、ブロックだけ修復
rman target /
RMAN> BLOCKRECOVER DATAFILE 4 BLOCK 1234;

# 複数ブロックが破損している場合
RMAN> BLOCKRECOVER CORRUPTION LIST;

パターン(3): 誤 TRUNCATE の復旧(TSPITR)

Shell
# USERS 表領域内のテーブルを TRUNCATE してしまった
# → USERS 表領域を TRUNCATE 前の状態に戻す

rman target /
RMAN> RECOVER TABLESPACE users
      UNTIL TIME "TO_DATE('2026-03-29 14:00:00','YYYY-MM-DD HH24:MI:SS')"
      AUXILIARY DESTINATION '/tmp/rman_aux';

# 注意: TSPITR 後は ALTER TABLESPACE users ONLINE が必要
RMAN> SQL 'ALTER TABLESPACE users ONLINE';

リストア後の確認

SQL(復旧後の確認クエリ)
-- (1) データファイルの状態確認
SELECT file#, name, status FROM v$datafile ORDER BY 1;
-- 全ファイルが ONLINE であることを確認

-- (2) 表領域の状態確認
SELECT tablespace_name, status FROM dba_tablespaces ORDER BY 1;

-- (3) 破損ブロックが残っていないか確認
SELECT * FROM v$database_block_corruption;
-- 0 件なら OK

-- (4) アラートログでエラーが出ていないか確認
-- $ tail -100 $ORACLE_BASE/diag/rdbms/orcl/ORCL/trace/alert_ORCL.log

よくある質問

Q表領域のリストア中、他のテーブルにアクセスできますか?
Aはい。OFFLINE にした表領域のオブジェクトにはアクセスできませんが、他の表領域にあるオブジェクトには通常通りアクセス可能です。これが部分リストアの最大のメリットで、DB 全体を停止する必要がありません。
QSYSTEM 表領域はオンライン中にリストアできますか?
Aできません。SYSTEM 表領域はデータディクショナリを格納しており、DB 稼働に不可欠なため OFFLINE にできません。SYSTEM 表領域のリストアには DB を MOUNT モードにする必要があり、事実上の全停止になります。
QTEMP 表領域が破損しました。リストアは必要ですか?
Aリストアは不要です。TEMP 表領域には一時データ(ソート領域等)しか格納されないため、バックアップからの復元は不要です。TEMPFILE を DROP して再追加するだけで復旧できます。
QNOARCHIVELOG モードでも部分リストアできますか?
A実用的にはできません。NOARCHIVELOG モードではアーカイブログがないため、RESTORE 後の RECOVER(バックアップ時点→現在への復旧)ができません。結果として「バックアップ時点」のデータしか復元できず、それ以降の変更はすべて失われます。部分リストアを活用するならARCHIVELOG モードは必須です。
QRESTORE TABLESPACE と RESTORE DATABASE の違いは?
ARESTORE TABLESPACE は指定した表領域のデータファイルだけを復元します。DB を停止する必要がなく(SYSTEM / UNDO を除く)、高速です。
RESTORE DATABASE はデータベース全体を復元します。DB を MOUNT モードにする必要があり、時間がかかります。障害が一部の表領域に限定されているなら、RESTORE TABLESPACE で十分です。
QBLOCK RECOVER はどんな場合に使えますか?
A少数のブロックだけが破損している場合に使います。表領域を OFFLINE にする必要がなく、影響範囲が最小です。v$database_block_corruptionRMAN LIST FAILURE で破損ブロックを確認してから実行してください。大量のブロックが破損している場合は、表領域単位のリストアの方が効率的です。

まとめ

RMAN による表領域の部分リストアの要点をまとめます。

やりたいこと コマンド
表領域の部分リストア(基本) SQL ‘ALTER TABLESPACE ts OFFLINE IMMEDIATE’; RESTORE TABLESPACE ts; RECOVER TABLESPACE ts; SQL ‘ALTER TABLESPACE ts ONLINE’
データファイル単位のリストア SQL ‘ALTER DATABASE DATAFILE n OFFLINE’; RESTORE DATAFILE n; RECOVER DATAFILE n; SQL ‘ALTER DATABASE DATAFILE n ONLINE’
バックアップの事前検証 RESTORE TABLESPACE ts VALIDATE
破損ブロックの修復 BLOCKRECOVER DATAFILE n BLOCK m / BLOCKRECOVER CORRUPTION LIST
表領域の PITR(過去時点に復元) RECOVER TABLESPACE ts UNTIL TIME ‘…’ AUXILIARY DESTINATION ‘…’
TEMP 表領域の復旧 ALTER TABLESPACE temp DROP TEMPFILE …; ALTER TABLESPACE temp ADD TEMPFILE …
破損ブロックの確認 SELECT * FROM v$database_block_corruption

増分バックアップの詳細は「RMAN 増分バックアップ完全ガイド」、バックアップの自動化は「RMAN バックアップを自動化する方法」、表領域単位のバックアップ取得は「表領域単位のバックアップを取得する方法」も併せて参照してください。