上面一篇简单的介绍了一下RMAN的BLOCKRECOVER的用法,这篇打算介绍一下缺失归档日志对BLOCKRECOVER的影响。
为了演示归档对BLOCKRECOVER的影响,先构造一个例子:
RMAN> backup tablespace tools;
启动 backup 于 16-6月 -07
使用通道 ORA_DISK_1
通道 ORA_DISK_1: 正在启动 full 数据文件备份集
通道 ORA_DISK_1: 正在指定备份集中的数据文件
输入数据文件 fno=00005 name=F:ORACLEORADATATEST1TOOLS01.DBF
通道 ORA_DISK_1: 正在启动段 1 于 16-6月 -07
通道 ORA_DISK_1: 已完成段 1 于 16-6月 -07
段 handle=F:ORACLEORACLE920DATABASEHIKFE30_1_1 comment=NONE
通道 ORA_DISK_1: 备份集已完成, 经过时间:00:00:03
完成 backup 于 16-6月 -07
首先备份一下表空间,这个表空间的备份用来作为BLOCKRECOVER的全备份基础。
SQL> CREATE TABLE TEST TABLESPACE TOOLS AS SELECT ROWNUM ID, A.* FROM DBA_OBJECTS A;
表已创建。
SQL> SELECT COUNT(*) FROM TEST;
COUNT(*)
----------
28036
SQL> SELECT ROWID FROM TEST WHERE ID = 1000;
ROWID
------------------
AAAHApAAFAAAAAbAA8
SQL> SELECT ID FROM TEST
2 WHERE ROWID >= 'AAAHApAAFAAAAAbAAA'
3 AND ROWID < 'AAAHApAAFAAAAAcAAA';
ID
----------
940
941
942
943
944
945
946
947
.
.
.
1004
1005
1006
已选择67行。
SQL> SELECT DISTINCT DBMS_ROWID.ROWID_RELATIVE_FNO(ROWID),
2 DBMS_ROWID.ROWID_BLOCK_NUMBER(ROWID)
3 FROM TEST
4 WHERE ID >= 940
5 AND ID <= 1006;
DBMS_ROWID.ROWID_RELATIVE_FNO(ROWID) DBMS_ROWID.ROWID_BLOCK_NUMBER(ROWID)
------------------------------------ ------------------------------------
5 27
SQL> ALTER SYSTEM SWITCH LOGFILE;
系统已更改。
SQL> SELECT MAX(SEQUENCE#) FROM V$ARCHIVED_LOG;
MAX(SEQUENCE#)
--------------
321
SQL> UPDATE TEST SET OBJECT_NAME = LOWER(OBJECT_NAME) WHERE ID = 1000;
IXDBA.NET社区论坛
已更新 1 行。
SQL> COMMIT;
提交完成。
SQL> ALTER SYSTEM SWITCH LOGFILE;
系统已更改。
SQL> DELETE TEST WHERE ID = 1;
已删除 1 行。
SQL> COMMIT;
提交完成。
SQL> ALTER SYSTEM SWITCH LOGFILE;
系统已更改。
SQL> UPDATE TEST SET OBJECT_TYPE = 'TEST' WHERE ID = 10000;
已更新 1 行。
SQL> COMMIT;
提交完成。
SQL> ALTER SYSTEM SWITCH LOGFILE;
系统已更改。
SQL> CREATE TABLE TEST2 (ID NUMBER);
表已创建。
SQL> INSERT INTO TEST2 VALUES (1);
已创建 1 行。
SQL> ALTER SYSTEM SWITCH LOGFILE;
系统已更改。
SQL> ALTER SYSTEM SWITCH LOGFILE;
系统已更改。
SQL> ALTER SYSTEM SWITCH LOGFILE;
系统已更改。
SQL> ALTER SYSTEM SWITCH LOGFILE;
系统已更改。
SQL> SELECT NAME FROM V$ARCHIVED_LOG WHERE SEQUENCE# > 321;
NAME
------------------------------------------------------------
F:ORACLEORADATATEST1ARCHIVELOGARC00322.001
F:ORACLEORADATATEST1ARCHIVELOGARC00323.001
F:ORACLEORADATATEST1ARCHIVELOGARC00324.001
F:ORACLEORADATATEST1ARCHIVELOGARC00325.001
F:ORACLEORADATATEST1ARCHIVELOGARC00326.001
F:ORACLEORADATATEST1ARCHIVELOGARC00327.001
F:ORACLEORADATATEST1ARCHIVELOGARC00328.001
已选择7行。
SQL> SELECT SEQUENCE# FROM V$LOG;
SEQUENCE#
----------
328
329
327
首先建立一张测试表,在这个表中,ID在940和1006之间的记录存储在DATAFILE 5 BLOCK 27中。在归档322中记录了TEST表的ID等于1000的记录的更新,这个更新发生在DATAFILE 5 BLOCK 27上。随后在归档323中,删除了ID等于1的记录,这条记录与BLOCK 27无关。在归档324中,更新了ID等于10000的记录,这个修改与BLOCK 27也无关。在归档325中,新建TEST2表,并插入数据。归档326就是一个空文件。