flashback restore point是否能还原坏块

简介:
    上周5的时候跟同事他们一起讨论DG环境的数据库的升级方式,原主库使用shutdown abort后,由broker自动切换备库,由备库变成主库,在做升级,升级前做一次restore point。随后就说到了,shutdown abort可能会导致出现一次坏块的情况(概率是很少),备库同时升级失败,导致shutdown abort的数据库不能通过flashback到restore point,但是这次出现了分歧。
 
    下次就是用bbed这个来模拟一下。测试环境是11gr2,在11gr2中安装bbed这个工具比10要复杂一些。安装步骤见:
ORACLE 编译/安装bbed工具  http://luoping.blog.51cto.com/534596/985911

    下面开始测试:

1.启动flashback

 
  1. SQL> select open_mode,log_mode,flashback_on from V$database
  2.  
  3. OPEN_MODE            LOG_MODE     FLASHBACK_ON 
  4. -------------------- ------------ ------------------ 
  5. READ WRITE           ARCHIVELOG   NO 
  6. #注意restore point可以不用开启flashback,也可以开启flashback .
  7. #normal restore point要开启flashback.
  8. #guaranteed restore point不用开启flashback
  9. SQL> alter database flashback on
  10.  
  11. Database altered. 
  12.  
  13. SQL>  select open_mode,log_mode,flashback_on from V$database
  14.  
  15. OPEN_MODE            LOG_MODE     FLASHBACK_ON 
  16. -------------------- ------------ ------------------ 
  17. READ WRITE           ARCHIVELOG   YES 

2,建测试数据表空间与数据

 
  1. SQL> create tablespace test datafile '/u01/app/oracle/oradata/luo/test.dbf' size 20M autoextend off
  2.  
  3. Tablespace created. 
  4.  
  5. SQL> alter user scott identified by oracle account unlock default tablespace test; 
  6.  
  7. User altered. 
  8.  
  9. SQL> create table scott.test as select * from dba_objects; 
  10.  
  11. Table created. 
  12.  
  13. SQL>  

3,创建restore point

 
  1. SQL> create restore point bbed_test guarantee flashback database; 
  2. Restore point created. 
  3. SQL> col name for a20 
  4. SQL> set lines 175 
  5. SQL>  select scn,to_char(time,'YYYY-MM-DD HH24:MI:SS') ctime,name from v$restore_point; 
  6.  
  7.        SCN CTIME               NAME 
  8. ---------- ------------------- -------------------- 
  9.    1037086 2012-09-08 04:46:39 BBED_TEST 

4,通过bbed工具损坏一个block。

5,查询内容报坏块错误。

 
  1. SQL> select owner,object_name from test where object_name='TEST'
  2. select owner,object_name from test where object_name='TEST' 
  3.                               * 
  4. ERROR at line 1: 
  5. ORA-01578: ORACLE data block corrupted (file # 5, block # 1183) 
  6. ORA-01110: data file 5: '/u01/app/oracle/oradata/luo/test.dbf' 

6,flashback数据库bbed_test

 
  1. SQL> shutdown abort; 
  2. ORACLE instance shut down. 
  3. SQL> startup mount; 
  4. ORACLE instance started. 
  5.  
  6. Total System Global Area  313159680 bytes 
  7. Fixed Size                  2226072 bytes 
  8. Variable Size             243271784 bytes 
  9. Database Buffers           62914560 bytes 
  10. Redo Buffers                4747264 bytes 
  11. Database mounted. 
  12. #这个显示了flashback成功 
  13. SQL> flashback database to restore point bbed_test; 
  14.  
  15. Flashback complete. 
  16.  
  17. SQL> alter database open
  18. alter database open 
  19. ERROR at line 1: 
  20. ORA-01589: must use RESETLOGS or NORESETLOGS option for database open 
  21.  
  22.  
  23. SQL> alter database open resetlogs; 
  24.  
  25. Database altered. 

7,查询指定数据。

 
  1. SQL> conn scott/oracle 
  2. Connected. 
  3. SQL> select owner,object_name from test where object_name='TEST'
  4. select owner,object_name from test where object_name='TEST' 
  5.                               * 
  6. ERROR at line 1: 
  7. ORA-01578: ORACLE data block corrupted (file # 5, block # 1183) 
  8. ORA-01110: data file 5: '/u01/app/oracle/oradata/luo/test.dbf' 

    这里还是报块的错误。

    想想为什么不能成功。因为数据库的restore point,只能flash数据库自己修改的块,而像shutdown abort这样强制关闭ORACLE时,并不会记录flash log日志的,所以就会出现上面的情况。但是如果坏的块出现在system表空间,那样恢复起来可能就会很惨了。




     本文转自7343696 51CTO博客,原文链接:http://blog.51cto.com/luoping/985975,如需转载请自行联系原作者




相关文章
|
Oracle 关系型数据库 数据库管理
|
Oracle 关系型数据库 数据库管理
|
SQL Oracle 关系型数据库
|
Oracle 关系型数据库 数据库