使用ORACDEBUG 修改 数据库SCN

联系:QQ(5163721)

标题:使用ORACDEBUG 修改 数据库SCN

作者:Lunar©版权所有[文章允许转载,但必须以链接方式注明源地址,否则追究法律责任.]

之前有一些简单介绍SCN的文章:
浅谈SCN_1–从oracle7至今,如何获取scn
浅谈SCN_2–_kcmgas_函数
通过修改控制文件来修改SCN

1988年Oracle发布了Oracle V6,这一版本中Oracle引入了热备的操作,同时SCN使用48位存储的算法写死在代码中,一直沿用至12c以前(12c开始使用8个bytes存储SCN)。由于ORACLE的SCN是由48位来表示的,因此最大值不能超过2的48次方
Oracle为了确保48位的SCN能够用足够长的时间(500年),于是对SCN做出了一个限制,就是每秒钟SCN最大增长不能超过16K,Oracle从1988年1月1日0点0分0秒为基准时间,到当前的秒钟数乘以16K,就是当前SCN的最大允许值这就是SCN HEADROOM。
因此SCN天花板 的计算公式就类似于:
(当前时间-19880101 000000)*16384–(current_scn),其中 16384是SCN的内部增长速度16k,这是代码中的硬限制。
这个限制在11.2.0.2版本之前,scn 的最大增长频率是16k,在11.2.0.2版本开始,为32k。
此行为是受到下面参数_max_reasonable_scn_rate控制的:

SQL> @paras
Enter value for paras: scn
old   6: AND x.ksppinm LIKE '%&paras%'
new   6: AND x.ksppinm LIKE '%scn%'

NAME                                               VALUE                DESCRIB
-------------------------------------------------- -------------------- ------------------------------------------------------------
。。。。。。。
_external_scn_rejection_threshold_hours            24                   Lag in hours between max allowed SCN and an external SCN
_max_reasonable_scn_rate                           32768                Max reasonable SCN rate
。。。。。

17 rows selected.

SQL> 

在11.2中,Oracle除了将SCN 每秒最大的增长量从16K加大为32K,还引入了一个阀值,用于阻断有SCN HEADROOM问题的系统将故障传播到其他系统。
这些修复包含在下列补丁中:


1


如果SCN发生突增的情况,alert中就会出现类似下面的告警:


2


因此,打了这上面这些补丁后,就不能使用以前的参数直接修改SCN了。

然后,有时候数据库遇到一些异常错误,还是需要将SCN推进的到一个合适的值,例如,常见一些错误造成数据库的部分block跟数据库SCN不一致,或者一些有undo$数据库启动时引导失败:
ORA-600 [2256]
ORA-600 [2662]
ORA-600 [4000]
ORA-600 [kcsadjn1]


在以前我们使用参数来修改SCN,例如:
event=”10015 trace name adjust_scn level x” 或者使用 _minimum_giga_scn 参数
正如上面说的,应用了上面的补丁或者版本后,上述2种该参数的方法,就不能用来推进SCN了,这时,我们可以使用另外的几种方法:
1,bbed直接修改(这个需要看情况,有些时候比较麻烦,比如需要修改的文件很多)
2,使用ORACDEBUG 修改 kcsgscn
3,修改控制文件
这里就测试“使用ORACDEBUG 修改 kcsgscn”的方法。
注意: 不同的ENDIAN和字长不同,比如AIX是WRAP SCN在前,BASE SCN在后,而Linux是BASE SCN在前,WRAP SCN在后的格式


当前数据库的SCN

[oracle@lunar ~]$ ss

SQL*Plus: Release 11.2.0.4.0 Production on Tue Aug 5 06:16:39 2014

Copyright (c) 1982, 2013, Oracle.  All rights reserved.


Connected to:
Oracle Database 11g Enterprise Edition Release 11.2.0.4.0 - 64bit Production
With the Partitioning, Automatic Storage Management, OLAP, Data Mining
and Real Application Testing options

SQL> 
SQL> select checkpoint_change#,to_char(checkpoint_change#,'XXXXXXXXXXXXXXXXX')  from v$database;

CHECKPOINT_CHANGE# TO_CHAR(CHECKPOINT
------------------ ------------------
           1723797             1A4D95

SQL>

这里看到当前数据库SCN为1723797,这个测试我们把当前数据库的SCN(1723797)增加100万,即2723797。

SQL> oradebug setmypid
Statement processed.
SQL> oradebug dumpvar sga kcsgscn_
kcslf kcsgscn_ [06001AE70, 06001AEA0) = 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 6001AB50 00000000
SQL> select checkpoint_change#,to_char(checkpoint_change#,'XXXXXXXXXXXXXXXXX')  from v$database;

CHECKPOINT_CHANGE# TO_CHAR(CHECKPOINT
------------------ ------------------
           1723797             1A4D95

SQL>

因为数据库是mount状态,因此这里看到kcsgscn_中SCN的值是0。

下面我们修改为2723797,计算一下:

SQL> select to_char(2723797,'XXXXXXXXXXXXXXXX') from dual;

TO_CHAR(2723797,'
-----------------
           298FD5

SQL> oradebug setmypid
Statement processed.
SQL> oradebug dumpvar sga kcsgscn_
kcslf kcsgscn_ [06001AE70, 06001AEA0) = 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 6001AB50 00000000
SQL> oradebug poke 0x06001AE70 8 0x0000000000298FD5 
BEFORE: [06001AE70, 06001AE78) = 00000000 00000000
AFTER:  [06001AE70, 06001AE78) = 00298FD5 00000000
SQL> oradebug dumpvar sga kcsgscn_
kcslf kcsgscn_ [06001AE70, 06001AEA0) = 00298FD5 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 6001AB50 00000000
SQL> 
SQL> alter database  open;

Database altered.

SQL>  select checkpoint_change#,checkpoint_change#/1024/1024/1024 SCN_WARP  from v$database;

CHECKPOINT_CHANGE#   SCN_WARP
------------------ ----------
           2723798 .002536735

SQL> 

这里看到数据库SCN已经修改成了2723797

此条目发表在 backup&recovery, Internal 分类目录,贴了 标签。将固定链接加入收藏夹。

发表评论

电子邮件地址不会被公开。 必填项已用 * 标注