お試し:RMANによるUNDO表領域の破壊からのリストア、リカバリ

今回はUNDO表領域のについて。
UNDO表領域はテーブルのレコードが更新される際に、更新前のレコードを保持する表領域である。
これは読み取り一貫性を保証するために存在する。

お試す際の情報は以下の通り。

環境:Oracle Database Multitenant Architecture
状態:OPEN
UNDO表領域のデータファイルの場所:/home/oracle/db/oracle/testdb/data/undotbs01.dbf

では順次実施していく。

0. 下準備

0.1. テーブルの作成
面倒なのでルートコンテナにてSYSTEMユーザーのテーブルを作成する。

SQL> create table system.test1 ( col number );

Table created.

0.2. UNDO表領域のバックアップ

まずはUNDO表領域のデータファイルの番号とファイルの場所を確認。

SQL> select file#, name from v$datafile
  2  where name like '%undotbs01.dbf';

     FILE#
----------
NAME
--------------------------------------------------------------------------------
	 4
/home/oracle/db/oracle/testdb/data/undotbs01.dbf

0.3. backupの取得

oracle$ rman target /
RMAN> backup as copy datafile 4;

Starting backup at 20170801_18:50:05
allocated channel: ORA_DISK_1
channel ORA_DISK_1: SID=63 device type=DISK
channel ORA_DISK_1: starting datafile copy
input datafile file number=00004 name=/home/oracle/db/oracle/testdb/data/undotbs01.dbf
output file name=/home/oracle/flash/TESTDB/datafile/o1_mf_undotbs1_dr0mpgh2_.dbf tag=TAG20170801T185006 RECID=28 STAMP=950899835
channel ORA_DISK_1: datafile copy complete, elapsed time: 00:00:35
Finished backup at 20170801_18:50:41

Starting Control File and SPFILE Autobackup at 20170801_18:50:41
piece handle=/home/oracle/flash/TESTDB/autobackup/2017_08_01/o1_mf_s_950899841_dr0mqldz_.bkp comment=NONE
Finished Control File and SPFILE Autobackup at 20170801_18:50:44

今回はイメージコピーとしてバックアップを取得した。
メッセージから以下の場所に取得されていることがわかる。

/home/oracle/flash/TESTDB/datafile/o1_mf_undotbs1_dr0mpgh2_.dbf

なお、制御ファイルの自動バックアップをONにしているので制御ファイル、SPFILEも取得されていることがわかる。

RMAN> list backkup;
・・・
BS Key  Type LV Size       Device Type Elapsed Time Completion Time
------- ---- -- ---------- ----------- ------------ -----------------
31      Full    17.23M     DISK        00:00:01     20170801_18:50:42
        BP Key: 31   Status: AVAILABLE  Compressed: NO  Tag: TAG20170801T185041
        Piece Name: /home/oracle/flash/TESTDB/autobackup/2017_08_01/o1_mf_s_950899841_dr0mqldz_.bkp
  SPFILE Included: Modification time: 20170801_18:43:49
  SPFILE db_unique_name: TESTDB
  Control File Included: Ckp SCN: 6284037315   Ckp time: 20170801_18:50:41


1. UNDOの削除

下記、OSコマンドにて削除する。

oracle$ rm /home/oracle/db/oracle/testdb/data/undotbs01.dbf


アラートログに以下のメッセージが出力された。

Tue Aug 01 18:53:42 2017
Checker run found 1 new persistent data failures

# ORAエラーも発生

Tue Aug 01 18:54:42 2017
Errors in file /home/oracle/db/u01/oracle/diag/rdbms/testdb/testdb/trace/testdb_j000_3943.trc:
ORA-12012: error on auto execute of job "SYS"."CLEANUP_ONLINE_PMO"
ORA-01116: error in opening database file
ORA-01116: error in opening database file 4
ORA-01110: data file 4: '/home/oracle/db/oracle/testdb/data/undotbs01.dbf'
ORA-27041: unable to open file
Linux-x86_64 Error: 2: No such file or directory
Additional information: 3

RMANでも検知された。

RMAN> list failure all;

Database Role: PRIMARY

List of Database Failures
=========================

Failure ID Priority Status    Time Detected     Summary
---------- -------- --------- ----------------- -------
1062       HIGH     OPEN      20170801_18:53:42 One or more non-system datafiles are missing

DB自体は使えるようなのでどこまでいけるか試してみる。

2. レコード操作

2.1. レコードの挿入

SQL> insert into system.test1 values ( 1 );

1 row created.

SQL> commit;

Commit complete.

insert完了。INSERT作業ではUNDOが利用されないことが分かる。

2.2. レコードの更新

更新しようとすると下記のエラーが発生。
UNDO表領域のデータファイルがないので当然の結果。

18:57:11 SQL> update system.test1 set col=2;
update system.test1 set col=2
              *
ERROR at line 1:
ORA-01116: error in opening database file 4
ORA-01110: data file 4: '/home/oracle/db/oracle/testdb/data/undotbs01.dbf'
ORA-27041: unable to open file
Linux-x86_64 Error: 2: No such file or directory
Additional information: 3


3. 復旧作業

今回はRMANの便利な機能で復旧を試みる。
基本、以下の手順で復旧が可能である。

  1. list failure
  2. advise failure
  3. repair failure

2のadvise failureをすると復旧に必要なコマンドをまとめたファイルをRMANが作成してくれる。
それをrepair failureで実施すれば復旧が完了というもの。


では順次実施していく。

3.1. 障害内容を確認

RMAN> list failure;

Database Role: PRIMARY

List of Database Failures
=========================

Failure ID Priority Status    Time Detected     Summary
---------- -------- --------- ----------------- -------
1062       HIGH     OPEN      20170801_18:53:42 One or more non-system datafiles are missing

3.2. アドバイスを確認

RMAN> advise failure;

Database Role: PRIMARY

List of Database Failures
=========================

Failure ID Priority Status    Time Detected     Summary
---------- -------- --------- ----------------- -------
1062       HIGH     OPEN      20170801_18:53:42 One or more non-system datafiles are missing

analyzing automatic repair options; this may take some time
using channel ORA_DISK_1
analyzing automatic repair options complete

Mandatory Manual Actions
========================
1. If file /home/oracle/db/oracle/testdb/data/undotbs01.dbf was unintentionally renamed or moved, restore it
2. Automatic repairs may be available if you shutdown the database and restart it in mount mode
3. Contact Oracle Support Services if the preceding recommendations cannot be used, or if they do not fix the failures selected for repair

Optional Manual Actions
=======================
no manual actions available

Automated Repair Options
========================
no automatic repair options available

あれ、なんかマニュアルアクションが必要みたい。
アドバイスに沿って実施する。

3.3. バックアップからファイルをコピー

oracle$ cp flash/TESTDB/datafile/o1_mf_undotbs1_dr0nx67b_.dbf db/oracle/testdb/data/undotbs01.dbf


再度確認する。

RMAN> list failure;

Database Role: PRIMARY

no failures found that match specification

復旧した模様。アラートログからORAエラーも出なくなった。
実際に運用していると可能であればDBを停止したくないと思うので上記のように復旧する。

3.3. DBを停止しての復旧
停止しても問題ない場合は当初の予定通り、以下の手順でUNDO表領域のリカバリを実施する。


DBを停止、マウントモードで起動する。

  1. shutdown abortで停止
  2. startup mount;


RMANで3.の冒頭で述べた手順を実施する。

RMAN> list failure;

Database Role: PRIMARY

List of Database Failures
=========================

Failure ID Priority Status    Time Detected     Summary
---------- -------- --------- ----------------- -------
1062       HIGH     OPEN      20170801_18:53:42 One or more non-system datafiles are missing

RMAN> advise failure;

Database Role: PRIMARY

List of Database Failures
=========================

Failure ID Priority Status    Time Detected     Summary
---------- -------- --------- ----------------- -------
1062       HIGH     OPEN      20170801_18:53:42 One or more non-system datafiles are missing

analyzing automatic repair options; this may take some time
allocated channel: ORA_DISK_1
channel ORA_DISK_1: SID=21 device type=DISK
analyzing automatic repair options complete

Mandatory Manual Actions
========================
no manual actions available

Optional Manual Actions
=======================
1. If file /home/oracle/db/oracle/testdb/data/undotbs01.dbf was unintentionally renamed or moved, restore it

Automated Repair Options
========================
Option Repair Description
------ ------------------
1      Restore and recover datafile 4
  Strategy: The repair includes complete media recovery with no data loss
  Repair script: /home/oracle/db/u01/oracle/diag/rdbms/testdb/testdb/hm/reco_249714199.hm


RMAN> repair failure;

Strategy: The repair includes complete media recovery with no data loss
Repair script: /home/oracle/db/u01/oracle/diag/rdbms/testdb/testdb/hm/reco_249714199.hm

contents of repair script:
   # restore and recover datafile
   restore ( datafile 4 );
   recover datafile 4;
   sql 'alter database datafile 4 online';

Do you really want to execute the above repair (enter YES or NO)? YES
executing repair script

Starting restore at 20170801_19:04:17
using channel ORA_DISK_1

channel ORA_DISK_1: restoring datafile 00004
input datafile copy RECID=28 STAMP=950899835 file name=/home/oracle/flash/TESTDB/datafile/o1_mf_undotbs1_dr0mpgh2_.dbf
destination for restore of datafile 00004: /home/oracle/db/oracle/testdb/data/undotbs01.dbf
channel ORA_DISK_1: copied datafile copy of datafile 00004
output file name=/home/oracle/db/oracle/testdb/data/undotbs01.dbf RECID=0 STAMP=0
Finished restore at 20170801_19:04:52

Starting recover at 20170801_19:04:52
using channel ORA_DISK_1

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

Finished recover at 20170801_19:04:53

sql statement: alter database datafile 4 online
repair failure complete

Do you want to open the database (enter YES or NO)? YES
database opened

なお、実行したファイルの中身はこれ

oracle$ cat /home/oracle/db/u01/oracle/diag/rdbms/testdb/testdb/hm/reco_249714199.hm
   # restore and recover datafile
   restore ( datafile 4 );
   recover datafile 4;
   sql 'alter database datafile 4 online';


以上