一、SCN 推进的适用场景:
当数据库出现 ORA - 600 [2662]
等 SCN
不一致错误且无可用日志时,在数据库处于 mount
状态下可尝试此方法。

二、SCN 的基本概念
在深入探讨推进 SCN 的方法之前,先简单回顾一下 SCN 的概念。SCN 是 Oracle 数据库中用于标识事务顺序和时间戳的重要机制,它是一个单调递增的数字,在数据库内部以 48 位存储,分为两部分:低 32 位为 SCN_BASE ,高 16 位为 SCN_WRAP 。
其计算公式为:SCN = (SCN_WRAP * 4294967296) + SCN_BASE 。 或SCN = SCN_WRAP * power(2,32) + SCN_BASE 。
SCN 在数据库中起着至关重要的作用,用于确保数据的一致性、可恢复性以及读一致性等。例如,在数据库恢复过程中,SCN 用于确定哪些数据块需要恢复以及恢复到哪个时间点的状态。
二、不同版本常用的 SCN 推进方法
2.1 11.2.0.4 之前的版本推进 scn 方法
使用隐含参数_minimum_giga_scn 增加 SCN
适用场景 :与 event 10015 类似,在数据库 mount 状态下,用于解决 SCN 相关的一致性问题。
操作步骤 :在参数文件中添加或修改_minimum_giga_scn=n ,其中 n 为要增加的 SCN 值(单位为 10 亿),然后重启数据库至 mount 状态。
注意事项 :在 2012 年 1 月后的 PSU 中,由于引入了隐含参数_external_scnrejection_threshold_hours ,导致_minimum_giga_scn 和 10015 事件失效。-- 其中1 为增进SCN 10 亿 (1 billion) (1024 * 1024 * 1024) ,通常Level 1 已经足够,也可根据实际情况适当调整


2.2 11.2.0.4 版本推进 scn 方法
使用 event 10015 增加 SCN
操作步骤:startup mount;alter session set events '10015 trace name adjust_scn level 1';--
其中level 1
为增进SCN 10
亿 (1 billion) (1024 * 1024 * 1024)
,通常Level 1
已经足够,也可根据实际情况适当调整recover database;alter database open;
2.3 12c/19c
版本
1、gdb/dbx 直接修改内存中的值
适用场景 :适用于 Linux 系统下的各种 Oracle 版本,在数据库 mount 和 open 状态下均可操作。 操作步骤:
安装 gdb 工具 :如果系统未安装,可通过yum install gdb -y 命令安装。 查看当前 SCN 值:SQL> select current_scn, to_char(current_scn, 'XXXXXXXXXX') as scn_hex from v$database;CURRENT_SCN SCN_HEX----------- ----------- 1375762 14FE12 目标SCN :select 1375762 + 1000000 as target_scn, to_char(1375762 + 1000000, 'XXXXXXXXXX') as target_hex from dual;TARGET_SCN TARGET_HEX---------- ----------- 2375762 244052 (重点记录此值) 确定 SCN BASE 内存地址:SQL> oradebug setmypid; Statement processed.SQL> oradebug dumpvar sga kcsgscn; kcslf kcsgscn_ [ 06001AE70, 06001AEA0) = 0014FE19 00000000 00000000 00000000 000001DB 00000000 00000000 00000000 00000000 00000000 6001AB50 00000000 输出中 06001AE70 是 SCN BASE 内存地址 (重点记录此地址) 。
使用 gdb
修改内存值
:[root@rac01 ~]# yum install gdb -y[root@rac01 ~]# ps -ef | grep pmonoracle
9404 1 0 12:09 ? 00:00:00 ora_pmon_localdb[oracle@rac01 ~]$ gdb $ORACLE_HOME/bin/oracle
9404(gdb) set *((unsigned int *)
0x000000006001AE70) =
0x244052(gdb) quitA debugging session is active. Inferior 1 [process 9404] will be detached.Quit anyway? (y or n) yDetaching from program: /u01/app/product/11.2.0/db_1/bin/oracle, process 9404
2、
使用 oradebug poke 直接修改内存中的值
适用场景
:适用于
12.2
以下版本,在数据库
OPEN
或者
MOUNT
状态都可以修改。
操作步骤:SQL> select current_scn, to_char(current_scn, 'XXXXXXXXXX') as scn_hex from v$database;CURRENT_SCN SCN_HEX----------- ----------- 2376909 2444CDSQL> select 2376909 + 1000000 as target_scn, to_char(2376909 + 1000000, 'XXXXXXXXXX') as target_hex from dual;TARGET_SCN TARGET_HEX---------- ----------- 3376909
33870D(
重点记录
)SQL> oradebug setmypid; Statement processed.SQL> oradebug dumpvar sga kcsgscn;kcslf kcsgscn_ [
06001AE70, 06001AEA0) = 002444D2 00000000 00000000 00000000 000005B1 00000000 00000000 00000000 00000000 00000000 6001AB50 00000000
06001AE70
此值重点记录 SQL> oradebug poke
0x06001AE70 4
0x33870D;BEFORE: [06001AE70, 06001AE74) = 00244570AFTER: [06001AE70, 06001AE74) = 0033870D

注意事项 :12.2 以上版本 ORACLE 屏蔽了该方法。
3、使用新的 EVENT 21307096 增加 SCN 的值
适用场景
:适用于
12.2
及以上版本,且数据库需要安装
21307096
补丁。
操作步骤:

修改 EVENT :在参数文件中添加event="21307096 trace name context forever, level 3" ,其中 level 的值表示 SCN 的增量,范围是 1 到 4095 ,增量计算公式为lowest_scn + event level * 1000000 。例如,如果数据库中最低的数据文件检查点 SCN 为 990396 ,最高为 992660 ,则 SCN delta 为 1 ,由(992660 - 990396) / 1000000 计算得出 。
关库,使用更改后的pfile
启动
SQL> recover database using backup controlfile until cancel;SQL> alter database open resetlogs;SQL> select current_scn from v$database;

注意事项 : 此方法不是直接修改 SCN 的值,而是通过数据库自动增加的机制来实现 SCN 的增加 , 每秒增加 16K ,如果 LEVEL 设置很大,那么数据库 open 的时间就会很长。
根据LEVEL值不一样,数据库OPEN耗时也不一样,计算公式:
|
三、 注意事项与风险提示
1、 数据备份:在进行任何推进 SCN 的操作之前,务必对数据库进行完整备份。因为这些操作属于非常规恢复手段,可能会对数据库数据的一致性和完整性造成潜在影响,如果操作失误,备份是恢复数据的最后保障。
2、测试环境优先:尽量在与生产环境相同配置的测试环境中进行测试操作,熟悉操作流程和可能出现的问题,评估推进 SCN 对数据库的影响,确保在生产环境中操作时能够准确、快速地应对各种情况。
3. 版本兼容性:不同版本的 Oracle 数据库在推进 SCN 的方法上可能存在差异,部分方法可能因版本更新而失效。在选择推进方法时,一定要根据数据库的具体版本进行判断,避免使用不适用的方法导致问题进一步恶化。
4. 操作专业性:推进 SCN 是一项专业性很强的操作,需要对 Oracle 数据库的内部机制有深入的理解。非专业人员请勿轻易尝试,建议由经验丰富的数据库管理员(DBA)执行。
5. 后续验证:在完成推进 SCN 的操作后,要对数据库进行全面的验证,包括数据的一致性、完整性,以及应用系统对数据库的访问是否正常等。例如,可以通过运行一些关键的业务查询和事务处理来检查数据库是否恢复到正常可用状态。
编辑推荐:
相关推荐
-
雷神推出 MIX PRO II 迷你主机:基于 Ultra 200H,玻璃上盖 + ARGB 灯效
2 月 9 日消息,雷神 (THUNDEROBOT) 现已宣布推出基于英
-
制造商 Musnap 推出彩色墨水屏电纸书 Ocean C:支持手写笔、第三方安卓应用
2 月 10 日消息,制造商 Musnap 现已在海外推出一款 Oce
热文推荐
- Oracle SCN 手工推进:各版本适用方法及操作指南
Oracle SCN 手工推进:各版本适用方法及操作指南
26-03-03 - 【Oracle 19c RPM安装】测试
【Oracle 19c RPM安装】测试
26-03-03 - Oracle 19.28补丁发布后,写了个自动化脚本,100套DB布丁升级半天搞定
- Oracle报错“system01.dbf需要更多的恢复来保持一致性”如何恢复数据?
- 以 “探” 为名:12 年 Oracle DBA 的数据库问题拆解与成长
以 “探” 为名:12 年 Oracle DBA 的数据库问题拆解与成长
26-03-03 - Oracle数据恢复—Oracle数据库所在分区被删除后如何恢复数据库数据?
- Oracle Direct Path Read优化
Oracle Direct Path Read优化
26-03-03 - 那个从大城市打工回来的发小,现在自称主理人
那个从大城市打工回来的发小,现在自称主理人
26-03-03 - Oracle MCP本地部署测试
Oracle MCP本地部署测试
26-03-03 - 临时统计 SQL 的 “暗礁”:ORA-00600 [xtydty2ldi] 排查实录
