2016年12月1日木曜日

リカバリをやり直す

このエントリは、JPOUG Advent Calendar 2016の1日目です。
https://jpoug.doorkeeper.jp/events/53797


データのリカバリをする機会はあまり無いかもしれませんが、いざというときに備えておきたいものです。
しかしながら、リカバリをしてみてデータを見てみたものの、別の時点にリカバリポイントを変更したいと思ったり、
単にリカバリポイントを間違えるといったことは発生するかもしれません。
そんなときに、もう一度リカバリをやり直すといった方法があります。 
今日はリカバリをやり直す手順を検証してみます。

はじめに、RMANバックアップは取っておきましょう。

[oracle@tama01 ~]$ rman
Recovery Manager: Release 11.2.0.1.0 - Production on Sun Nov 13 15:05:54 2016
Copyright (c) 1982, 2009, Oracle and/or its affiliates.  All rights reserved.
RMAN> connect target /
connected to target database: BALLOON (DBID=2896125069)
RMAN>
RMAN> backup as copy incremental level 0 database
format='/home/valtech/backup_lv0_%s_%t_%T'
tag='backup';
2> 3>
Starting backup at 13-NOV-16
using channel ORA_DISK_1
channel ORA_DISK_1: starting datafile copy
input datafile file number=00001 name=/u01/app/oracle/oradata/balloon/system01.dbf
output file name=/home/valtech/backup_lv0_35_927817918_20161113 tag=BACKUP RECID=30 STAMP=927818003
channel ORA_DISK_1: datafile copy complete, elapsed time: 00:01:36
channel ORA_DISK_1: starting datafile copy
input datafile file number=00002 name=/u01/app/oracle/oradata/balloon/sysaux01.dbf
output file name=/home/valtech/backup_lv0_36_927818016_20161113 tag=BACKUP RECID=31 STAMP=927818214
channel ORA_DISK_1: datafile copy complete, elapsed time: 00:03:27
channel ORA_DISK_1: starting datafile copy
input datafile file number=00003 name=/u01/app/oracle/oradata/balloon/undotbs01.dbf
output file name=/home/valtech/backup_lv0_37_927818224_20161113 tag=BACKUP RECID=32 STAMP=927818231
channel ORA_DISK_1: datafile copy complete, elapsed time: 00:00:08
channel ORA_DISK_1: starting datafile copy
input datafile file number=00005 name=/u01/app/oracle/oradata/balloon/rman01.dbf
output file name=/home/valtech/backup_lv0_38_927818232_20161113 tag=BACKUP RECID=33 STAMP=927818236
channel ORA_DISK_1: datafile copy complete, elapsed time: 00:00:07
channel ORA_DISK_1: starting datafile copy
copying current control file
output file name=/home/valtech/backup_lv0_39_927818239_20161113 tag=BACKUP RECID=34 STAMP=927818240
channel ORA_DISK_1: datafile copy complete, elapsed time: 00:00:01
channel ORA_DISK_1: starting datafile copy
input datafile file number=00004 name=/u01/app/oracle/oradata/balloon/users01.dbf
output file name=/home/valtech/backup_lv0_40_927818241_20161113 tag=BACKUP RECID=35 STAMP=927818242
channel ORA_DISK_1: datafile copy complete, elapsed time: 00:00:01
channel ORA_DISK_1: starting incremental level 0 datafile backup set
channel ORA_DISK_1: specifying datafile(s) in backup set
including current SPFILE in backup set
channel ORA_DISK_1: starting piece 1 at 13-NOV-16
channel ORA_DISK_1: finished piece 1 at 13-NOV-16
piece handle=/home/valtech/backup_lv0_41_927818243_20161113 tag=BACKUP comment=NONE
channel ORA_DISK_1: backup set complete, elapsed time: 00:00:01
Finished backup at 13-NOV-16
RMAN>

ちゃんと取れてますね。
RMAN> list copy;
List of Datafile Copies
=======================
Key     File S Completion Time Ckp SCN    Ckp Time     
------- ---- - --------------- ---------- ---------------
30      1    A 13-NOV-16       1126694    13-NOV-16     
        Name: /home/valtech/backup_lv0_35_927817918_20161113
        Tag: BACKUP
31      2    A 13-NOV-16       1126740    13-NOV-16    
        Name: /home/valtech/backup_lv0_36_927818016_20161113
        Tag: BACKUP
32      3    A 13-NOV-16       1127123    13-NOV-16    
        Name: /home/valtech/backup_lv0_37_927818224_20161113
        Tag: BACKUP
35      4    A 13-NOV-16       1127135    13-NOV-16    
        Name: /home/valtech/backup_lv0_40_927818241_20161113
        Tag: BACKUP
33      5    A 13-NOV-16       1127128    13-NOV-16    
        Name: /home/valtech/backup_lv0_38_927818232_20161113

        Tag: BACKUP
さて、リカバリを試す前にテーブルに変更をしてみます。

[oracle@tama01 ~]$ sqlplus /nolog
SQL*Plus: Release 11.2.0.1.0 Production on Sun Nov 13 15:19:41 2016
Copyright (c) 1982, 2009, Oracle.  All rights reserved.
SQL> conn     / as sysdba
Connected.
SQL> select * from qb.keiyaku;
NAME       KEIYAKUBI>
-------------------- ---------

madoka       03-OCT-10
homura       01-AUG-09
mami       01-AUG-10
sayaka       15-OCT-10
kyoko       01-MAY-10
契約テーブルには5人分のレコードが含まれています。
このなかで、mamiのレコードを削除します。
SQL> delete from qb.keiyaku where name='mami';

1 row deleted.

mamiのレコードが削除されてしまいました。
SQL> select * from qb.keiyaku;
NAME       KEIYAKUBI
-------------------- ---------
madoka       03-OCT-10
homura       01-AUG-09
sayaka       15-OCT-10
kyoko       01-MAY-10
SQL> exit
さて、この状態から、mamiがまだ契約テーブルに残っている時間まで戻すためにリカバリを実施しましょう。
[oracle@tama01 ~]$ sqlplus /nolog
SQL*Plus: Release 11.2.0.1.0 Production on Sun Nov 13 15:33:17 2016
Copyright (c) 1982, 2009, Oracle.  All rights reserved.
SQL> conn / as sysdba
Connected.
SQL> shutdown immediate;
Database closed.
Database dismounted.
ORACLE instance shut down.
SQL> startup mount;
ORACLE instance started.
Total System Global Area  422670336 bytes
Fixed Size      1336960 bytes
Variable Size    301992320 bytes
Database Buffers   113246208 bytes
Redo Buffers      6094848 bytes
Database mounted.
SQL> exit
Disconnected from Oracle Database 11g Enterprise Edition Release 11.2.0.1.0 - Production
With the Partitioning, OLAP and Real Application Testing options

[oracle@tama01 ~]$ rman
Recovery Manager: Release 11.2.0.1.0 - Production on Sun Nov 13 15:34:15 2016
Copyright (c) 1982, 2009, Oracle and/or its affiliates.  All rights reserved.
RMAN> connect target /
connected to target database: BALLOON (DBID=2896125069, not open)
RMAN> run{

2> set until time "to_date('2016-11-13 15:30:00','YYYY-MM-DD HH24:MI:SS')";
3> restore database;
4> recover database;
5> }
executing command: SET until clause
Starting restore at 13-NOV-16
using target database control file instead of recovery catalog
allocated channel: ORA_DISK_1
channel ORA_DISK_1: SID=18 device type=DISK
channel ORA_DISK_1: restoring datafile 00001
input datafile copy RECID=30 STAMP=927818003 file name=/home/valtech/backup_lv0_35_927817918_20161113
destination for restore of datafile 00001: /u01/app/oracle/oradata/balloon/system01.dbf
channel ORA_DISK_1: copied datafile copy of datafile 00001
output file name=/u01/app/oracle/oradata/balloon/system01.dbf RECID=0 STAMP=0
channel ORA_DISK_1: restoring datafile 00002
input datafile copy RECID=31 STAMP=927818214 file name=/home/valtech/backup_lv0_36_927818016_20161113
destination for restore of datafile 00002: /u01/app/oracle/oradata/balloon/sysaux01.dbf
channel ORA_DISK_1: copied datafile copy of datafile 00002
output file name=/u01/app/oracle/oradata/balloon/sysaux01.dbf RECID=0 STAMP=0
channel ORA_DISK_1: restoring datafile 00003
input datafile copy RECID=32 STAMP=927818231 file name=/home/valtech/backup_lv0_37_927818224_20161113
destination for restore of datafile 00003: /u01/app/oracle/oradata/balloon/undotbs01.dbf
channel ORA_DISK_1: copied datafile copy of datafile 00003
output file name=/u01/app/oracle/oradata/balloon/undotbs01.dbf RECID=0 STAMP=0
channel ORA_DISK_1: restoring datafile 00004
input datafile copy RECID=35 STAMP=927818242 file name=/home/valtech/backup_lv0_40_927818241_20161113
destination for restore of datafile 00004: /u01/app/oracle/oradata/balloon/users01.dbf
channel ORA_DISK_1: copied datafile copy of datafile 00004
output file name=/u01/app/oracle/oradata/balloon/users01.dbf RECID=0 STAMP=0
channel ORA_DISK_1: restoring datafile 00005
input datafile copy RECID=33 STAMP=927818236 file name=/home/valtech/backup_lv0_38_927818232_20161113
destination for restore of datafile 00005: /u01/app/oracle/oradata/balloon/rman01.dbf
channel ORA_DISK_1: copied datafile copy of datafile 00005
output file name=/u01/app/oracle/oradata/balloon/rman01.dbf RECID=0 STAMP=0
Finished restore at 13-NOV-16

Starting recover at 13-NOV-16
using channel ORA_DISK_1

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

Finished recover at 13-NOV-16

RMAN> exit



[oracle@tama01 ~]$ sqlplus /nolog
SQL*Plus: Release 11.2.0.1.0 Production on Sun Nov 13 15:38:08 2016
Copyright (c) 1982, 2009, Oracle.  All rights reserved.
SQL> conn / as sysdba
Connected.
SQL> alter database open resetlogs;
Database altered.
さて、リカバリが完了しました。
さっそくmamiのレコードが契約テーブルに残っているか確認しましょう。
SQL> select * from qb.keiyaku;
NAME       KEIYAKUBI
-------------------- ---------
madoka       03-OCT-10
homura       01-AUG-09
sayaka       15-OCT-10
kyoko       01-MAY-10

なんと、mamiのレコードがありません。リカバリポイントを誤ってしまいました。
再度リカバリを試みます。
[oracle@tama01 ~]$ sqlplus /nolog
SQL*Plus: Release 11.2.0.1.0 Production on Sun Nov 13 15:46:56 2016
Copyright (c) 1982, 2009, Oracle.  All rights reserved.
SQL> conn / as sysdba
Connected.
SQL> shutdown immediate;
Database closed.
Database dismounted.
ORACLE instance shut down.
SQL> startup mount;
ORACLE instance started.
Total System Global Area  422670336 bytes
Fixed Size      1336960 bytes
Variable Size    301992320 bytes
Database Buffers   113246208 bytes
Redo Buffers      6094848 bytes
Database mounted.
SQL> exit
Disconnected from Oracle Database 11g Enterprise Edition Release 11.2.0.1.0 - Production
With the Partitioning, OLAP and Real Application Testing options
[oracle@tama01 ~]$ rman
Recovery Manager: Release 11.2.0.1.0 - Production on Sun Nov 13 15:48:03 2016
Copyright (c) 1982, 2009, Oracle and/or its affiliates.  All rights reserved.
RMAN> connect target /
connected to target database: BALLOON (DBID=2896125069, not open)
RMAN> run{
2> set until time "to_date('2016-11-13 15:20:00','YYYY-MM-DD HH24:MI:SS')";
3> restore database;
4> recover database;
5> }
executing command: SET until clause
Starting restore at 13-NOV-16
using target database control file instead of recovery catalog
RMAN-00571: ===========================================================
RMAN-00569: =============== ERROR MESSAGE STACK FOLLOWS ===============
RMAN-00571: ===========================================================
RMAN-03002: failure of restore command at 11/13/2016 15:49:44
RMAN-20207: UNTIL TIME or RECOVERY WINDOW is before RESETLOGS time

エラーが出てしまいました。
RESETLOGS以前のポイントにリカバリをしようとするとRMANエラーが出てしまうのです。

マニュアルを見ると、こうあります。
RMAN-20207: UNTIL TIMEまたはRECOVERY WINDOWがRESETLOGS時刻より前になっています
原因: UNTIL TIMEおよびRECOVERY WINDOWは、データベース作成時刻またはRESETLOGS時刻より後に設定する必要があります。
処置: UNTIL TIMEまたはRECOVERY WINDOWを確認してください。データベースを古いインカネーションにリストアする必要があれば、RESET DATABASE TO INCARNATIONコマンドを実行してください。

インカネーションとは、世代と言う意味のようです。
それでは、インカネーションの指定をしてみましょう。

RMAN> list incarnation;


List of Database Incarnations
DB Key  Inc Key DB Name  DB ID            STATUS  Reset SCN  Reset Time
------- ------- -------- ---------------- --- ---------- ----------
1       1       BALLOON  2896125069       PARENT  1          13-AUG-09
2       2       BALLOON  2896125069       PARENT  754488     29-JUL-15
3       3       BALLOON  2896125069       PARENT  837110     11-OCT-15
4       4       BALLOON  2896125069       CURRENT 1127568    13-NOV-16


RMAN> reset database to incarnation 3;
database reset to incarnation 3

リセットできたようです。
では、リカバリをしましょう。

RMAN> run{
2> set until time "to_date('2016-11-13 15:20:00','YYYY-MM-DD HH24:MI:SS')";
3> restore database;
4> recover database;
5> }

executing command: SET until clause

Starting restore at 13-NOV-16
using channel ORA_DISK_1
ORA-01013: user requested cancel of current operatio
channel ORA_DISK_1: restoring datafile 00001
input datafile copy RECID=30 STAMP=927818003 file name=/home/valtech/backup_lv0_35_927817918_20161113
destination for restore of datafile 00001: /u01/app/oracle/oradata/balloon/system01.dbf
RPC call appears to have failed to start on channel ORA_DISK_1
RPC call OK on channel ORA_DISK_1
channel ORA_DISK_1: copied datafile copy of datafile 00001
output file name=/u01/app/oracle/oradata/balloon/system01.dbf RECID=0 STAMP=0
channel ORA_DISK_1: restoring datafile 00002
input datafile copy RECID=31 STAMP=927818214 file name=/home/valtech/backup_lv0_36_927818016_20161113
destination for restore of datafile 00002: /u01/app/oracle/oradata/balloon/sysaux01.dbf
RPC call appears to have failed to start on channel ORA_DISK_1
RPC call OK on channel ORA_DISK_1
channel ORA_DISK_1: copied datafile copy of datafile 00002
output file name=/u01/app/oracle/oradata/balloon/sysaux01.dbf RECID=0 STAMP=0
channel ORA_DISK_1: restoring datafile 00003
input datafile copy RECID=32 STAMP=927818231 file name=/home/valtech/backup_lv0_37_927818224_20161113
destination for restore of datafile 00003: /u01/app/oracle/oradata/balloon/undotbs01.dbf
RPC call appears to have failed to start on channel ORA_DISK_1
RPC call OK on channel ORA_DISK_1
channel ORA_DISK_1: copied datafile copy of datafile 00003
output file name=/u01/app/oracle/oradata/balloon/undotbs01.dbf RECID=0 STAMP=0
channel ORA_DISK_1: restoring datafile 00004
input datafile copy RECID=35 STAMP=927818242 file name=/home/valtech/backup_lv0_40_927818241_20161113
destination for restore of datafile 00004: /u01/app/oracle/oradata/balloon/users01.dbf
RPC call appears to have failed to start on channel ORA_DISK_1
RPC call OK on channel ORA_DISK_1
channel ORA_DISK_1: copied datafile copy of datafile 00004
output file name=/u01/app/oracle/oradata/balloon/users01.dbf RECID=0 STAMP=0
channel ORA_DISK_1: restoring datafile 00005
input datafile copy RECID=33 STAMP=927818236 file name=/home/valtech/backup_lv0_38_927818232_20161113
destination for restore of datafile 00005: /u01/app/oracle/oradata/balloon/rman01.dbf
RPC call appears to have failed to start on channel ORA_DISK_1
RPC call OK on channel ORA_DISK_1
channel ORA_DISK_1: copied datafile copy of datafile 00005
output file name=/u01/app/oracle/oradata/balloon/rman01.dbf RECID=0 STAMP=0
Finished restore at 13-NOV-16

Starting recover at 13-NOV-16
using channel ORA_DISK_1

starting media recovery

archived log for thread 1 with sequence 15 is already on disk as file /home/valtech/arch/1_15_892824634.dbf
archived log file name=/home/valtech/arch/1_15_892824634.dbf thread=1 sequence=15
media recovery complete, elapsed time: 00:00:03
Finished recover at 13-NOV-16

RMAN> exit

[oracle@tama01 ~]$ sqlplus /nolog

SQL*Plus: Release 11.2.0.1.0 Production on Sun Nov 13 16:02:02 2016

Copyright (c) 1982, 2009, Oracle.  All rights reserved.

SQL> conn / as sysdba
Connected.
SQL> alter database open resetlogs;
Database altered.

リカバリが無事完了しました。
それでは、契約テーブルを確認しましょう。

SQL> select * from qb.keiyaku;
NAME       KEIYAKUBI
-------------------- ---------
madoka       03-OCT-10
homura       01-AUG-09
mami       01-AUG-10
sayaka       15-OCT-10
kyoko       01-MAY-10


mamiさんが復活しています!!

[結論]
リカバリしてresetlogsでオープンしたデータベースに対し、resetlogs以前のポイントにリカバリをし直したい場合は、
reset incarnationで世代を指定することで可能となります。

[注意点]
自動ストレージ管理(ASM)ディスク・グループが使用されている場合、
インカーネーションを含むデータ・ファイルの完全名が既存のデータ・ファイル名と一致しない場合のみ、RMANリストア操作によってデータ・ファイルの新規コピーが作成されます。
ASMの場合ファイルがOMF(Oracle Managed Files)の機能で、指定の場所にファイルが自動的に作成されます。

以前、この事象に遭遇したことがあり、新しいファイルを作るスペースがDiskGroupに無くなってしまい、処理が止まってしまうというトラブルに遭ったことがあります。
回避策として、制御ファイルに各データ・ファイルに別名を使用する方法で回避できます。

0 件のコメント:

コメントを投稿