2. About Me
l Email:liu.maclean@gmail.com
l Blog:www.oracledatabase12g.com
l Oracle Certified Database Administrator Master 10g
and 11g
l Over 6 years experience with Oracle DBA technology
l Over 7 years experience with Linux technology
l Member Independent Oracle Users Group
l Member All China Oracle Users Group
l Presents for advanced Oracle topics: RAC,
DataGuard, Performance Tuning and Oracle Internal.
3. Active Data Guard 是 Oracle 11g 的亮点特性之一,而在 11G release 2 中对 Active Data Guard 引入了更多诱人
的新特性,这些特性将 Active Data Guard 打造成 Oracle 读写分离或报表查询的理想方案之一。
STANDBY_MAX_DATA_DELAY 是 11gr2 中对 Active Data Guard 的最大增强(buffer)之一,这是一个可以在会话
级别指定的参数(session parameter),该参数指定了在 Primary Database 已 commit 提交的变化与 standby
Database 数据库上涉及相关变化的查询之间所允许的时间延迟,单位为 second 秒(Specifies a limit for the
amount of time (in seconds) allowed to elapse between when changes are committed on the primary and when
those same changes can be queries on the standby database)。
使用该 STANDBY_MAX_DATA_DELAY 参数的语法如下:
ALTER SESSION SET STANDBY_MAX_DATA_DELAY ={ NONE |
INTEGER }
注意事项
• 该参数无法为 SYS 用户所用,在 SYS 用户的 SESSION 下设置该参数将被忽略
• 若没有指定 STANDBY_MAX_DATA_DELAY,即使用其默认值 NONE,那么无论主备库之间有多大的
延迟,在 Physical Standby 上的查询都会被执行
• 若查询延迟超过 STANDBY_MAX_DATA_DELAY 所指定的值那么,将报 ORA-03172 错误:
03172, 00000, "STANDBY_MAX_DATA_DELAY of %s seconds exceeded"
// *Cause: Standby recovery fell behind the STANDBY_MAX_DATA_DELAY
// requirement.
// *Action: Tune recovery and retry the query later, or switch to another
// standby database within the data delay requirement.
4. 在实际运用中 STANDBY_MAX_DATA_DELAY 保证了在 Standby 数据库上所作的报表查询不会得到过于陈旧的
结果(stale result),通过该参数我们可以指定一个报表应用所容许的数据时间延迟。
当然也可以指定不容许任何数据延迟,即设置 STANDBY_MAX_DATA_DELAY 为零,以便做到实时数据查询。
配置 Primary 与 Standby 数据库之间的实时查询或者说零延迟查询有以下注意事项:
• 只有特定的应用程序才会对数据延迟有零容忍的需求,注意你的应用程序是否有如此苛刻的要求
• 在 standby 数据库上执行的查询语句必须返回和主库上查询的完全一致的结果
• 必须设置 STANDBY_MAX_DATA_DELAY 为 0
• 在查询开始的那一刻,Standby 数据库必须同步到与 Primary 数据库一致的 Current Scn
• 若结果没有在 200ms 内返回,则查询会因 ORA-03172 而终止
• Primary 数据库必须采用最大可用(max availability)或最大保护(maximum protection)模式
• redo 传输必须使用 SYNC 选项
• 必须启用 Real-Time Query 特性
实际使用
以下我们通过演示来了解该 STANDBY_MAX_DATA_DELAY 的效果:
SQL> select * from v$version;
BANNER
--------------------------------------------------------------------------------
Oracle Database 11g Enterprise Edition Release 11.2.0.2.0 - 64bit Production
PL/SQL Release 11.2.0.2.0 - Production
CORE 11.2.0.2.0 Production
TNS for Linux: Version 11.2.0.2.0 - Production
NLSRTL Version 11.2.0.2.0 - Production
SQL> select * from global_name;
GLOBAL_NAME
--------------------------------------------------------------------------------
5. www.oracledatabase12g.com & www.askmaclean.com
Primary Database SQL> conn maclean/maclean
Connected.
Primary Database SQL> select database_role,protection_mode from v$database;
DATABASE_ROLE PROTECTION_MODE
---------------- --------------------
PRIMARY MAXIMUM AVAILABILITY
Primary Database SQL> create table TSMDD tablespace users as select * From dba_objects;
Table created.
Standby Database SQL> conn maclean/maclean
Connected.
Standby Database SQL> select database_role,protection_mode from v$database;
DATABASE_ROLE PROTECTION_MODE
---------------- --------------------
PHYSICAL STANDBY MAXIMUM AVAILABILITY
注意 STANDBY_MAX_DATA_DELAY 是一个会话参数 session parameter,而非实例参数 instance parameter
Standby Database SQL> select name from v$system_parameter where
name='standby_max_data_delay';
no rows selected
Standby Database SQL> alter session set STANDBY_MAX_DATA_DELAY=0;
Session altered.
Standby Database SQL> select count(*) from TSMDD;
COUNT(*)
----------
13378
6. 实际测试可以发现当 STANDBY_MAX_DATA_DELAY=0 时,并不是查询语句执行时间超过 200ms 就返回 ORA-
03172 错误,而是指从查询开始的 200ms 内,若备库没有追上主库的 Current SCN 时出现 ORA-03172。
Standby Database SQL> alter session set STANDBY_MAX_DATA_DELAY=0;
Session altered.
Standby Database SQL> set timing on;
Standby Database SQL> select count(1) from TSMDD a, TSMDD b;
COUNT(1)
----------
178970884
Elapsed: 00:00:05.34
Standby Database SQL> alter session set events '10046 trace name context forever,level
12';
Session altered.
在主库上执行大数据量的 insert 操作,但是不提交 commit;
Primary Database SQL> insert into /*+ append */ tsmdd select * from tsmdd;
此时在 Standby 数据库 上执行查询语句将触发 ORA-3172 错误
Standby Database SQL> select count(*) from tsmdd
*
ERROR at line 1:
ORA-03172: STANDBY_MAX_DATA_DELAY of 0 seconds exceeded
Standby Database SQL> /
select count(*) from tsmdd
*
ERROR at line 1:
ORA-03172: STANDBY_MAX_DATA_DELAY of 0 seconds exceeded