一、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 pmon

oracle 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) quit

A debugging session is active.

Inferior 1 [process 9404] will be detached.

Quit anyway? (y or n) y

Detaching 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 2444CD

SQL> 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) = 00244570

AFTER: [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耗时也不一样,计算公式:

level 1 Elapsed: 00:01:02.35

level 2 Elapsed: 00:02:16.23

level 6 Elapsed: 00:06:08.05

In general: based on a 16k per second scn rate (16K/sec) , the open resetlogs time

would be at least (event level * 1000000 / 16000) seconds. Then level 1 would be at least

62+ seconds and level 4095 would be 71+ hours !

三、 注意事项与风险提示

1、 数据备份:在进行任何推进 SCN 的操作之前,务必对数据库进行完整备份。因为这些操作属于非常规恢复手段,可能会对数据库数据的一致性和完整性造成潜在影响,如果操作失误,备份是恢复数据的最后保障。

2、测试环境优先:尽量在与生产环境相同配置的测试环境中进行测试操作,熟悉操作流程和可能出现的问题,评估推进 SCN 对数据库的影响,确保在生产环境中操作时能够准确、快速地应对各种情况。

3. 版本兼容性:不同版本的 Oracle 数据库在推进 SCN 的方法上可能存在差异,部分方法可能因版本更新而失效。在选择推进方法时,一定要根据数据库的具体版本进行判断,避免使用不适用的方法导致问题进一步恶化。

4. 操作专业性:推进 SCN 是一项专业性很强的操作,需要对 Oracle 数据库的内部机制有深入的理解。非专业人员请勿轻易尝试,建议由经验丰富的数据库管理员(DBA)执行。

5. 后续验证:在完成推进 SCN 的操作后,要对数据库进行全面的验证,包括数据的一致性、完整性,以及应用系统对数据库的访问是否正常等。例如,可以通过运行一些关键的业务查询和事务处理来检查数据库是否恢复到正常可用状态。