Oracle DataGuard之---最大保护模式(Maximum Protection)

系统环境:

操作系统:RH EL55

Oracle 软件:Oracle 11gR2

一、DataGuard 工作原理

Data Gurad 通过冗余数据来提供数据保护,Data Gurad 通过日志同步机制保证冗余数据和主数之前的同步,这种同步可以是实时,延时,同步,异步多种形式。Data Gurad 常用于异地容灾和小企业的高可用性方案,虽然可以在Standby 机器上执行只读查询,从而分散Primary 数据库的性能压力,但是Data Gurad 决不是性能解决方案。

Stream 是以Oracle Advanced Queue为基础实现的数据同步,提供了多种级别的灵活配置,并且Oracle 提供了丰富的API等开发支持,Stream 更适用在应用层面的数据共享。

在Data Gurad 环境中,至少有两个数据库,一个处于Open 状态对外提供服务,这个数据库叫作Primary Database。第二个处于恢复状态,叫作Standby Database。运行时primary Database 对外提供服务,用户在Primary Database 上进行操作,操作被记录在联机日志和归档日志中,这些日志通过网络传递给Standby Database。这个日志会在Standby Database 上重演,从而实现Primary Database 和Standby Database 的数据同步。

Oracle Data Gurad 对这一过程进一步的优化设计,使得日志的传递,恢复工作更加自动化,智能化,并且提供一系列参数和命令简化了DBA工作。

如果是可预见因素需要关闭Primary Database,比如软硬件升级,可以把Standby Database 切换为Primary Database 继续对外服务,这样即减少了服务停止时间,并且数据不会丢失。如果异常原因导致Primary Database 不可用,也可以把Standby Database 强制切换为Primary Database继续对外服务,这时数据损失成都和配置的数据保护级别有关系。因此Primary 和Standby 只是一个角色概念,并不固定在某个数据库中。

二、DataGuard 组织架构

wKiom1Mv6s6C90DUAABegrh4Eac270.jpg

DG架构可以按照功能分成3个部分:

1) 日志发送(Redo Send)

2) 日志接收(Redo Receive)

3) 日志应用(Redo Apply)

三、DataGuard 数据保护模式

 Data Guard 允许定义3钟数据保护模式,分别是最大保护(Maximum Protection),最大可用(Maximum Availability)和最大性能(Maximum Performance)。

1. 最大保护(Maximum Protection)

      这种模式能够确保绝无数据丢失。要实现这一步当然是有代价的,它要求所有的事务在提交前其REDO不仅被写入到本地的Online Redologs,还要同时写入到Standby数据库的Standby Redologs,并确认REDO数据至少在一个Standby数据库中可用(如果有多个的话),然后才会在Primary数据库上提交。如果出现了什么故障导致Standby数据库不可用的话(比如网络中断),Primary数据库会被Shutdown,以防止数据丢失。

使用这种方式要求Standby Database 必须配置Standby Redo Log,而Primary Database必须使用LGWR,SYNC,AFFIRM 方式归档到Standby Database.

2. 最高可用性(Maximum availability)

      这种模式在不影响Primary数据库可用前提下,提供最高级别的数据保护策略。其实现方式与最大保护模式类似,也是要求本地事务在提交前必须至少写入一台Standby数据库的Standby Redologs中,不过与最大保护模式不同的是,如果出现故障导致Standby数据库无法访问,Primary数据库并不会被Shutdown,而是自动转为最高性能模式,等Standby数据库恢复正常之后,Primary数据库又会自动转换成最高可用性模式。

这种方式虽然会尽量避免数据丢失,但不能绝对保证数据完全一致。这种方式要求Standby Database 必须配置Standby Redo Log,而Primary Database必须使用LGWR,SYNC,AFFIRM 方式归档到Standby Database.

3. 最高性能(Maximum performance)

     缺省模式。这种模式在不影响Primary数据库性能前提下,提供最高级别的数据保护策略。事务可以随时提交,当前Primary数据库的REDO数据至少需要写入一个Standby数据库,不过这种写入可以是不同步的。如果网络条件理想的话,这种模式能够提供类似最高可用性的数据保护,而仅对Primary数据库的性能有轻微影响。这也是创建Standby数据库时,系统的默认保护模式。

            这种方式可以使用LGWR ASYNC 或者 ARCH 进程实现,Standby Database也不要求使用Standby Redo Log。

四、最大性能升级到最大保护

1、查看DG的数据保护模式

---主库

SYS@bj>

select name,PROTECTION_MODE,database_role,SWITCHOVER_STATUSfrom v$database;


NAME      PROTECTION_MODE      DATABASE_ROLE        SWITCHOVER_STATUS

--------- -------------------- ---------------- --------------------

PROD           MAXIMUM PERFORMANCE      PRIMARY          SESSIONS ACTIVE


Elapsed: 00:00:00.07


---备库

06:21:02 SYS@ sh >select name,PROTECTION_MODE ,database_role,SWITCHOVER_STATUSfrom v$database

06:25:002;


NAME      PROTECTION_MODE      DATABASE_ROLE      SWITCHOVER_STATUS

--------- -------------------- ---------------- --------------------

PROD      MAXIMUM PERFORMANCE     PHYSICAL STANDBY      SESSIONS ACTIVE



2、查看和配置 standby redo log


--- 主库

06:26:21 SYS@ bj>select GROUP#,THREAD# ,SEQUENCE# ,BYTES,STATUSfrom v$standby_log;


GROUP      #THREAD       #SEQUENCE   #BYTES STATUS

---------- ---------- ---------- ---------- ----------

4                         1                    0               52428800 UNASSIGNED

5                          1                  0                 52428800 UNASSIGNED

6                           0                 0                 52428800 UNASSIGNED

7                          0                   0                 52428800 UNASSIGNED


Elapsed: 00:00:00.01


---备库


06:25:02 SYS@ sh >select GROUP#,THREAD# ,SEQUENCE# ,BYTES,STATUSfrom v$standby_log;


no rows selected


Elapsed: 00:00:00.00

06:27:38 SYS@ sh >


----在备库上添加standby log

06:31:27 SYS@ sh >alter database add standby logfile group 4

06:32:492'/disk1/oradata/sh/std_redo04a.log' size 50m;


Database altered.


Elapsed: 00:00:00.25

06:33:17 SYS@ sh >alter database add standby logfile group 5

06:33:232'/disk1/oradata/sh/std_redo05a.log' size 50m;


Database altered.


Elapsed: 00:00:00.24

06:33:34 SYS@ sh >alter database add standby logfile group 6

06:33:402'/disk1/oradata/sh/std_redo06a.log' size 50m;


Database altered.


Elapsed: 00:00:00.33

06:33:51 SYS@ sh >alter database add standby logfile group 7

06:33:592'/disk1/oradata/sh/std_redo07a.log' size 50m;


Database altered.


Elapsed: 00:00:00.25

06:34:09 SYS@ sh >


06:34:09 SYS@ sh >select GROUP#,THREAD# ,SEQUENCE# ,BYTES,STATUSfrom v$standby_log;


GROUP     #THREAD       #SEQUENCE      #BYTES STATUS

---------- ---------- ---------- ---------- ----------

4                   0                         0                    52428800 UNASSIGNED

5                    0                          0                   52428800 UNASSIGNED

6                    0                         0                     52428800 UNASSIGNED

7                     0                       0                      52428800 UNASSIGNED


Elapsed: 00:00:00.00


3、修改主库和备库远程日志传送的模式

在最大保护模式下:lgwr 必须用sync 的方式传送redolog


---主库修改


06:43:22 SYS@ bj >alter system set log_archive_dest_2='service=sh lgwr sync affirm VALID_FOR=(all_LOGFILES,all_ROLES) DB_UNIQUE_NAME=sh' scope=spfile;


---备库修改


06:43:22 SYS@ sh >alter system set log_archive_dest_2='service=bj lgwr sync affirm VALID_FOR=(all_LOGFILES,all_ROLES) DB_UNIQUE_NAME=bj' scope=spfile;


4、关闭主库,启动到mount下修改保护模式:(在主库上修改保护模式)


SQL> startup mount;

ORACLE instance started.


Total System Global Area 134814580 bytes

Fixed Size 453492 bytes

Variable Size 109051904 bytes

Database Buffers 25165824 bytes

Redo Buffers 143360 bytes

Database mounted.

SQL> alter database set standby database to maximize protection;


Database altered.



------查看模式

08:17:36 SYS@ bj>select name,PROTECTION_MODE ,database_role,SWITCHOVER_STATUSfrom v$database;


NAME     PROTECTION_MODE       DATABASE_ROLE      SWITCHOVER_STATUS

--------- -------------------- ---------------- --------------------

PROD     MAXIMUM PROTECTION      PRIMARY              SESSIONS ACTIVE


Elapsed: 00:00:00.01


-----打开主库

07:14:38 SYS@ bj>alter database open;


----备库做recover

07:40:32 SYS@ sh >alter database recover managed standby database disconnect from session;


Database altered.


----查看备库模式


07:51:48 SYS@ sh >select name,PROTECTION_MODE ,database_role,SWITCHOVER_STATUSfrom v$database;


NAME    PROTECTION_MODE           DATABASE_ROLE        SWITCHOVER_STATUS

--------- -------------------- ---------------- --------------------

PROD          MAXIMUM PROTECTION          PHYSICAL  STANDBY          TO PRIMARY


Elapsed: 00:00:00.02

五、故障分析

------如果主库open时遇到以下错误:


注:

在10gR2的data guard中,按照上述步骤切换保护模式的时候却不成功。主库完成切换语句后再open就报错:ORA-03113: end-of-file on communication channel。看alert文件,报错ORA-16072: a minimum of one standby database destination is required。但实际上备库的standby logfile都已经建好了,解决方法如下:

解决方法:


将主备库的flashback打开:

启动到mount

SQL> select FLASHBACK_ON from v$database;

FLASHBACK_ON

------------------------------------

NO

SQL> alter database flashback on;

数据库已更改。

然后再切换到最大可用或者最大保护模式就ok了,切换前注意备库已经处于mount状态,并且主库原有的归档日志都已经全部复制到备库对应的归档目录下了,否则传送方式由arch改成lgwr后这些差异日志就无法自动传过去了。

如果在备库做过:alter database recover managed standby database finish ;

----主库open 错误

LGWR: Primary database is in MAXIMUM PROTECTION mode

Thu Dec 13 07:41:04 2012

Destination LOG_ARCHIVE_DEST_2 is SYNCHRONIZED

LGWR: Destination LOG_ARCHIVE_DEST_1 is not serviced by LGWR

ARC0 started with pid=17, OS id=7020

LNSb started with pid=20, OS id=7026

Thu Dec 13 07:41:07 2012

Errors in file /u01/app/oracle/admin/prod/bdump/bj_lgwr_6998.trc:

ORA-16143: RFS connections not allowed during or after terminal recovery

Thu Dec 13 07:41:07 2012

LGWR: Error 16143 verifying archivelog destination LOG_ARCHIVE_DEST_2

Thu Dec 13 07:41:07 2012

Destination LOG_ARCHIVE_DEST_2 is UNSYNCHRONIZED

LGWR: Error 16143 disconnecting from destination LOG_ARCHIVE_DEST_2 standby host 'sh'

LGWR: Continuing...

LGWR: Minimum of 1 applicable standby database required

------备库错误

Physical Standby Database mounted.

Completed: ALTER DATABASEMOUNT

ARC2 started with pid=18, OS id=6821

ARC2: Becoming the 'no FAL' ARCH

Thu Dec 13 07:37:49 2012

ARC0: Becoming the heartbeat ARCH

Thu Dec 13 07:38:31 2012

Redo Shipping Client Connected as PUBLIC

-- Connected User is Valid

RFS[1]: Assigned to RFS process 6824

RFS[1]: Identified database type as 'physical standby'

RFS[1]: No connections allowed during/after terminal recovery.

Thu Dec 13 07:38:31 2012

Errors in file /u01/app/oracle/admin/sh/udump/sh_rfs_6824.trc:

ORA-16143: RFS connections not allowed during or after terminal recovery

Thu Dec 13 07:40:47 2012


原因:在备库上曾经执行了:

alter database recover managed standby database finish


-------导致RFS不能再被启动


六、验证最大保护模式的安全性:

----在备库将网络中断,主库告警日志出现以下错误提示:

Thu Dec 13 08:02:10 2012

ORA-16198: LGWR received timedout error from KSR

LGWR: Attempting destination LOG_ARCHIVE_DEST_2 network reconnect (16198)

ORA-16198: LGWR received timedout error from KSR

LGWR: Error 16198 disconnecting from destination LOG_ARCHIVE_DEST_2 standby host 'sh'

LNSb started with pid=20, OS id=7153

Error 12560 received logging on to the standby

Thu Dec 13 08:02:40 2012

LGWR: Error 12560 attaching to RFS for reconnect

LNSb started with pid=20, OS id=7155

Error 12560 received logging on to the standby

Thu Dec 13 08:03:05 2012

------LNS服务,尝试多次连接后,然后会关闭主库数据库