Oracle Study之案例--Oracle 11g  DataGuard Snapshot Standby

       Oracle 11g的Data Guard不仅仅带给我们的是Active Data Guard实时查询特性,同时还带来了另外一个新特性,这便是Snapshot Standby数据库功能,此项功能可将备库置身于“可读写状态”用于不方便在生产环境主库中测试的内容,比如模拟上线测试等任务。当备库读写状态下任务完成后,可以非常轻松的完成Snapshot Standby数据库角色切换回备库角色,恢复与主库数据同步。在Snapshot Standby数据库状态下,备库是可以接收主库传过来的日志,但是不能对日志进行应用。

案例分析:

1、查看数据库信息

Primay DB:

14:47:09 SYS@ prod >select name,database_role,protection_mode from v$database;
NAME      DATABASE_ROLE    PROTECTION_MODE
--------- ---------------- --------------------
PROD      PRIMARY          MAXIMUM PERFORMANCE

14:46:52 SYS@ prod >select max(sequence#) from v$archived_log;
MAX(SEQUENCE#)
--------------
           536
           
Standby DB:
14:47:04 SYS@ shdb >select name,database_role,protection_mode from v$database;
NAME      DATABASE_ROLE    PROTECTION_MODE
--------- ---------------- --------------------
PROD      PHYSICAL STANDBY MAXIMUM PERFORMANCE

14:46:09 SYS@ shdb >select max(sequence#) from v$archived_log;
MAX(SEQUENCE#)
--------------
           536

2、切换备库到Snapshot Standby

1)必须终止Media Recover Process

14:48:05 SYS@ shdb >alter database convert to snapshot standby;
alter database convert to snapshot standby
*
ERROR at line 1:
ORA-38784: Cannot create restore point 'SNAPSHOT_STANDBY_REQUIRED_11/27/2014 14:50:05'.
ORA-01153: an incompatible media recovery is active

14:50:05 SYS@ shdb >recover managed standby database cancel;
Media recovery complete.

2)必须建立Recover Area
   snapshot standby实际上是基于flashback database的运行机制,恢复到原先的standby状态
   
14:50:44 SYS@ shdb >alter database convert to snapshot standby;
alter database convert to snapshot standby
*
ERROR at line 1:
ORA-38784: Cannot create restore point 'SNAPSHOT_STANDBY_REQUIRED_11/27/2014 14:50:58'.
ORA-38786: Recovery area is not enabled.

3)启用recover area
14:50:58 SYS@ shdb >show parameter recover
NAME                                 TYPE                             VALUE
------------------------------------ -------------------------------- ------------------------------
db_recovery_file_dest                string
db_recovery_file_dest_size           big integer                      0
recovery_parallelism                 integer                          0

14:52:51 SYS@ shdb >alter system set db_recovery_file_dest_size=2g;
System altered.

14:53:12 SYS@ shdb >alter system set db_recovery_file_dest='/dsk4/backup';
System altered.

14:53:18 SYS@ shdb >show parameter recover
NAME                                 TYPE                             VALUE
------------------------------------ -------------------------------- ------------------------------
db_recovery_file_dest                string                           /dsk4/backup
db_recovery_file_dest_size           big integer                      2G
recovery_parallelism                 integer

3)转换成功
14:54:13 SYS@ shdb >alter database convert to  snapshot standby;
Database altered.
Elapsed: 00:00:03.10
14:54:41 SYS@ shdb >select status from v$instance;
STATUS
------------
MOUNTED

告警日志:
主库:
LNS: Attempting destination LOG_ARCHIVE_DEST_2 network reconnect (3135)
LNS: Destination LOG_ARCHIVE_DEST_2 network reconnect abandoned
Errors in file /u01/app/oracle/diag/rdbms/bjdb/prod/trace/prod_nsa2_2960.trc:
ORA-03135: connection lost contact
Error 3135 for archive log file 5 to 'shdb'
Errors in file /u01/app/oracle/diag/rdbms/bjdb/prod/trace/prod_nsa2_2960.trc:
ORA-03135: connection lost contact
LNS: Failed to archive log 5 thread 1 sequence 537 (3135)
Errors in file /u01/app/oracle/diag/rdbms/bjdb/prod/trace/prod_nsa2_2960.trc:
ORA-03135: connection lost contact

备库:
alter database convert to snapshot standby
ORA-38784 signalled during: alter database convert to snapshot standby...
Thu Nov 27 14:53:12 2014
ALTER SYSTEM SET db_recovery_file_dest_size='2G' SCOPE=MEMORY;
Using STANDBY_ARCHIVE_DEST parameter default value as USE_DB_RECOVERY_FILE_DEST
**********************************************************
WARNING: Files may exists in db_recovery_file_dest
that are not known to the database. Use the RMAN command
CATALOG RECOVERY AREA to re-catalog any such files.
If files cannot be cataloged, then manually delete them
using OS command.
One of the following events caused this:
1. A backup controlfile was restored.
2. A standby controlfile was restored.
3. The controlfile was re-created.
4. db_recovery_file_dest had previously been enabled and
   then disabled.
**********************************************************
ALTER SYSTEM SET db_recovery_file_dest='/dsk4/backup' SCOPE=MEMORY;
Thu Nov 27 14:53:18 2014
db_recovery_file_dest_size of 2048 MB is 0.00% used. This is a
user-specified limit on the amount of space that will be used by this
database for recovery-related files, and does not reflect the amount of
space available in the underlying filesystem or ASM diskgroup.
Thu Nov 27 14:54:38 2014
alter database convert to  snapshot standby
Starting background process RVWR
Thu Nov 27 14:54:38 2014
RVWR started with pid=21, OS id=2198
Allocated 3981204 bytes in shared pool for flashback generation buffer
Created guaranteed restore point SNAPSHOT_STANDBY_REQUIRED_11/27/2014 14:54:38
krsv_proc_kill: Killing 3 processes (all RFS)
CLOSE: killing server sessions.
CLOSE: all sessions shutdown successfully.
Thu Nov 27 14:54:41 2014
SMON: disabling cache recovery
Begin: Standby Redo Logfile archival
End: Standby Redo Logfile archival
RESETLOGS after incomplete recovery UNTIL CHANGE 8596005
Resetting resetlogs activation ID 219765236 (0xd1959f4)
Online log /dsk2/oradata/shdb/redo04b.log: Thread 1 Group 4 was previously cleared
Online log /dsk1/oradata/shdb/redo04a.log: Thread 1 Group 4 was previously cleared
Online log /dsk2/oradata/shdb/redo05b.log: Thread 1 Group 5 was previously cleared
Online log /dsk1/oradata/shdb/redo05a.log: Thread 1 Group 5 was previously cleared
Standby became primary SCN: 8596003
Thu Nov 27 14:54:41 2014
Setting recovery target incarnation to 3
CONVERT TO SNAPSHOT STANDBY: Complete - Database mounted as snapshot standby
Completed: alter database convert to  snapshot standby


14:54:55 SYS@ shdb >select database_role,open_mode from v$database;
DATABASE_ROLE    OPEN_MODE
---------------- --------------------
SNAPSHOT STANDBY MOUNTED

Created guaranteed restore point SNAPSHOT_STANDBY_REQUIRED_11/27/2014 14:54:38
在日志中可以看到,Database建立了restore point

3、Open Database验证

1)open database

14:57:02 SYS@ shdb >alter database open;
Database altered.

14:57:33 SYS@ shdb >select database_role,open_mode from v$database;
DATABASE_ROLE    OPEN_MODE
---------------- --------------------
SNAPSHOT STANDBY READ WRITE

2)日志切换:
主库:
14:47:31 SYS@ prod >alter system switch logfile;
System altered.

15:01:11 SYS@ prod >/
System altered.

15:01:23 SYS@ prod >select max(sequence#) from v$archived_log;
MAX(SEQUENCE#)
--------------
           539
           
告警日志:           
Thread 1 advanced to log sequence 538 (LGWR switch)
  Current log# 4 seq# 538 mem# 0: /dsk2/oradata/prod/redo04b.log
  Current log# 4 seq# 538 mem# 1: /dsk1/oradata/prod/redo04a.log
Thu Nov 27 14:59:46 2014
Archived Log entry 504 added for thread 1 sequence 537 ID 0xd1959f4 dest 1:
Thu Nov 27 15:00:53 2014
Thread 1 cannot allocate new log, sequence 539
Checkpoint not complete
  Current log# 4 seq# 538 mem# 0: /dsk2/oradata/prod/redo04b.log
  Current log# 4 seq# 538 mem# 1: /dsk1/oradata/prod/redo04a.log
Thu Nov 27 15:01:11 2014
Thread 1 advanced to log sequence 539 (LGWR switch)
  Current log# 5 seq# 539 mem# 0: /dsk2/oradata/prod/redo05b.log
  Current log# 5 seq# 539 mem# 1: /dsk1/oradata/prod/redo05a.log
Thu Nov 27 15:01:12 2014
Archived Log entry 507 added for thread 1 sequence 538 ID 0xd1959f4 dest 1:
Thread 1 cannot allocate new log, sequence 540
Checkpoint not complete
  Current log# 5 seq# 539 mem# 0: /dsk2/oradata/prod/redo05b.log
  Current log# 5 seq# 539 mem# 1: /dsk1/oradata/prod/redo05a.log
Thu Nov 27 15:01:23 2014
Thread 1 advanced to log sequence 540 (LGWR switch)
  Current log# 4 seq# 540 mem# 0: /dsk2/oradata/prod/redo04b.log
  Current log# 4 seq# 540 mem# 1: /dsk1/oradata/prod/redo04a.log
Thu Nov 27 15:01:25 2014
Archived Log entry 509 added for thread 1 sequence 539 ID 0xd1959f4 dest 1:
备库:
14:57:49 SYS@ shdb >select max(sequence#) from v$archived_log;
MAX(SEQUENCE#)
--------------
           539
告警日志:
RFS[6]: Assigned to RFS process 2254
RFS[6]: Identified database type as 'snapshot standby': Client is ARCH pid 2953
Thu Nov 27 14:59:45 2014
RFS[7]: Assigned to RFS process 2256
RFS[7]: Identified database type as 'snapshot standby': Client is LGWR ASYNC pid 2960
RFS[7]: Opened log for thread 1 sequence 537 dbid 219724276 branch 807885951
Archived Log entry 24 added for thread 1 sequence 537 rlc 807885951 ID 0xd1959f4 dest 2:
RFS[7]: Opened log for thread 1 sequence 538 dbid 219724276 branch 807885951
Thu Nov 27 15:01:12 2014
Archived Log entry 25 added for thread 1 sequence 538 rlc 807885951 ID 0xd1959f4 dest 2:
RFS[7]: Opened log for thread 1 sequence 539 dbid 219724276 branch 807885951
Thu Nov 27 15:01:23 2014
Archived Log entry 26 added for thread 1 sequence 539 rlc 807885951 ID 0xd1959f4 dest 2:
RFS[7]: Opened log for thread 1 sequence 540 dbid 219724276 branch 807885951
-----可以看到备库只是接收日志,并不对日志进行apply。

3)在备库做DML和压力测试:
15:03:52 SCOTT@ shdb >begin
15:03:59   2  for i in 1..10000 loop
15:04:06   3  insert into t2 values (i,i*10);
15:04:29   4  end loop;
15:04:34   5  commit;
15:04:35   6  end;
15:04:37   7  /
PL/SQL procedure successfully completed.
Elapsed: 00:00:04.43
15:04:42 SCOTT@ shdb >select count(*) from t2;
  COUNT(*)
----------
     10003

4、将数据库切回Physical Standby

1) 关闭数据库,启动到mount
15:06:10 SYS@ shdb >shutdown immediate;
Database closed.
Database dismounted.
ORACLE instance shut down.

15:06:25 SYS@ shdb >startup mount;
ORACLE instance started.
Total System Global Area  330600448 bytes
Fixed Size                  1336344 bytes
Variable Size             113249256 bytes
Database Buffers          209715200 bytes
Redo Buffers                6299648 bytes
Database mounted.

2)转换到Physical Standby
15:06:57 SYS@ shdb >alter database convert to physical standby;
Database altered.

备库告警日志:
Using STANDBY_ARCHIVE_DEST parameter default value as /dsk4/arch_shdb
RFS[1]: Assigned to RFS process 2423
RFS[1]: Identified database type as 'snapshot standby': Client is ARCH pid 2953
Thu Nov 27 15:06:44 2014
RFS[2]: Assigned to RFS process 2425
RFS[2]: Identified database type as 'snapshot standby': Client is LGWR ASYNC pid 2960
RFS[2]: Opened log for thread 1 sequence 540 dbid 219724276 branch 807885951
Archived Log entry 28 added for thread 1 sequence 540 rlc 807885951 ID 0xd1959f4 dest 2:
RFS[2]: Opened log for thread 1 sequence 541 dbid 219724276 branch 807885951
Thu Nov 27 15:06:53 2014
RFS[3]: Assigned to RFS process 2427
RFS[3]: Identified database type as 'snapshot standby': Client is ARCH pid 2953
Thu Nov 27 15:07:09 2014
alter database convert to physical standby
ALTER DATABASE CONVERT TO PHYSICAL STANDBY (shdb)
krsv_proc_kill: Killing 2 processes (all RFS)
Flashback Restore Start
Flashback Restore Complete
Stopping background process RVWR
Deleted Oracle managed file /dsk4/backup/SHDB/flashback/o1_mf_b7flogt9_.flb
Guaranteed restore point  dropped
Clearing standby activation ID 276569850 (0x107c1efa)
The primary database controlfile was created using the
'MAXLOGFILES 16' clause.
There is space for up to 14 standby redo logfiles
Use the following SQL commands on the standby database to create
standby redo logfiles that match the primary database:
ALTER DATABASE ADD STANDBY LOGFILE 'srl1.f' SIZE 4194304;
ALTER DATABASE ADD STANDBY LOGFILE 'srl2.f' SIZE 4194304;
ALTER DATABASE ADD STANDBY LOGFILE 'srl3.f' SIZE 4194304;
Completed: alter database convert to physical standby

3)转换后,数据库处于非mount状态
15:07:10 SYS@ shdb >select database_role,open_mode from v$database;
select database_role,open_mode from v$database
                                    *
ERROR at line 1:
ORA-01507: database not mounted

15:08:29 SYS@ shdb >alter database mount;
alter database mount
*
ERROR at line 1:
ORA-00750: database has been previously mounted and dismounted

15:08:39 SYS@ shdb >shutdown immediate;
ORA-01507: database not mounted
ORACLE instance shut down.

15:09:28 SYS@ shdb >startup
ORACLE instance started.
Total System Global Area  330600448 bytes
Fixed Size                  1336344 bytes
Variable Size             113249256 bytes
Database Buffers          209715200 bytes
Redo Buffers                6299648 bytes
Database mounted.
Database opened.

4)转换成Physical Standby
15:09:39 SYS@ shdb >select database_role,open_mode from v$database;
DATABASE_ROLE    OPEN_MODE
---------------- --------------------
PHYSICAL STANDBY READ ONLY

备库告警日志:
Physical standby database opened for read only access.
Completed: ALTER DATABASE OPEN
ARC2: Archival started
ARC0: STARTING ARCH PROCESSES COMPLETE
ARC0: Becoming the heartbeat ARCH
Thu Nov 27 15:09:40 2014
Using STANDBY_ARCHIVE_DEST parameter default value as /dsk4/arch_shdb
RFS[1]: Assigned to RFS process 2763
RFS[1]: Identified database type as 'physical standby': Client is ARCH pid 2953
Thu Nov 27 15:09:46 2014
RFS[2]: Assigned to RFS process 2765
RFS[2]: Identified database type as 'physical standby': Client is LGWR ASYNC pid 2960
Primary database is in MAXIMUM PERFORMANCE mode
RFS[2]: Opened log for thread 1 sequence 541 dbid 219724276 branch 807885951
Archived Log entry 29 added for thread 1 sequence 541 rlc 807885951 ID 0xd1959f4 dest 2:
RFS[2]: Opened log for thread 1 sequence 542 dbid 219724276 branch 807885951
Thu Nov 27 15:09:53 2014
RFS[3]: Assigned to RFS process 2768
RFS[3]: Identified database type as 'physical standby': Client is ARCH pid 2953

主库告警日志:
Using STANDBY_ARCHIVE_DEST parameter default value as /dsk4/arch_prod
ALTER SYSTEM SET log_archive_dest_state_2='ENABLE' SCOPE=MEMORY SID='*';
Thu Nov 27 15:09:42 2014
Thread 1 cannot allocate new log, sequence 542
Checkpoint not complete
  Current log# 5 seq# 541 mem# 0: /dsk2/oradata/prod/redo05b.log
  Current log# 5 seq# 541 mem# 1: /dsk1/oradata/prod/redo05a.log
Thu Nov 27 15:09:46 2014
******************************************************************
LGWR: Setting 'active' archival for destination LOG_ARCHIVE_DEST_2
******************************************************************
Thread 1 advanced to log sequence 542 (LGWR switch)
  Current log# 4 seq# 542 mem# 0: /dsk2/oradata/prod/redo04b.log
  Current log# 4 seq# 542 mem# 1: /dsk1/oradata/prod/redo04a.log
Thu Nov 27 15:09:48 2014
Archived Log entry 513 added for thread 1 sequence 541 ID 0xd1959f4 dest 1

5)查看Snapshot状态下创建的数据已经被还原
15:09:50 SYS@ shdb >conn scott/tiger
Connected.

15:12:49 SCOTT@ shdb >select count(*) from t2;
  COUNT(*)
----------
         3

小结

      Oracle 11g DataGuar增加的Snapshot Standby数据库”功能,备库可以临时成为一个可读写的独立数据库,这极大的扩展了备库的应用场合,我们可以使用备库的这一项特殊功能将那些在生产环境中“不敢”模拟和再现的问题在备库端进行测试,测试完毕后再恢复其物理备库的身份进行日志恢复,极大的方便我们在日常生产环境中对DG的应用。