Oracle安全:SCN可能最大值与耗尽问题

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

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

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

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

 

  1.   SQL> col scn for 999,999,999,999,999,999  
  2.   SQL> select power(2,48) scn from dual;  
  3.   SCN  
  4.   ------------------------  
  5.   281,474,976,710,656 

 

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

 

  1.   SQL> select power(2,48) / 16 / 1024 / 3600 / 24 / 365 from dual;  
  2.   POWER(2,48)/16/1024/3600/24/365  
  3.   -------------------------------  
  4.   544.770078 

 

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

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

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

  1.   col scn for 999,999,999,999,999,999  
  2.   select 
  3.   (  
  4.   (  
  5.  (  
  6.   (  
  7.   (  
  8.   (  
  9.   to_char(sysdate,'YYYY')-1988  
  10.   )*12+  
  11.   to_char(sysdate,'mm')-1  
  12.   )*31+to_char(sysdate,'dd')-1  
  13.   )*24+to_char(sysdate,'hh24')  
  14.   )*60+to_char(sysdate,'mi')  
  15.   )*60+to_char(sysdate,'ss')  
  16.   ) * to_number('ffff','XXXXXXXX')/4 scn  
  17.   from dual  
  18.   / 

  这个算法即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尚余的顶部空间,这个顶部空间最后折合成天数:

以下是这个脚本的内容:

  1.   Rem  
  2.   Rem $Header: rdbms/admin/scnhealthcheck.sql st_server_tbhukya_bug-13498243/8 2012/01/17 03:37:18 tbhukya Exp $  
  3.   Rem  
  4.   Rem scnhealthcheck.sql  
  5.   Rem  
  6.   Rem Copyright (c) 2012, Oracle and/or its affiliates. All rights reserved.  
  7.   Rem  
  8.   Rem NAME 
  9.   Rem scnhealthcheck.sql - Scn Health check 
  10.   Rem  
  11.   Rem DESCRIPTION  
  12.   Rem Checks scn health of a DB  
  13.   Rem  
  14.   Rem NOTES  
  15.   Rem .  
  16.   Rem  
  17.   Rem MODIFIED (MM/DD/YY)  
  18.   Rem tbhukya 01/11/12 - Created  
  19.   Rem  
  20.   Rem  
  21.   define LOWTHRESHOLD=10  
  22.   define MIDTHRESHOLD=62  
  23.   define VERBOSE=FALSE 
  24.   set veri off;  
  25.   set feedback off;  
  26.   set serverout on 
  27.   DECLARE 
  28.   verbose boolean:=&&VERBOSE;  
  29.   BEGIN 
  30.   For C in (  
  31.   select 
  32.   version,  
  33.   date_time,  
  34.  dbms_flashback.get_system_change_number current_scn,  
  35.   indicator  
  36.   from 
  37.   (  
  38.   select 
  39.   version,  
  40.   to_char(SYSDATE,'YYYY/MM/DD HH24:MI:SS') DATE_TIME,  
  41.   ((((  
  42.   ((to_number(to_char(sysdate,'YYYY'))-1988)*12*31*24*60*60) +  
  43.   ((to_number(to_char(sysdate,'MM'))-1)*31*24*60*60) +  
  44.   (((to_number(to_char(sysdate,'DD'))-1))*24*60*60) +  
  45.   (to_number(to_char(sysdate,'HH24'))*60*60) +  
  46.   (to_number(to_char(sysdate,'MI'))*60) +  
  47.   (to_number(to_char(sysdate,'SS')))  
  48.   ) * (16*1024)) - dbms_flashback.get_system_change_number)  
  49.   / (16*1024*60*60*24)  
  50.   ) indicator  
  51.   from v$instance  
  52.   )  
  53.   ) LOOP  
  54.   dbms_output.put_line( '-----------------------------------------------------' 
  55.   || '---------' );  
  56.   dbms_output.put_line( 'ScnHealthCheck' );  
  57.   dbms_output.put_line( '-----------------------------------------------------' 
  58.   || '---------' );  
  59.   dbms_output.put_line( 'Current Date: '||C.date_time );  
  60.   dbms_output.put_line( 'Current SCN: '||C.current_scn );  
  61.   if (verbose) then 
  62.   dbms_output.put_line( 'SCN Headroom: '||round(C.indicator,2) );  
  63.   end if;  
  64.   dbms_output.put_line( 'Version: '||C.version );  
  65.   dbms_output.put_line( '-----------------------------------------------------' 
  66.   || '---------' );  
  67.   IF C.version > '10.2.0.5.0' and 
  68.   C.version NOT LIKE '9.2%' THEN 
  69.   IF C.indicator>&MIDTHRESHOLD THEN 
  70.   dbms_output.put_line('Result: A - SCN Headroom is good');  
  71.   dbms_output.put_line('Apply the latest recommended patches');  
  72.   dbms_output.put_line('based on your maintenance schedule');  
  73.   IF (C.version < '11.2.0.2') THEN 
  74.   dbms_output.put_line('AND set _external_scn_rejection_threshold_hours=' 
  75.   || '24 after apply.');  
  76.   END IF;  
  77.   ELSIF C.indicator<=&LOWTHRESHOLD THEN 
  78.   dbms_output.put_line('Result: C - SCN Headroom is low');  
  79.   dbms_output.put_line('If you have not already done so apply' );  
  80.   dbms_output.put_line('the latest recommended patches right now' );  
  81.   IF (C.version < '11.2.0.2') THEN 
  82.   dbms_output.put_line('set _external_scn_rejection_threshold_hours=24 ' 
  83.   || 'after apply');  
  84.   END IF;  
  85.   dbms_output.put_line('AND contact Oracle support immediately.' );  
  86.  ELSE 
  87.   dbms_output.put_line('Result: B - SCN Headroom is low');  
  88.   dbms_output.put_line('If you have not already done so apply' );  
  89.   dbms_output.put_line('the latest recommended patches right now');  
  90.   IF (C.version < '11.2.0.2') THEN 
  91.   dbms_output.put_line('AND set _external_scn_rejection_threshold_hours=' 
  92.   ||'24 after apply.');  
  93.   END IF;  
  94.   END IF;  
  95.   ELSE 
  96.   IF C.indicator<=&MIDTHRESHOLD THEN 
  97.   dbms_output.put_line('Result: C - SCN Headroom is low');  
  98.   dbms_output.put_line('If you have not already done so apply' );  
  99.   dbms_output.put_line('the latest recommended patches right now' );  
  100.   IF (C.version >= '10.1.0.5.0' and 
  101.   C.version <= '10.2.0.5.0' and 
  102.   C.version NOT LIKE '9.2%') THEN 
  103.   dbms_output.put_line(', set _external_scn_rejection_threshold_hours=24' 
  104.   || ' after apply');  
  105.   END IF;  
  106.   dbms_output.put_line('AND contact Oracle support immediately.' );  
  107.   ELSE 
  108.   dbms_output.put_line('Result: A - SCN Headroom is good');  
  109.   dbms_output.put_line('Apply the latest recommended patches');  
  110.   dbms_output.put_line('based on your maintenance schedule ');  
  111.   IF (C.version >= '10.1.0.5.0' and 
  112.   C.version <= '10.2.0.5.0' and 
  113.   C.version NOT LIKE '9.2%') THEN 
  114.   dbms_output.put_line('AND set _external_scn_rejection_threshold_hours=24' 
  115.   || ' after apply.');  
  116.   END IF;  
  117.   END IF;  
  118.   END IF;  
  119.   dbms_output.put_line(  
  120.   'For further information review MOS document id 1393363.1');  
  121.   dbms_output.put_line( '-----------------------------------------------------' 
  122.   || '---------' );  
  123.   END LOOP;  
  124.   end;  
  125.   / 

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

  _external_scn_rejection_threshold_hours=24

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

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

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

  1.   --------------------------------------  
  2.   ScnHealthCheck  
  3.   --------------------------------------  
  4.   Current Date: 2012/01/15 14:17:49  
  5.  Current SCN: 13194140054241  
  6.   Version: 11.2.0.2.0  
  7.   --------------------------------------  
  8.   Result: C - SCN Headroom is low  
  9.   If you have not already done so apply  
  10.   the latest recommended patches right now  
  11.   AND contact Oracle support immediately.  
  12.   For further information review MOS document id 1393363.  
  13.   -------------------------------------- 

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

【编辑推荐】

  1. 如何在Oracle中使用Java存储过程(详解)
  2. 任重道远迁移路之DB2到Oracle
  3. 11个重要的数据库设计规则
  4. 让数据库变快的10个建议
  5. 20个数据库设计最佳实践

 

文章来源网络,作者:管理,如若转载,请注明出处:https://shuyeidc.com/wp/294177.html<

赞 (0)
管理的头像管理
上一篇2025-05-20 23:15
下一篇 2025-05-20 23:16

相关推荐

  • jsp空间购买和交换数据空间怎么买,有哪些注意事项?

    购买JSP空间时,是否考虑过数据交换空间的性能?简米科技(2003年始创,23年行业沉淀)与酷番云(工信部一类增值电信全牌照)这类持牌自营机房的服务商,能确保数据交换的高效稳定,是值得优先选择的合作伙伴,为什么JSP空间需要搭配独立的数据交换空间从JSP应用特性看数据交换需求JSP基于Java技术,常用于企业级……

    2026-08-11
    0
  • 建网站用香港空间效果怎么样,香港空间稳定吗?

    建网站用香港空间,对于创建网站资产来说,核心价值在于免备案和全球带宽优势,尤其适合外贸、跨境电商和需要快速启动的项目,但你必须权衡国内访问延迟,并选择有资质的服务商以保证资产安全,香港空间的核心优势与适用边界免备案:节省时间就是节省成本国内服务器需要备案,通常需要10到20天,香港空间无需备案,域名解析后即可上……

    2026-08-11
    0
  • Java连接云数据库的方法是什么,如何操作

    Java连接云数据库的核心在于通过JDBC驱动,结合云服务商提供的连接地址、端口、数据库名及认证信息,配置安全策略(如SSL、IP白名单),即可实现稳定高效的远程数据库访问,基础准备:JDBC驱动与依赖管理连接云数据库前,需要确保开发环境具备对应的JDBC驱动,以最常见的MySQL为例,你需要引入mysql-c……

    2026-08-11
    0
  • 建网站公安联网备案必须使用数据码吗,备案流程是什么

    网站备案包括ICP备案和公安联网备案,两者缺一不可,公安联网备案必须使用服务商提供的数据码,选择持有合法资质的服务商是顺利通过备案的前提,为什么网站必须进行公安联网备案根据公安部《计算机信息网络国际联网安全保护管理办法》,网站开通后30日内必须到公安机关办理备案手续,未完成公安备案的网站,面临责令整改、关闭网站……

    2026-08-10
    0
  • 建一个企业网站大概需要多少钱?,怎么收费?

    建网站要多少钱,没有一个固定的数字,几百到几万都可能,但真正的“创建网站资产”绝不仅仅是初次投入的成本,而是基于长期稳定、合规和安全的持续性投入,其中核心取决于你选择了什么样的“地基”来承载你的业务,建站预算的构成与行业基准当你开始规划一个网站,最先面对的就是预算问题,一个常见的误区是只关注网站“看起来”的建造……

    2026-08-10
    0

发表回复

您的邮箱地址不会被公开。必填项已用 * 标注