Oracle 11gR2中的STANDBY_MAX_DATA_DELAY

技术Oracle 11gR2中的STANDBY_MAX_DATA_DELAYOracle 11gR2中的STANDBY_MAX_DATA_DELAY,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想

Oracle 11gR2中的待机_MAX_DATA_DELAY,针对这个问题,本文详细介绍了相应的分析和解答,希望能帮助更多想要解决这个问题的小伙伴找到更简单更容易的方法。

主动数据保护是Oracle 11g的亮点之一。在11G版本2中,主动数据保护引入了更具吸引力的新功能,这使得主动数据保护成为Oracle将读写或报告查询分开的理想解决方案之一。

待机_最大_数据_延迟是11gr2中活动数据保护的最大增强之一,这是一个可以在会话级别指定的会话参数。此参数指定主数据库中提交的更改与备用数据库中与更改相关的查询之间允许的时间延迟,单位为秒。

使用该STANDBY_MAX_DATA_DELAY参数的语法如下:

注意事项

系统用户不能使用该参数,在系统用户的SESSION下设置该参数将被忽略。

如果未指定待机_最大_数据_延迟,即使用默认值无,则无论主库和备用库之间有多长的延迟,都将执行物理待机查询。

如果查询延迟超过待机最大数据延迟指定的值,将报告ORA-03172错误:

03172,00000,“待机_最大_数据_延迟%秒”

//*原因: standbyrecoverfelbehindstandby _ MAX _ DATA _ DELAY

//要求。

//* action : tunerecovery and retrythiquerylater,或orswitchtoanother

//stand by databaseither with datadelayrequirements。

在实际应用中,备用数据库保证了在备用数据库上进行的报表查询不会得到太陈旧的结果。使用此参数,我们可以指定报表应用程序允许的数据时间延迟。

当然也可以指定不允许数据延迟,即将待机_MAX_DATA_DELAY设置为零,从而实现数据的实时查询。

在主数据库和备用数据库之间配置实时查询或零延迟查询时,有以下注意事项:

只有某些应用对数据延迟零容忍。注意你的申请是否有这么严格的要求。

在备用数据库上执行的查询语句必须返回与在主库中查询完全相同的结果。

您必须将待机最大数据延迟设置为0。

当查询开始时,备用数据库必须同步到与主数据库一致的当前Scn。

如果在200毫秒内没有返回结果,查询将被ORA-03172终止。

主数据库必须采用最大可用性或最大保护模式。

重做传输必须使用同步选项。

必须启用实时查询属性。

实际使用

让我们通过演示学习待机_最大_数据_延迟:的效果。

SQLselectnbs

p;* 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
--------------------------------------------------------------------------------
www.askmaclean.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

实际测试可以发现当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

以上查询语句执行过程中的10046 trace如下:

PARSING IN CURSOR #47828795969456 len=26 dep=0 uid=34 oct=3 lid=34 tim=1316692536000853
hv=2314050071 ad='7115e798' sqlid='3smn48y4yv6hr'
select count(*) from tsmdd
END OF STMT
PARSE #47828795969456:c=0,e=61,p=0,cr=0,cu=0,mis=0,r=0,dep=0,og=1,plh=1739041831,tim=1316692536000852 WAIT #47828795969456: nam='standby query scn advance' ela= 201440 p1=770798 p2=0 p3=20 obj#=13873 tim=1316692536202337 WAIT #47828795969456: nam='SQL*Net break/reset to client' ela= 25 driver id=1650815232
break?=1 p3=0 obj#=13873 tim=1316692536202528
WAIT #47828795969456: nam='SQL*Net break/reset to client' ela= 144 driver id=1650815232
break?=0 p3=0 obj#=13873 tim=1316692536202694
WAIT #47828795969456: nam='SQL*Net message to client' ela= 1 driver id=1650815232 #bytes=1
p3=0 obj#=13873 tim=1316692536202715
*** 2011-09-22 19:55:37.983
WAIT #47828795969456: nam='SQL*Net message from client' ela= 1781108 driver
id=1650815232 #bytes=1 p3=0 obj#=13873 tim=1316692537983884
CLOSE #47828795969456:c=0,e=24,dep=0,type=0,tim=1316692537984068
===============================================================================================
PARSING IN CURSOR #47828795969456 len=26 dep=0 uid=34 oct=3 lid=34 tim=1316692537984172
hv=2314050071 ad='7115e798' sqlid='3smn48y4yv6hr'
select count(*) from tsmdd
END OF STMT
PARSE #47828795969456:c=0,e=53,p=0,cr=0,cu=0,mis=0,r=0,dep=0,og=1,plh=1739041831,tim=1316692537984171 WAIT #47828795969456: nam='standby query scn advance' ela= 200546 p1=770914 p2=0 p3=20 obj#=13873 tim=1316692538184822 WAIT #47828795969456: nam='SQL*Net break/reset to client' ela= 10 driver
id=1650815232 break?=1 p3=0 obj#=13873 tim=1316692538184998
WAIT #47828795969456: nam='SQL*Net break/reset to client' ela= 103 driver
id=1650815232 break?=0 p3=0 obj#=13873 tim=1316692538185154
WAIT #47828795969456: nam='SQL*Net message to client' ela= 1 driver
id=1650815232 #bytes=1 p3=0 obj#=13873 tim=1316692538185182

注意这里出现的standby query scn advance等待事件,显然该等待事件是为了确认Primary与Standby之间的Scn差距,但这又是一个Internal的undocumented 等待事件。我猜测是P1是Standby数据库的Current Scn,而p3可能是Primary 与 Standby之间的Scn 差距。OBJ#是查询对象的object_id:

SQL> col owner for a20
SQL> col object_name for a20
SQL> select owner,object_name from dba_objects where object_id=13873;
OWNER                OBJECT_NAME
-------------------- --------------------
MACLEAN              TSMDD

使用技巧

在实际的使用过程中我们没有必要每次登录会话查询都去指定STANDBY_MAX_DATA_DELAY参数,可以通过创建AFTER LOGON触发器来简化工作。

在11 g Release 2中引入了USERENV Context的一种新属性DATABASE_ROLE,使用该属性可以便捷地定位用户所登录数据库的角色是Primary 还是 Standby,11g的SQL 和 PL/SQL客户端程序均可以通过 SYS_CONTEXT 函数获取该数据库角色信息。

通过创建以下登陆后触发器可以做到当应用程序登录到启用实时查询的Standby数据库上后即自动设置合适的STANDBY_MAX_DATA_DELAY参数。这样即避免了修改应用程序的代码,有做到了配置合理的最大数据延迟。

CREATE OR REPLACE TRIGGER AUTO_SMDD
  AFTER LOGON ON USER.SCHEMA
BEGIN
  IF (SYS_CONTEXT('USERENV', 'DATABASE_ROLE') IN ('PHYSICAL STANDBY')) THEN
    execute immediate 'alter session set standby_max_data_delay=5';
  END IF;
END;

注意以上trigger 只需要在Primary Database上以应用相关用户身份建立即可,会同步到Standby上:

Primary Database SQL>  conn maclean/maclean
Connected.
Primary Database SQL> CREATE OR REPLACE TRIGGER AUTO_SMDD
  2    AFTER LOGON ON MACLEAN.SCHEMA
  3  BEGIN
  4    IF (SYS_CONTEXT('USERENV', 'DATABASE_ROLE') IN ('PHYSICAL STANDBY')) THEN
  5      execute immediate 'alter session set standby_max_data_delay=0';
  6    END IF;
  7  END;
  8  /
Trigger created.

关于Oracle 11gR2中的STANDBY_MAX_DATA_DELAY问题的解答就分享到这里了,希望

内容来源网络,如有侵权,联系删除,本文地址:https://www.230890.com/zhan/123891.html

(0)

相关推荐

  • 抖音真人赞10个自助下单,介绍下抖音刷真人赞多少钱?

    技术抖音真人赞10个自助下单,介绍下抖音刷真人赞多少钱?于抖音新手怎么快速涨粉丝?
    1、大量关注别人,这样必定会带来许多的粉
    2、评论别人,不停地评论陌生人的抖音,只要看到有人发抖音就去留下高质量的评论,每次都坐上沙发,

    测评 2021年11月9日
  • javascript如何使用数组中的sort方法

    技术javascript如何使用数组中的sort方法这篇文章主要为大家展示了“javascript如何使用数组中的sort方法”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“j

    攻略 2021年11月8日
  • nodejs是一门语言吗

    技术nodejs是一门语言吗这篇文章主要讲解了“nodejs是一门语言吗”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“nodejs是一门语言吗”吧!

    攻略 2021年11月19日
  • webview怎么改变滑动效果(webview怎么设置旋转)

    技术怎么优雅的对Webview进行截屏怎么优雅的对Webview进行截屏,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。如何优雅的对Webview进行截屏?第

    攻略 2021年12月21日
  • 用图形画一幅画,用一张白纸怎么样绘画出一张图

    技术用图形画一幅画,用一张白纸怎么样绘画出一张图“绘见70年用图形画一幅画,画出新中国”一个才华横溢有望成为艺术大家的美术老师?,为大家呈现以绘画的方式表达对祖国的热爱。一张白纸经过我们的图图画画,使空白化作神奇。新手绘

    生活 2021年10月24日
  • 铵根的化合价,邱俊霖化合价style歌词

    技术铵根的化合价,邱俊霖化合价style歌词是这个吧铵根的化合价?!《化学价Style》——邱俊霖
    我背化合价
    化合价
    化合物中 钾钠银氢 常显 +1 价
    在化合物中 钙镁钡锌 通常显 +2 价
    在化合物中 氟氯溴碘 通

    生活 2021年10月20日