お試し:RMANによるUNDO表領域の破壊からのリストア、リカバリ
Posted: August 2, 2017
今回は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の便利な機能で復旧を試みる。
基本、以下の手順で復旧が可能である。
- list failure
- advise failure
- 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を停止、マウントモードで起動する。
- shutdown abortで停止
- 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';
以上