在2012年第一季度的CPU补丁中,包含了一个关于SCN修正的重要变更,这个补丁提示,在异常情况下,Oracle的SCN可能出现异常增长,使得数据库的一切事务停止,由于SCN不能后退,所以数据库必须重建,才能够重用。

我曾经在以下链接中描述过这个问题:

http://www.eygle.com/archives/2012/03/oracle_scn_bug_exhaused.html

Oracle使用6 Bytes记录SCN,也就是48位,其最大值是:

SQL> col scn for 999,999,999,999,999,999

SQL> select power(2,48) scn from dual;

SCN

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

281,474,976,710,656

Oracle在内部控制每秒增减的SCN不超过 16K,按照这样计算,这个数值可以使用大约544年:

SQL> select power(2,48) / 16 / 1024 / 3600 / 24 / 365 from dual;

POWER(2,48)/16/1024/3600/24/365

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

544.770078

然而在出现异常时,尤其是当使用DB Link跨数据库查询时,SCN会被同步,在以下链接中,我曾经描述过此问题:

http://www.eygle.com/archives/2006/11/db_link_checkpoint_scn.html

一个数据库当前最大的可能SCN被称为"最大合理SCN",该值可以通过如下方式计算:

col scn for 999,999,999,999,999,999

select

(

(

(

(

(

(

to_char(sysdate,'YYYY')-1988

)*12+

to_char(sysdate,'mm')-1

)*31+to_char(sysdate,'dd')-1

)*24+to_char(sysdate,'hh24')

)*60+to_char(sysdate,'mi')

)*60+to_char(sysdate,'ss')

) * to_number('ffff','XXXXXXXX')/4 scn

from dual

/这个算法即SCN算法,以1988年1月1日 00点00时00分开始,每秒计算1个点数,最大SCN为16K。

这个内容可以参考如下链接:

http://www.eygle.com/archives/2006/01/how_big_scn_can_be.html

在CPU补丁中,Oracle提供了一个脚本 scnhealthcheck.sql 用于检查数据库当前SCN的剩余情况。

该脚本的算法和以上描述相同,最终将最大合理SCN 减去当前数据库SCN,计算得出一个指标:HeadRoom。也就是SCN尚余的顶部空间,这个顶部空间最后折合成天数:

以下是这个脚本的内容:

Rem

Rem $Header: rdbms/admin/scnhealthcheck.sql st_server_tbhukya_bug-13498243/8 2012/01/17 03:37:18 tbhukya Exp $

Rem

Rem scnhealthcheck.sql

Rem

Rem Copyright (c) 2012, Oracle and/or its affiliates. All rights reserved.

Rem

Rem    NAME

Rem      scnhealthcheck.sql - Scn Health check

Rem

Rem    DESCRIPTION

Rem      Checks scn health of a DB

Rem

Rem    NOTES

Rem      .

Rem

Rem    MODIFIED   (MM/DD/YY)

Rem    tbhukya     01/11/12 - Created

Rem

Rem

define LOWTHRESHOLD=10

define MIDTHRESHOLD=62

define VERBOSE=FALSE

set veri off;

set feedback off;

set serverout on

DECLARE

verbose boolean:=&&VERBOSE;

BEGIN

For C in (

select

version,

date_time,

dbms_flashback.get_system_change_number current_scn,

indicator

from

(

select

version,

to_char(SYSDATE,'YYYY/MM/DD HH24:MI:SS') DATE_TIME,

((((

((to_number(to_char(sysdate,'YYYY'))-1988)*12*31*24*60*60) +

((to_number(to_char(sysdate,'MM'))-1)*31*24*60*60) +

(((to_number(to_char(sysdate,'DD'))-1))*24*60*60) +

(to_number(to_char(sysdate,'HH24'))*60*60) +

(to_number(to_char(sysdate,'MI'))*60) +

(to_number(to_char(sysdate,'SS')))

) * (16*1024)) - dbms_flashback.get_system_change_number)

/ (16*1024*60*60*24)

) indicator

from v$instance

)

) LOOP

dbms_output.put_line( '-----------------------------------------------------'

|| '---------' );

dbms_output.put_line( 'ScnHealthCheck' );

dbms_output.put_line( '-----------------------------------------------------'

|| '---------' );

dbms_output.put_line( 'Current Date: '||C.date_time );

dbms_output.put_line( 'Current SCN:  '||C.current_scn );

if (verbose) then

dbms_output.put_line( 'SCN Headroom: '||round(C.indicator,2) );

end if;

dbms_output.put_line( 'Version:      '||C.version );

dbms_output.put_line( '-----------------------------------------------------'

|| '---------' );

IF C.version > '10.2.0.5.0' and

C.version NOT LIKE '9.2%' THEN

IF C.indicator>&MIDTHRESHOLD THEN

dbms_output.put_line('Result: A - SCN Headroom is good');

dbms_output.put_line('Apply the latest recommended patches');

dbms_output.put_line('based on your maintenance schedule');

IF (C.version < '11.2.0.2') THEN

dbms_output.put_line('AND set _external_scn_rejection_threshold_hours='

|| '24 after apply.');

END IF;

ELSIF C.indicator<=&LOWTHRESHOLD THEN

dbms_output.put_line('Result: C - SCN Headroom is low');

dbms_output.put_line('If you have not already done so apply' );

dbms_output.put_line('the latest recommended patches right now' );

IF (C.version < '11.2.0.2') THEN

dbms_output.put_line('set _external_scn_rejection_threshold_hours=24 '

|| 'after apply');

END IF;

dbms_output.put_line('AND contact Oracle support immediately.' );

ELSE

dbms_output.put_line('Result: B - SCN Headroom is low');

dbms_output.put_line('If you have not already done so apply' );

dbms_output.put_line('the latest recommended patches right now');

IF (C.version < '11.2.0.2') THEN

dbms_output.put_line('AND set _external_scn_rejection_threshold_hours='

||'24 after apply.');

END IF;

END IF;

ELSE

IF C.indicator<=&MIDTHRESHOLD THEN

dbms_output.put_line('Result: C - SCN Headroom is low');

dbms_output.put_line('If you have not already done so apply' );

dbms_output.put_line('the latest recommended patches right now' );

IF (C.version >= '10.1.0.5.0' and

C.version <= '10.2.0.5.0' and

C.version NOT LIKE '9.2%') THEN

dbms_output.put_line(', set _external_scn_rejection_threshold_hours=24'

|| ' after apply');

END IF;

dbms_output.put_line('AND contact Oracle support immediately.' );

ELSE

dbms_output.put_line('Result: A - SCN Headroom is good');

dbms_output.put_line('Apply the latest recommended patches');

dbms_output.put_line('based on your maintenance schedule ');

IF (C.version >= '10.1.0.5.0' and

C.version <= '10.2.0.5.0' and

C.version NOT LIKE '9.2%') THEN

dbms_output.put_line('AND set _external_scn_rejection_threshold_hours=24'

|| ' after apply.');

END IF;

END IF;

END IF;

dbms_output.put_line(

'For further information review MOS document id 1393363.1');

dbms_output.put_line( '-----------------------------------------------------'

|| '---------' );

END LOOP;

end;

/在应用补丁之后,一个新的隐含参数 _external_scn_rejection_threshold_hours 引入,通常设置该参数为 24 小时:

_external_scn_rejection_threshold_hours=24

这个设置降低了SCN Headroom的顶部空间,以前缺省的设置容量至少为31天,降低为 24 小时,可以增大SCN允许增长的合理空间。

但是如果不加控制,SCN仍然可能会超过最大的合理范围,导致数据库问题。

这个问题的影响会极其严重,我们建议用户检验当前数据库的SCN使用情况,以下是检查脚本的输出范例:

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

ScnHealthCheck

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

Current Date: 2012/01/15 14:17:49

Current SCN:  13194140054241

Version:      11.2.0.2.0

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

Result: C - SCN Headroom is low

If you have not already done so apply

the latest recommended patches right now

AND contact Oracle support immediately.

For further information review MOS document id 1393363.

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

这个问题已经出现在客户环境中,需要引起大家的足够重视。

在SCN告警阈值达到时,数据库中可能出现以下错误信息:

Advanced SCN by 8381 minutes worth to Ox0bad.4ab15e1,by distributed transaction remote logon,remote DB:ORCL.

Warning - High Database SCN: Current SCN value is 0x0b7b.0008e40b, threshold SCN value is 0x0b75.055dc000

If you have not previously reported this warning on this database, please notify Oracle Support so that additional diagnosis can be performed.

Warning: The SCN headroom for this database is only NN days!

Warning: The SCN headroom for this database is only N hours!

Rejected the attempt to advance SCN over limit by 984 hours worth to 0x0c00.0000ff66, by distributed transaction remote logon, remote DB: DB.ORCL.ORACLE.COM.

Client info : DB logon user SYS, machine sun, program sqlplus@orcl (TNS V1-V3), and OS user oracle

Rejected the attempt to advance SCN over limit by 9875 hours worth to 0x0c00.000003e6, by distributed transaction logon, remote DB: DB.ORCL.ORACLE.COM.MOS参考文档:

NOTE:1376995.1 - Information on the System Change Number (SCN) and how it is used in the Oracle Database

NOTE:1393363.1 - Installing, Executing and Interpreting output from the "SCNhealthcheck.sql" script

NOTE:1388639.1 - Evidence to collect when reporting "high SCN rate" issues to Oracle Support

NOTE:1393360.1 - ORA-19706 and Related Alert Log Messages

oracle scn超了,Oracle安全 - SCN的可能最大值与耗尽问题相关推荐

  1. 讨论oracle的反腐,关于oracle SCN 的讨论

    1.SCN存在redo log文件,control文件.数据文件; 2.oracle正常运行时,control文件的SCN是个很大的数,与redo log文件.数据文件的SCN不同,正常关闭时,做完c ...

  2. oracle数据库修改写入状态,【学习笔记】Oracle oradebug 使用oradebug修改数据库SCN方法案例...

    天萃荷净 使用oradebug修改数据库scn,使用oradebug修改数据库scn的案例. 这里也做了两个测试,发现该功能确实很巧妙,通过修改内存中的scn值,然后写入控制文件和数据文件,实现修改s ...

  3. oracle scn与数据恢复,[Oracle] SCN与数据恢复的关系

    Oracle内部主要存在以下四种SCN 1.系统检查点(system checkpoint)SCN 每当一个检查点完成时,Oracle就把该检查点对应的SCN记录到控制文件中,可以用以下语句查看当前数 ...

  4. 突出重围:Oracle 10.2.0.5应用SCN补丁解决DB Link预警实践

    点击▲关注 "数据和云"   给公众号标星置顶 更多精彩 第一时间直达 作者:赵靖宇,云和恩墨北区交付工程师,长期服务于运营商.保险.医院.政府等行业,擅长Oracle数据库故障处 ...

  5. oracle查询当前归档scn_Oracle的SCN剖析

    1.oracle 为了防止scn的异常增长所以限制每一秒钟允许最多产生 256*256/4 个scn 2.oracle 内部使用了一个4G范围的数据来表示01/01/1988 00:00:00 ~ 0 ...

  6. 调整oracle scn,ORACLE数据库中使用ADJUST_SCN增进SCN及案例模拟

    天萃荷净 使用ADJUST_SCN增进SCN及案例模拟ORA-00600: internal error code, arguments: [2662], [0] 在oracle数据库中我们可以利用o ...

  7. oracle11g数据库版本号,Oracle数据库之关于oracle db 11gR2版本号上的參数和scn headroom补丁问题...

    本文主要向大家介绍了Oracle数据库之关于oracle db 11gR2版本号上的參数和scn headroom补丁问题,通过具体的内容向大家展现,希望对大家学习Oracle数据库有所帮助. 关于o ...

  8. oracle scn漏洞,Oracle安全:SCN可能最大值与耗尽问题Oracle安全:SCN可能最大值与耗尽问题...

    SCN的问题一旦出现,使得数据库的一切事务停止,由于SCN不能后退,所以数据库必须重建,才能够重用. 在2012年第一季度的CPU补丁中,包含了一个关于SCN修正的重要变更,这个补丁提示,在异常情况下 ...

  9. 安装64位Oracle 10g超详细教程

    安装64位Oracle 10g超详细教程 1. 安装准备阶段 1.1 安装Oracle环境 经过上一篇博文的过程,已经完成了对Linux系统的安装,本例使用X-Manager来实现与Linux系统的连 ...

最新文章

  1. pythonsqlite3教程_使用 Python 在线操作 sqlite3
  2. SAP RFC-RFC概述
  3. 数据类型(整型、浮点数、字符串、时间和日期)、切分(水平、垂直)
  4. linux100day(day3)--常用文本处理命令和vim文本编辑器
  5. 开发经验分享_02_解决问题3步走(实战)
  6. 【codevs1033】蚯蚓的游戏问题,费用流
  7. 为zsh和VIM配置一个状态提示栏
  8. 【hadoop】java.io.IOException: No FileSystem for scheme: hdfs
  9. 关系网络理论︱细讲中介中心性(Betweeness Centrality)
  10. 妙用next数组打表求最小循环节len
  11. gogo learning
  12. 2013年春节放假通知
  13. springboot中使用thymeleaf片段引入出现500错误(易错)
  14. 【ToyDB-Rust】超详细介绍
  15. DC Administration Services 宣布ISDA裁决委员会2020年申请流程
  16. VS2012安装DirectX SDK(DXSDK_Feb10)
  17. Vue--解决官网网站404的问题
  18. 2019CSP初赛基础知识整理
  19. 花菁染料|cas146368-08-3-齐岳生物
  20. C#中用WMI获取远程计算

热门文章

  1. matlab二维数组命名,Matlab教程1_矩阵(数组) _ 二维数组的创建
  2. 数学史资料:中国数学
  3. 25.(C语言)回文数判断万用公式
  4. 斐波那契数列谈矩阵(1)
  5. 2.2.1 双绞线、同轴电缆、光纤与无线传输介质
  6. 恒生股票交易接口api主要作用在哪里?
  7. 编程题002--二叉树的镜像--niuke
  8. 最全的视频转换器工具清单,这18款免费视频格式转换器记得收藏
  9. NI Linux实时设备上升级固件
  10. (1366, Incorrect string value: '\\xD6\\xD0\\xB9\\xFA\\xB1\\xEA...'for column 'VARIABLE_VALUE' at489