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 表領域はオンライン中に部分リストアできない(後述) |
-- データファイルの状態を確認 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 にしてリストア・リカバリします。対象表領域以外のテーブルへのアクセスは継続可能です。
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: アーカイブログ(REDO ログ)を適用して最新の状態に復旧する
RESTORE だけでは「バックアップ取得時点」のデータしか復元されないため、必ず RECOVER も実行して最新状態にしてください。
複数の表領域を同時にリストアする
# 複数表領域を同時に指定可能 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 つだけが破損している場合、データファイル単位でリストアすれば復旧範囲をさらに絞り込めます。
-- データファイル番号を確認 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 コマンドで事前に検証できます。壊れたバックアップでリストアを開始して途中で失敗するリスクを回避します。
# 表領域のバックアップが有効か検証(実際にはリストアしない) RMAN> RESTORE TABLESPACE users VALIDATE; # データベース全体のバックアップ検証 RMAN> RESTORE DATABASE VALIDATE; # データファイルの物理的な破損チェック RMAN> VALIDATE DATAFILE 4; # 表領域のデータファイル検証 RMAN> VALIDATE TABLESPACE users;
VALIDATE は実際にデータファイルを書き換えないため安全に実行でき、バックアップの完全性を確認できます。特に長期間経過したバックアップやテープから復元する場合は必須の確認手順です。
BLOCK RECOVER で破損ブロックだけ修復する
データファイル全体ではなく、破損した特定のブロックだけをバックアップから修復することもできます。表領域を OFFLINE にする必要がなく、影響範囲が最小です。
# 破損ブロックを確認 RMAN> LIST FAILURE; -- または SELECT * FROM v$database_block_corruption; # 特定ブロックを修復(ファイル 4、ブロック 1234) RMAN> BLOCKRECOVER DATAFILE 4 BLOCK 1234; # 破損ブロックを全て自動修復 RMAN> BLOCKRECOVER CORRUPTION LIST;
・対象ブロックを含む RMAN バックアップ(フルまたは増分)が存在すること
・ARCHIVELOG モードであること
・破損がデータブロックであること(制御ファイルやオンラインログの破損には使えない)
TSPITR(表領域の Point-in-Time リカバリ)
TSPITR(Tablespace Point-in-Time Recovery)は、特定の表領域だけを過去の特定時点の状態に戻す機能です。誤った大量 UPDATE や TRUNCATE を表領域単位で取り消す場合に使います。
# 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. 補助インスタンスを自動削除
・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 + 再作成で復旧 |
# SYSTEM / UNDO はオンライン中に部分リストアできない # → DB を MOUNT モードにして全体リストアに近い手順が必要 RMAN> SHUTDOWN IMMEDIATE; RMAN> STARTUP MOUNT; RMAN> RESTORE TABLESPACE system; RMAN> RECOVER TABLESPACE system; RMAN> ALTER DATABASE OPEN;
-- 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 表領域が破損
# (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)
# 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)
# 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';
リストア後の確認
-- (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
よくある質問
RESTORE TABLESPACE は指定した表領域のデータファイルだけを復元します。DB を停止する必要がなく(SYSTEM / UNDO を除く)、高速です。RESTORE DATABASE はデータベース全体を復元します。DB を MOUNT モードにする必要があり、時間がかかります。障害が一部の表領域に限定されているなら、RESTORE TABLESPACE で十分です。v$database_block_corruption や RMAN 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 バックアップを自動化する方法」、表領域単位のバックアップ取得は「表領域単位のバックアップを取得する方法」も併せて参照してください。

