环境:OEL 5.7 + Oracle 10.2.0.5

背景:Oracle发布的两篇关于2019年6月份将自动调整高版本数据库的SCN COMPATIBILITY的MOS文章引起了很多客户的恐慌,尤其是起初Oracle对10g版本未提供任何补丁。我这里结合业界多位Oracle ACE专家的系列文章,在自己的实验环境做了系列验证总结。

1.什么都不做会怎样?

结合多位专家的结论:

Oracle 将会在 2019 年 6 月 23 日后自动调整高版本的数据库 SCN COMPATIBILITY 为 3,调整之后,这些数据库内部的 SCN 上限增速会变成 96k, 从而可能出现超出低版本的 SCN 的情况,如果发生这种情况,将会导致低版本数据库无法与高版本通过 DB Link 进行连接。

具体解释下,这里所说的高版本,可以理解为是:11.2.0.4及以上版本,同时也包含其他低于此版本但有补丁可以应用修正的版本;

而低版本就是剩下的版本。

也就是说:如果确认环境内没有所谓的高版本,理论是可以什么都不做的。但是如果你不能保证未来生产环境内不会创建新的高版本且有dblink连接交互,就不能一直坐视不管。

2.最简单的做法是啥?

这个要看你的实际情况。
**2.1 无需关注**
如果你的环境全是高版本,或全是低版本,且未来不会有变化,那自然无需关注。

2.2 禁用高版本的自动调整

如果你的环境绝大部分都是低版本,只有个别的高版本,可以考虑将高版本的SCN自动调整禁用掉:

begin
DBMS_SCN.DISABLEAUTOROLLOVER;
end;
/

如果是在2019年6月以后安装的新的高版本,默认就是SCN COMPATIBILITY 为 3,这就需要在mount状态调低兼容性:

ALTER DATABASE SET SCN COMPATIBILITY 1;

或者最一劳永逸的做法是,将所有低版本都应用补丁或是升级,弊端就是这个工作量很可能是巨大的。

2.3 低版本应用补丁或升级

如果你的环境绝大部分是高版本,只有个别的低版本,可以考虑将低版本进行补丁应用或升级(没有补丁的版本只能升级版本)

另外需要特殊说明的是,针对生产上占比比较高的10g稳定版本:10.2.0.5,也就是本文标题的这个版本。最开始Oracle是没有提供补丁的,但后来Oracle迫于广大10.2.0.5用户的压力,已经为这个版本提供了对应的补丁。但官方给出的列表是:应用PSU171017的基础上再应用这个SCN补丁14121009。

DATABASE PATCH SET UPDATE 10.2.0.5.171017 and Patch 14121009 [**requires extended support]

<Patch 26493118> and <Patch 14121009> [WIP] ** requires extended support

但是PSU171017是需要扩展支持服务才可以有权下载,普通权限的MOS无法下载,这对于国内大部分客户都是相当于没有的。好在我们通过搜索测试发现,这个14121009的scn补丁对于10.2.0.5.12版本也有提供,经测试可以解决问题,而10.2.0.5.12的PSU普通MOS用户就可以下载的到。

补丁程序14121009: PLACEHOLDER ENHANCEMENT REQUEST FOR PROJECT ID 40828
先决条件补丁程序
16619894 DATABASE PATCH SET UPDATE 10.2.0.5.12 (INCLUDES CPUJUL2013)

所以对于10.2.0.5版本,可以应用10.2.0.5.12的PSU,再应用14121009的SCN补丁即可解决问题,无需升级大版本。

细节补充:10.2.0.5的库,如果没有打任何PSU补丁,是没有"_external_scn_rejection_threshold_hours"这个隐藏参数的。应用10.2.0.5.12 PSU:p16619894_10205_Linux-x86-64.zip后,就引入了"_external_scn_rejection_threshold_hours"这个隐藏参数,且默认值为24:

NAME                                                    DESCRIPTION                                                        VALUE
------------------------------------------------------- ------------------------------------------------------------------ ------------------------------
_external_scn_rejection_threshold_hours Lag in hours between max allowed SCN and an external SCN 24

但此时还不能调整SCN COMPATIBILITY,需要继续应用p14121009_1020512_Linux-x86-64.zip这个SCN补丁后,才可进行调整:

--开库状态只能调高,调低需要在mount状态下:
ALTER DATABASE SET SCN COMPATIBILITY 1;
ALTER DATABASE SET SCN COMPATIBILITY 2;
ALTER DATABASE SET SCN COMPATIBILITY 3;

而对于比10.2.0.5更低的版本,截止目前依然是没有补丁提供,就只能通过升级来解决。

3.常用查询验证方法

Oracle ACE 盖国强和罗海雄老师在很多相关文章中提供了一些常用的查询验证方法,实际测试很好用,具体查询语句如下:
**3.1 确认数据库版本高低**
一个检查当前数据库究竟是高版本还是低版本的简单方法,就是去看数据库是否包含dbms_scn这个包,包含就是高版本,反之就是低版本(这样低版本通过补丁应用或升级后,也可以通过这个查询去判断是否修补成功):

select count(*) from dba_objects
where
owner = 'SYS' and object_name ='DBMS_SCN' and object_type='PACKAGE BODY';

3.2 检查SCN的状态

应用补丁或者在高版本数据库中可以查询SCN的状态:

--check your scn status
set serverout on
declare
v_autorollover_date date;
v_target_compat number;
v_RSL number;
v_hr_in_scn number;
v_hr_in_sec number;
v_t4 number;
v_max_cmpat number;
v_isenabled boolean;
v_current_compat number;
begin
dbms_scn.GETCURRENTSCNPARAMS(
v_RSL,v_hr_in_scn,v_hr_in_sec,v_current_compat,v_max_cmpat);
dbms_scn.GETSCNAUTOROLLOVERPARAMS(
v_autorollover_date,v_target_compat,v_isenabled);
dbms_output.put_line('Current SCN compatibility:'||v_current_compat);
dbms_output.put_line('Current SCN RATE:'||round((v_hr_in_scn/v_hr_in_sec)/1024)||'k');
if(v_isenabled) then
dbms_output.put_line('AUTO SCN compatibility rollover is ENABLED!!!');
dbms_output.put_line('AUTO rollover time:'||to_char(v_autorollover_date,'YYYY/MM/DD'));
dbms_output.put_line('AUTO rollover target value:'||v_target_compat );
else
dbms_output.put_line('AUTO SCN compatibility rollover is DISABLED!!!');
end if;
end;
/

查询结果类似如下:

Current SCN compatibility:1
Current SCN RATE:16k
AUTO SCN compatibility rollover is ENABLED!!!
AUTO rollover time:2019/06/23
AUTO rollover target value:3 PL/SQL procedure successfully completed.

3.3 查询当前最大合理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。

4.总结

这段关于SCN的风波引起了不少客户的过度恐慌,实际上最本质的还是要理解Oracle的本质,明白了其中原理,才可以防患于未然,做到心中不慌。
我使用免费的bethune巡检发现(版本:2.2.6),可以对SCN有更细致的安全检查:

--测试环境第一次巡检发现:
当前数据库中已存在 SCN 升级逻辑,当前的 SCN 每秒增长上限为 32768 (来源于参数 _max_reasonable_scn_rate), 并未启动 SCN 版本自动升级,需要时时关注 SCN Headroom 的增长情况,必要时及时升级 SCN 版本。
2018-12-26 21:20:18 15184372089397 800.3 --非常规手段将测试环境的SCN 推进到16316960000000,再次巡检发现:
截至数据采集时,当前数据库的 SCN 增长速度过快,当前 Headroom 为 .2 天,不足 10 天,当前数据库并没有对应的 SCN 升级补丁,可能会在未来(2019 年 6 月之后)运行过程中出现 SCN 相关问题。
2018-12-26 21:29:08 16316960000074 0.2

不过测试发现,在10.2.0.5版本,即使我应用了PSU和对应的SCN补丁,再次巡检还是提示没有对应SCN升级补丁,这可能是工具还没有考虑到10.2.0.5这种应用补丁的方式:

--DATABASE PATCH SET UPDATE 10.2.0.5.12 + 14121009补丁
截至数据采集时,当前数据库的 SCN 增长速度过快,当前 Headroom 为 .3 天,不足 10 天,当前数据库并没有对应的 SCN 升级补丁,可能会在未来(2019 年 6 月之后)运行过程中出现 SCN 相关问题。
2018-12-26 23:24:22 16316960012451 0.3

引起这一波用户恐慌的MOS文章:

  • Recommended patches and actions for Oracle databases versions 12.1.0.1, 11.2.0.3 and earlier – before June 2019 (文档 ID 2361478.1)
  • Recommended patching and actions for Oracle database versions 12.1.0.1, 11.2.0.3 and earlier - before June 2019 (文档 ID 2335265.1)

关于Oracle 10.2.0.5 版本应用SCN补丁14121009相关问题的更多相关文章

  1. 在 ubuntu 【6.06、6.10】 上安装 oracle 10.2.0.1,并打补丁 10.2.0.5

    特点: ubuntu 6.06.6.10 算是很古老的ubuntu了,其应该是基于 debian 4 的 tesing/unstable 分支.所以,毛病较多. 如何安装oracle10g? 几个技术 ...

  2. Linux下Oracle 10.2.0.1升级到10.2.0.4总结

    最近部署测试环境时,将测试环境ORACLE数据库从10.2.0.1升级到了10.2.0.4,顺便整理记录一下升级过程. 实验环境: 操作系统:Oracle Linux Server release 5 ...

  3. 单实例dg软件从10.2.0.4版本安装至10.2.0.5.12

    DG环境搭建需求,因此安装与主库相同的软件版本 1.主库软件版本10.2.0.5.12 2dg环境提供的是全新的10.2.0.4.0 3.安装步骤,安装10.2.0.5 静默安装 psu安装10.2. ...

  4. RAC分解步骤之一,在oracle linux 4u4上安装oracle 10.2.0.1.0操作日志

    练习oracle的rac组建过程,第一步,先练习4u4上安装oracle 10.2.0.1.0.直接安装rac,有些难度.从简单的做起.总RAC步骤,参照小布老师的RAC组建. 1. 启动vc,登陆v ...

  5. Deploy Oracle 10.2.0.5 DataGuard on Red Hat Enterprise Linux 6.4

    系统:Red Hat Enterprise Linux 6.4 数据库:Oracle 10.2.0.5.0 Patch Set 4 主机:10dg1 192.168.1.91 10dg2192.168 ...

  6. 示例Oracle 10.2.0.1.0升级到10.2.0.4.0一例

    1.查看当前系统版本 [oracle@std Disk1]$ sqlplus '/as sysdba' SQL*Plus: Release - Production on Thu Jan :: Cop ...

  7. Oracle 10.2.0.5升级至11.2.0.4

    参照MOS 官方文档Complete Checklist for Manual Upgrade to Oracle Database 11gR2 (11.2) (Doc ID 837570.1)一.升 ...

  8. Oracle 10.2.0.1 精简客户端配置

    装完Ooracle 11g之后客户端sqlplus复制粘贴的时候不太简单,就 用了实验室的老版本10g客户端. 前提服务端装好了,想换一个客户端.11g sql plus也能用. 文件链接: 链接:h ...

  9. Deploy Oracle 10.2.0.5 on Red Hat Enterprise Linux 6.4

    一.Linux系统安装和配置 1.安装系统时选Desktop 2.设置eth0网卡为静态IP,加入子网掩码,网关,DNS.并配置自己主动启动 3.改动/etc/hosts.加入主机名和相应IP 4.禁 ...

随机推荐

  1. 优化实现Mobile/Bumped Diffuse

    在上一篇帖子的基础上增加一张法线贴图即可: Shader "James/Scene/Bumped_Diffuse" { Properties { _MainTex ("B ...

  2. android sdk manager更新地址

    参考:http://www.oschina.net/question/1399261_195245 android sdk 用久了,想更新到最新的SDK包: 大连东软信息学院镜像服务器地址:- htt ...

  3. 解决SVN 每次操作都需要重输入用户名密码问题

    把目录C:\Users\当前账号\AppData\Roaming\Subversion\auth下的文件删除,然后重启hbuilder或eclipse工具,重新输入账号密码之后,保存即可解决该问题.

  4. Android gradle 配置

    gradle https://www.cnblogs.com/qianxudetianxia/p/4948499.html flavor https://blog.csdn.net/user11223 ...

  5. KL divergence

    Kullback-Leibler divergence 形式: 性质: 非负 P=Q时,D[P||Q]=0 不对称性:D(P||Q)≠D(Q||P) 自信息:符合分布 P 的某一事件 x 出现,传达这 ...

  6. adb logcat查看某个进程的输出日志

    adb logcat查看某个进程的输出日志 adb logcat 默认是没有这个功能的,我实现了一个小bash函数,添加到你$HOME/.bashrc 文件中: # 作用:能够通过进程名显示log # ...

  7. Android深入源代码分析理解Aidl总体调用流程(雷惊风)

    2017年開始上班的第一天.老不想工作了,假期感觉还没開始就已经结束了,唉,时间就是这样,新的一年開始了,尽管非常不想干正事,没办法,必须干起来.由于后边的路还非常长,距离六十岁还非常远. 刚上班也没 ...

  8. 我的预约订单页面List

    <%@ page language="java" contentType="text/html;charset=UTF-8"%> <%@ ta ...

  9. centos 7 查询mysql 安装 运行位置

    whereis mysql  安装路径 which mysql 运行文件路径 找到 /usr/bin/mysql 路径 mysql为执行文件,不是文件夹 登陆mysql mysql -u 用户名 -p ...

  10. 【CF660E】Different Subsets For All Tuples 结论题

    [CF660E]Different Subsets For All Tuples 题意:对于所有长度为n,每个数为1,2...m的序列,求出每个序列的本质不同的子序列的数目之和.(多个原序列可以有相同 ...