お試し:RMANによるUNDO表領域の破壊からのリストア、リカバリ<!-- --> | <!-- -->塩焼き太郎のブログ♪
塩焼き太郎のブログ♪

お試し: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の便利な機能で復旧を試みる。
基本、以下の手順で復旧が可能である。

  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';

以上