




















在Oracle数据库运维过程中,当数据库出现ORA-600 [2662]等SCN不一致错误且无可用日志时,在数据库处于mount状态下可尝试推进SCN的方法进行恢复。这是一种非常规的数据库恢复手段,需要谨慎操作。
在深入探讨推进SCN的方法之前,先简单回顾一下SCN的核心概念。
SCN(System Change Number)是Oracle数据库中用于标识事务顺序和时间戳的重要机制,它是一个单调递增的数字,在数据库内部以48位存储,分为两部分:
其计算公式为:
SCN = (SCN_WRAP * 4294967296) + SCN_BASE
或
SCN = SCN_WRAP * power(2,32) + SCN_BASE
SCN在数据库中起着至关重要的作用,用于确保数据的一致性、可恢复性以及读一致性等。例如,在数据库恢复过程中,SCN用于确定哪些数据块需要恢复以及恢复到哪个时间点的状态。
使用隐含参数_minimum_giga_scn增加SCN
适用场景: 与event 10015类似,在数据库mount状态下,用于解决SCN相关的一致性问题。
操作步骤:
_minimum_giga_scn=n,其中n为要增加的SCN值(单位为10亿)注意事项: 在2012年1月后的PSU中,由于引入了隐含参数_external_scnrejection_threshold_hours,导致_minimum_giga_scn和10015事件失效。
说明: 其中1为增进SCN 10亿(1 billion)(1024 * 1024 * 1024),通常Level 1已经足够,也可根据实际情况适当调整。
使用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)
recover database;
alter database open;
说明: 通常Level 1已经足够,也可根据实际情况适当调整。
适用场景: 适用于Linux系统下的各种Oracle版本,在数据库mount和open状态下均可操作。
操作步骤:
yum install gdb -y命令安装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屏蔽了该方法。
适用场景: 适用于12.2及以上版本,且数据库需要安装21307096补丁。
操作步骤:
修改EVENT:在参数文件中添加event="21307096 trace name context forever, level 3"
lowest_scn + event level * 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的时间就会很长。
耗时计算:
level1 Elapsed: 00:01:02.35
level2 Elapsed: 00:02:16.23
level6 Elapsed: 00:06:08.05
通用公式:基于16k per second的scn rate (16K/sec),open resetlogs时间至少为(event level * 1000000 / 16000)秒。
- level1至少需要62+秒
- level4095需要71+小时!
在进行任何推进SCN的操作之前,务必对数据库进行完整备份。因为这些操作属于非常规恢复手段,可能会对数据库数据的一致性和完整性造成潜在影响,如果操作失误,备份是恢复数据的最后保障。
尽量在与生产环境相同配置的测试环境中进行测试操作,熟悉操作流程和可能出现的问题,评估推进SCN对数据库的影响,确保在生产环境中操作时能够准确、快速地应对各种情况。
不同版本的Oracle数据库在推进SCN的方法上可能存在差异,部分方法可能因版本更新而失效。在选择推进方法时,一定要根据数据库的具体版本进行判断,避免使用不适用的方法导致问题进一步恶化。
推进SCN是一项专业性很强的操作,需要对Oracle数据库的内部机制有深入的理解。非专业人员请勿轻易尝试,建议由经验丰富的数据库管理员(DBA)执行。
在完成推进SCN的操作后,要对数据库进行全面的验证,包括:
SCN推进是Oracle数据库恢复中的重要技术手段,但属于高风险操作。在实际应用中,应严格遵循以下原则:
通过本文的介绍,希望能帮助数据库管理员更好地理解和掌握SCN推进技术,在遇到相关问题时能够做出正确的判断和处理。
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。