在ORACLE 11GR2 的DG环境中,我们可以把备库启动到READ ONLY状态,来实现读的功能,但是在此状态不可以写,不能用于一些测试工作,比如测试PL/SQL等。
    ORACLE提供了SNAPSHOT STANDBY的功能,允许把STANDBY数据库启动到SHAPSHOT状态,进行一些测试,测试完成后可以转换到原来的PHYSICAL STANDBY的状态。在SNAPSHOT STANDBY过程中,STANDBY仍然接收日志,但是不运用,当转换成PHYSICAL STANDBY状态时会自己运用以前生成的日志。
    下面是关于snapshot的一些特征
 1.SNAPSHOT STANDBY DATABASE接收与归档日志,但是不运用日志。
 2.转换到PHYSICAL STANDBY DATABASE后会自己的运行以前生成的日志
 3.转换到PHYSICAL STANDBY DATABASE后在SNAPHOST STANDBY时更新的所有的数据都将会丢失。
 4.SNAPSHOT STANDBY DATABASE不用运行在Maximum Protection mode
 
  在配置snapshot时也有一些前提条件:
 1.数据库要在archivelog模式。
 2.要配置FRA
 
    下面开始测试:
    测试环境会:OS:RHEL 5.6 X86_86  DB:ORACLE 11.2.0.2
    DG环境的搭建见:
    11GR2 搭建活动的物理DG/DATAGRUAD (READ ONLY模式) http://luoping.blog.51cto.com/534596/983952
    BROKER的搭建见:
11GR2 datagruad 环境搭建BORKER
  
  1.查看数据库运行模式
  1. SQL> select open_mode,log_mode,flashback_on,database_role from v$database
  2.  
  3. OPEN_MODE            LOG_MODE     FLASHBACK_ON       DATABASE_ROLE 
  4. -------------------- ------------ ------------------ ---------------- 
  5. READ ONLY WITH APPLY ARCHIVELOG   YES                PHYSICAL STANDBY 
  2.查看FRA
  1. SQL> show parameter db_recovery_file_dest 
  2.  
  3. NAME                                 TYPE        VALUE 
  4. ------------------------------------ ----------- ------------------------------ 
  5. db_recovery_file_dest                string      /u01/app/oracle/fast_recovery_ 
  6.                                                  area 
  7. db_recovery_file_dest_size           big integer 4032M 

 3.开始切换

  1. #这里查看一下restore_point里面是否有记录 
  2. SQL> select scn,name from v$restore_point; 
  3.  
  4. no rows selected 
  5.  
  6. SQL> recover managed standby database cancel; 
  7. Media recovery complete. 
  8. SQL> ALTER DATABASE CONVERT TO SNAPSHOT STANDBY;   
  9.  
  10. Database altered. 
  11.  
  12. SQL> select open_mode,log_mode,flashback_on,database_role from v$database
  13.  
  14. OPEN_MODE            LOG_MODE     FLASHBACK_ON       DATABASE_ROLE 
  15. -------------------- ------------ ------------------ ---------------- 
  16. MOUNTED              ARCHIVELOG   YES                SNAPSHOT STANDBY 
  17. #这里使用convert to snapshot standby后,查询v$restore_point多了一条记录。 
  18. #其实convert to snapshot standby就是利用的restore point这个功能。 
  19. 所以在前面我们提到要配置FRA 
  20. SQL> col name for a30 
  21. SQL> set lines 100 
  22. SQL> select scn,name, GUARANTEE_FLASHBACK_DATABASE  from v$restore_point; 
  23.  
  24.        SCN NAME                           GUA 
  25. ---------- ------------------------------ --- 
  26.    1122733 SNAPSHOT_STANDBY_REQUIRED_09/1 YES 
  27.            0/2012 21:25:15 

 4.创建表测试

  1. SQL> shutdown immediate; 
  2. ORA-01109: database not open 
  3.  
  4.  
  5. Database dismounted. 
  6. ORACLE instance shut down. 
  7. SQL> startup 
  8. ORACLE instance started. 
  9.  
  10. Total System Global Area  313159680 bytes 
  11. Fixed Size                  2226072 bytes 
  12. Variable Size             255854696 bytes 
  13. Database Buffers           50331648 bytes 
  14. Redo Buffers                4747264 bytes 
  15. Database mounted. 
  16. Database opened. 
  17. #查看database role是否是SNAPSHOT STANDBY 
  18. SQL> select open_mode,log_mode,flashback_on,database_role from v$database
  19.  
  20. OPEN_MODE            LOG_MODE     FLASHBACK_ON       DATABASE_ROLE 
  21. -------------------- ------------ ------------------ ---------------- 
  22. READ WRITE           ARCHIVELOG   YES                SNAPSHOT STANDBY 
  23.  
  24. SQL> show user
  25. USER is "SYS" 
  26. SQL> connect scott/oracle 
  27. Connected. 
  28. SQL> show user
  29. USER is "SCOTT" 
  30. SQL> select *  from tab; 
  31.  
  32. TNAME                          TABTYPE  CLUSTERID 
  33. ------------------------------ ------- ---------- 
  34. BONUS                          TABLE 
  35. DEPT                           TABLE 
  36. EMP                            TABLE 
  37. SALGRADE                       TABLE 
  38. TEST1                          TABLE 
  39. #在scott用户下面创建一张test2表 
  40. SQL> create table test2 as select * from emp; 
  41.  
  42. Table created. 
  43.  
  44. SQL> select count(*) from test2; 
  45.  
  46.   COUNT(*) 
  47. ---------- 
  48.         14 

 5.转换成physical standby并查看表是否存在

  1. SQL> conn / as sysdba 
  2. Connected. 
  3. SQL> shutdown abort; 
  4. ORACLE instance shut down. 
  5. SQL> startup mount; 
  6. ORACLE instance started. 
  7.  
  8. Total System Global Area  313159680 bytes 
  9. Fixed Size                  2226072 bytes 
  10. Variable Size             255854696 bytes 
  11. Database Buffers           50331648 bytes 
  12. Redo Buffers                4747264 bytes 
  13. Database mounted. 
  14. #这里切换成physical standby
  15. SQL> alter database convert to physical standby; 
  16.  
  17. Database altered. 
  18. SQL> shutdown abort; 
  19. ORACLE instance shut down. 
  20. SQL> startup    
  21. ORACLE instance started. 
  22.  
  23. Total System Global Area  313159680 bytes 
  24. Fixed Size                  2226072 bytes 
  25. Variable Size             255854696 bytes 
  26. Database Buffers           50331648 bytes 
  27. Redo Buffers                4747264 bytes 
  28. Database mounted. 
  29. Database opened. 
  30. SQL>  select open_mode,log_mode,flashback_on,database_role from v$database
  31.  
  32. OPEN_MODE            LOG_MODE     FLASHBACK_ON       DATABASE_ROLE 
  33. -------------------- ------------ ------------------ ---------------- 
  34. READ ONLY            ARCHIVELOG   YES                PHYSICAL STANDBY 
  35.  
  36.  #这里提示表已经不存在了。说明已经成功。
  37. SQL> select count(*) from scott.test2; 
  38. select count(*) from scott.test2 
  39.                            * 
  40. ERROR at line 1: 
  41. ORA-00942: table or view does not exist 

 6.查询restore point是否还存在

  1. SQL> select scn,name from v$restore_point; 
  2.  
  3. no rows selected 

这里restore point已经自动删除了。