[Oracle] RMANバックアップからのリストア+リカバリ方法

Oracle

本記事では、取得されているRMANバックアップから、データベースをリストア+リカバリする方法を解説します。

Oracleでのリカバリ方法には「完全リカバリ」と「不完全リカバリ」の2種類あります。
用途に応じて使い分けることができますので、完全リカバリと不完全リカバリの両方を解説します。

本記事の前提

本記事は以下を前提としています。

本記事ではリストア+リカバリを試すために、SYSTEM表領域のデータファイルを意図的に削除しています。
SYSTEM表領域のデータファイルが破損してしまった状況とします。

$ sqlplus / as sysdba

SQL> set lines 80 pages 300
SQL> select name from v$datafile;

NAME
--------------------------------------------------------------------------------
/u01/app/oracle/oradata/RU22DB/system01.dbf ★本ファイルを削除してみます
/u01/app/oracle/oradata/RU22DB/pdbseed/system01.dbf
/u01/app/oracle/oradata/RU22DB/sysaux01.dbf
/u01/app/oracle/oradata/RU22DB/pdbseed/sysaux01.dbf
/u01/app/oracle/oradata/RU22DB/undotbs01.dbf
  :

SQL> shutdown immediate
SQL> quit

$ rm /u01/app/oracle/oradata/RU22DB/system01.dbf

SYSTEM表領域のデータファイルが削除された場合や破損した場合は、MOUNT状態までは起動できますが、OPEN状態にすることができません。
データファイルが削除されていた場合は、起動時にORA-1157/ORA-1110が発生します。

$ sqlplus / as sysdba
SQL> startup

ORACLE instance started.

Total System Global Area 3221225296 bytes
Fixed Size                  9183056 bytes
Variable Size             889192448 bytes
Database Buffers         2315255808 bytes
Redo Buffers                7593984 bytes
Database mounted.
ORA-01157: cannot identify/lock data file 1 - see DBWR trace file
ORA-01110: data file 1: '/u01/app/oracle/oradata/RU22DB/system01.dbf'

SQL> select name, open_mode from v$database;

NAME      OPEN_MODE
--------- --------------------
RU22DB    MOUNTED

SQL> alter database open;
alter database open
*
ERROR at line 1:
ORA-01157: cannot identify/lock data file 1 - see DBWR trace file
ORA-01110: data file 1: '/u01/app/oracle/oradata/RU22DB/system01.dbf'

Oracleでの用語として「リストア」と「リカバリ」があります。
どちらも似たような用語ですが、Oracleでは使い分けていますのでそれぞれの意味を解説しておきます。

リストア(Restore)とは?

リストアとは、バックアップから必要なファイルを取り戻す作業のことです。

  • バックアップからデータファイルや制御ファイルをコピーして戻します
  • 作業としては「壊れたファイルを過去の状態に戻す」イメージです

データベースのデータファイルが消えてしまったとき、バックアップを使って元の場所にコピーすることを意味します。
このため、リストアだけではファイルは「バックアップ取得時点」の状態にしか戻りません。

リカバリ(Recovery)とは?

リカバリとは、リストアしたファイルを最新の状態に追いつかせる作業です。

  • アーカイブログやREDOログを適用して、障害発生直前や指定した時点の状態に戻します
  • 作業としては「過去のファイルに対して、変更履歴を再生する」イメージです

昨日のバックアップをリストアした後、今日の朝までに発生したトランザクションを反映して、障害直前の状態に戻すことを意味します。

完全リカバリと不完全リカバリ

Oracleでのリカバリ方法には「完全リカバリ」と「不完全リカバリ」の2種類あります。
どちらも「リカバリ」ですが、到達できる状態に違いがあります。

種類到達できる状態データ損失主な利用シーン
完全リカバリ障害直前の最新状態なしハード障害や物理的な破損
不完全リカバリ指定した過去の時点あり誤操作や論理的障害

完全リカバリとは?

完全リカバリとは、障害が発生する直前の最新状態まで戻すリカバリのことです。

  • バックアップからリストアした後、すべてのアーカイブログとREDOログを適用する
  • データ損失は原則ゼロ
  • ハード障害やディスク破損の復旧時によく使われる

昨日の夜に取得したバックアップをリストアし、今朝の障害発生直前までログを適用して完全復旧する場合などを指します。

不完全リカバリとは?

不完全リカバリとは、指定した時点まで巻き戻すリカバリのことです。

  • すべてのログを適用せず、途中で止める
  • データは一部失われる(最新状態までは戻せない)
  • 誤操作や論理的障害の復旧に利用される

誤ってテーブルをDROPしてしまったので、DROPする前の時刻までリカバリを行うことなどを指します。

完全リカバリの実行例

取得されているバックアップを利用してRMANコマンドで完全リカバリを行います。
シンプルな完全リカバリのコマンド例は以下です。

run {
    restore database;
    recover database;
}

実行結果も載せておきます。
本記事ではデータファイルやアーカイブログの容量が少ないので、リストア+リカバリは一瞬で完了していますが、容量が多くなると、その分リストアやリカバリに時間が掛かることになります。

$ rman target / nocatalog

Recovery Manager: Release 19.0.0.0.0 - Production on Wed Sep 24 22:47:17 2025
Version 19.22.0.0.0

Copyright (c) 1982, 2019, Oracle and/or its affiliates.  All rights reserved.

connected to target database: RU22DB (DBID=683921111, not open)
using target database control file instead of recovery catalog

RMAN> run {
    restore database;
    recover database;
}
2> 3> 4>
Starting restore at 24-SEP-25 ★リストア開始
  :
channel ORA_DISK_1: specifying datafile(s) to restore from backup set
channel ORA_DISK_1: restoring datafile 00001 to /u01/app/oracle/oradata/RU22DB/system01.dbf
channel ORA_DISK_1: restoring datafile 00003 to /u01/app/oracle/oradata/RU22DB/sysaux01.dbf
channel ORA_DISK_1: restoring datafile 00005 to /u01/app/oracle/oradata/RU22DB/undotbs01.dbf
channel ORA_DISK_1: restoring datafile 00007 to /u01/app/oracle/oradata/RU22DB/users01.dbf
channel ORA_DISK_1: reading from backup piece /backup/FULL_RU22DB_20250924_0m44gqcs_22_1_1
channel ORA_DISK_1: piece handle=/backup/FULL_RU22DB_20250924_0m44gqcs_22_1_1 tag=TAG20250924T223300
channel ORA_DISK_1: restored backup piece 1
channel ORA_DISK_1: restore complete, elapsed time: 00:00:25
Finished restore at 24-SEP-25 ★リストア完了

Starting recover at 24-SEP-25 ★リカバリ開始
using channel ORA_DISK_1

starting media recovery
media recovery complete, elapsed time: 00:00:01

Finished recover at 24-SEP-25 ★リカバリ完了

RMAN> quit

最後にデータベースをOPEN状態にして、完全リカバリは完了です。

$ sqlplus / as sysdba
SQL> alter database open;

Database altered.

SQL> 

不完全リカバリの実行例

取得されているバックアップを利用してRMANコマンドで不完全リカバリを行います。
シンプルな不完全リカバリのコマンド例は以下です。
2025/9/26 00:00:00時点でのデータベースに復旧します。

alter session set NLS_DATE_FORMAT="YYYY-MM-DD HH24:MI:SS";
run {
    restore database;
    recover database until time "2025-09-26 00:00:00";
}

実行結果も載せておきます。

$ rman target / nocatalog

Recovery Manager: Release 19.0.0.0.0 - Production on Fri Sep 26 21:26:53 2025
Version 19.22.0.0.0

Copyright (c) 1982, 2019, Oracle and/or its affiliates.  All rights reserved.

connected to target database: RU22DB (DBID=683921111, not open)
using target database control file instead of recovery catalog

RMAN> alter session set NLS_DATE_FORMAT="YYYY-MM-DD HH24:MI:SS";

Statement processed

RMAN> run {
    restore database;
    recover database until time "2025-09-26 00:00:00";
}
2> 3> 4> 
Starting restore at 26-SEP-25 ★リストア開始
allocated channel: ORA_DISK_1
channel ORA_DISK_1: SID=262 device type=DISK

skipping datafile 2; already restored to file /u01/app/oracle/oradata/RU22DB/pdbseed/system01.dbf
skipping datafile 4; already restored to file /u01/app/oracle/oradata/RU22DB/pdbseed/sysaux01.dbf
skipping datafile 6; already restored to file /u01/app/oracle/oradata/RU22DB/pdbseed/undotbs01.dbf
channel ORA_DISK_1: starting datafile backup set restore
channel ORA_DISK_1: specifying datafile(s) to restore from backup set
channel ORA_DISK_1: restoring datafile 00001 to /u01/app/oracle/oradata/RU22DB/system01.dbf
channel ORA_DISK_1: restoring datafile 00003 to /u01/app/oracle/oradata/RU22DB/sysaux01.dbf
  :
Finished restore at 26-SEP-25 ★リストア完了

Starting recover at 26-SEP-25 ★リカバリ開始
using channel ORA_DISK_1

starting media recovery

archived log for thread 1 with sequence 38 is already on disk as file /u01/app/oracle/product/19.0.0.0/db_home2/dbs/arch/1_38_1162927447.dbf
archived log for thread 1 with sequence 39 is already on disk as file /u01/app/oracle/product/19.0.0.0/db_home2/dbs/arch/1_39_1162927447.dbf
archived log for thread 1 with sequence 40 is already on disk as file /u01/app/oracle/product/19.0.0.0/db_home2/dbs/arch/1_40_1162927447.dbf
archived log for thread 1 with sequence 41 is already on disk as file /u01/app/oracle/product/19.0.0.0/db_home2/dbs/arch/1_41_1162927447.dbf
archived log file name=/u01/app/oracle/product/19.0.0.0/db_home2/dbs/arch/1_38_1162927447.dbf thread=1 sequence=38
archived log file name=/u01/app/oracle/product/19.0.0.0/db_home2/dbs/arch/1_39_1162927447.dbf thread=1 sequence=39
media recovery complete, elapsed time: 00:00:03
Finished recover at 26-SEP-25 ★リカバリ完了

RMAN> 

最後にデータベースをOPEN状態しますが、不完全リカバリの場合はRESETLOGSを指定する必要があります。

SQL> alter database open resetlogs;

Database altered.

SQL> 

RESETLOGSは、データベースをオープンする際に REDOログファイルを初期化(リセット) する操作です。
不完全リカバリによってある時点まで戻した後、そこから先のREDOログを適用することができませんので、REDOログファイルをリセットする必要があります。

REDOログがリセットされますので、不完全リカバリ後は、再度フルバックアップを取得するようにしてください。

まとめ

本記事では、取得されているRMANバックアップから、データベースをリストア+リカバリする方法を解説しました。
過去の記事とあわせて確認してみてください。

いざという時のために実機で動かしてみることをおススメします。

コメント

タイトルとURLをコピーしました