SCN的问题一旦出现,使得数据库的一切事务停止,由于SCN不能后退,所以数据库必须重建,才能够重用。

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

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

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会被同步,在以下链接中,我曾经描述过此问题:

一个数据库当前最大的可能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。

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

在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.

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

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

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/9606200/viewspace-1435660/,如需转载,请注明出处,否则将追究法律责任。

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

  1. SCN风波又起,2019年6月之前Oracle必须升级吗?

    最近关于SCN的问题又被炒的沸沸扬扬:因为Oracle之前更新了一篇文章(ANNOUNCEMENT: Recommended patches and actions for Oracle databa ...

  2. Oracle安全漏洞2016.10报告

    Oracle安全漏洞2016.10报告 http://www.cnvd.org.cn/webinfo/show/3950 转载于:https://www.cnblogs.com/chen110xi/p ...

  3. 绿盟漏扫使用手册_【技术干货】Oracle数据库漏洞扫描指南

    阅读: 1,449 在使用漏洞扫描产品对Oracle数据库进行漏洞扫描的时候,需要区分使用的扫描方式,否则可能对后续的修复加固工作带来一系列的困扰.一般来讲,Oracle数据库扫描分为远程扫描和登录扫 ...

  4. oracle系统漏洞绿盟,【处置建议】Oracle WebLogic反序列化漏洞(CVE-2018-2628)安全处置建议...

    阅读: 16,098 Oracle官方发布了4月份的关键补丁更新CPU(Critical Patch Update),其中包含一个高危的远程代码执行漏洞(CVE-2018-2628),通过该漏洞,攻击 ...

  5. oracle自动恢复数据库文件,只有数据文件情况下恢复Oracle数据库

    只有数据文件情况下恢复数据库 1,创建几个表,进行 log switch SQL> create table t9 as select * from dba_tables; Table crea ...

  6. oracle rac对心跳要求_关于心跳网络引起的Oracle RAC的节点驱逐(不是实例驱逐)...

    关于心跳网络引起的Oracle RAC的节点驱逐(不是实例驱逐) 问: 假设如下场景:4个节点rac,心跳线走的是千m网络交换机,若是该千M网络交换机断电,我想知道crs的驱逐节点的算法是怎么样的? ...

  7. mysql和oracle冲突吗_三分钟带你分清MySQL 和Oracle之间的误区

    原标题:三分钟带你分清MySQL 和Oracle之间的误区 来自:华为云开发者社区 摘要:MySQL和Oracle,别再傻傻分不清. MySQL 和Oracle 在开发中的使用是随处可见的,那就简单去 ...

  8. jpa query oracle 参数int为空_撸一个预言机(Oracle)服务,真香!—中篇

    本文作者:六天 一.文章结构 本文将通过上.中.下三篇文章带领大家一步步开发实现一个中心化的 Oracle 服务,并通过一个抽奖合约演示如何使用我们的 Oracle 服务.文章内容安排如下: 上篇:O ...

  9. oracle 查看表被谁删了_【分享】Oracle 常用运维命令大全

    一.oracle建库与删库命令 (1)oracle11g建库(一般习惯配置gdbname与sid名一样,sys密码与system密码一样,以方便记忆) [oracledb@ ~]$ dbca -sil ...

最新文章

  1. android.view.ViewRoot$CalledFromWrongThreadException的解决办法
  2. 为什么request的页面与原页面不同_如何在不同页面上使用不同的Joomla CSS
  3. 安全领域应该关注的网站
  4. Sitecore 个性化 - 近距离和过于个人化?
  5. 线性代数知识汇总(转载)
  6. 火焰和烟雾的训练图像数据集_游戏开发者是烟雾和镜子的大师
  7. mysql 主从同步-读写分离
  8. 信息学奥赛一本通 1056:点和正方形的关系 | OpenJudge NOI 1.4 18
  9. 从零开始学 Web 之 ES6(三)ES6基础语法一
  10. 70进货卖100利润是多少_服装批发利润大揭秘!让你拿货砍价心里有个底
  11. (篇五)C语言水仙花数的花样求法
  12. 数学建模matlab实验报告,数学建模实验.doc
  13. 递归算法在生成树型结构中,几乎完全属于无稽的算法
  14. CONSUL install 和启动
  15. 【三维路径规划】基于matlab蚁群算法无人机三维路径规划【含Matlab源码 1278期】
  16. 使用matlab计算并绘制连续信号的傅里叶变换
  17. UE4官方文档阅读笔记——蓝图可视化编程
  18. cdr 表格自动填充文字_cdr中看似简单的小工具,你真的会用吗?
  19. 服务器硬盘上面的12gb和6gb的区别,4GB和6GB有什么区别?看完千万别买错,已有多人后悔!...
  20. 海康摄像机接入NVR后怎么会自动变成H.265

热门文章

  1. Android高德地图隐藏Logo(7.4以后)
  2. Python面向对象设计:对象与类,继承————以大鱼吃小鱼为例
  3. 为什么Scrum赢了
  4. tomcat最大线程数、最大等待数和最大连接数
  5. SRS 实战 GB28181 流媒体服务解决方案
  6. [转]一些摄影的入门技巧和建议
  7. JMX自定义MXBean
  8. oracle创建表空间出错的原因和解决办法
  9. mysql hql查询语句_查询hql语句
  10. JavaScript 日期格式化