共计 2620 个字符,预计需要花费 7 分钟才能阅读完成。
环境:RHEL 6.5(x86-64) + Oracle 11.2.0.4
声明: 推进 SCN 属于非常规恢复范畴,不建议非专业人员操作,否则后果自负。
需求: 我这里演示下推进 SCN 10W 数量级,实际需求推进多少可以根据 ORA-600 [2662] [a] [b] [c] [d] [e] 具体值来确认。
ARGUMENTS:
Arg [a] Current SCN WRAP
Arg [b] Current SCN BASE
Arg [c] dependent SCN WRAP
Arg [d] dependent SCN BASE
Arg [e] Where present this is the DBA where the dependent SCN came from.
更多详情可参考:ORA-600 [2662] “Block SCN is ahead of Current SCN” (文档 ID 28929.1)
- 1. 查看当前数据库的 Current SCN
- 2. 重新启动数据库到 mount 阶段
- 3. 使用 oradebug poke 推进 SCN
- 4. 补充实际计算推进 SCN 的方法
1. 查看当前数据库的 Current SCN
SYS@orcl> select current_scn||'' from v$database;
CURRENT_SCN||''
--------------------------------------------------------------------------------
4563483988
可以看到当前 SCN 是 4563483988,我现在想推进 SCN,在 10w 级别,也就是 4563483988 标红数字修改为指定值。
2. 重新启动数据库到 mount 阶段
重新启动数据库到 mount 阶段:
SYS@orcl> shutdown abort
ORACLE instance shut down.
SYS@orcl> startup mount
ORACLE instance started.
Total System Global Area 1235959808 bytes
Fixed Size 2252784 bytes
Variable Size 788529168 bytes
Database Buffers 436207616 bytes
Redo Buffers 8970240 bytes
Database mounted.
3. 使用 oradebug poke 推进 SCN
我这里直接把十万位的 ”4″ 改为 ”9″ 了,相当于推进了 50w 左右:
说明:实验发现 oradebug poke 推进的 SCN 值,既可以指定十六进制的 0x11008DE74,也可以直接指定十进制的 4563983988。
SYS@orcl> oradebug setmypid
Statement processed.
SYS@orcl> oradebug dumpvar sga kcsgscn_
kcslf kcsgscn_ [06001AE70, 06001AEA0) = 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 6001AB50 00000000
SYS@orcl> select to_char(checkpoint_change#, 'XXXXXXXXXXXXXXXX') from v$database;
TO_CHAR(CHECKPOINT_CHANGE#,'XXXXXX
----------------------------------
110013C41
SYS@orcl> oradebug poke 0x06001AE70 8 4563983988
BEFORE: [06001AE70, 06001AE78) = 00000000 00000000
AFTER: [06001AE70, 06001AE78) = 1008DE74 00000001
SYS@orcl> oradebug dumpvar sga kcsgscn_
kcslf kcsgscn_ [06001AE70, 06001AEA0) = 1008DE74 00000001 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 6001AB50 00000000
SYS@orcl> alter database open;
Database altered.
SYS@orcl> select current_scn||'' from v$database;
CURRENT_SCN||''
--------------------------------------------------------------------------------
4563984271
可以看到已经成功将 SCN 推进到 4563983988,SCN 不断增长,所以这里查到的值略大一些。
4. 补充实际计算推进 SCN 的方法
本文在 2018-12-16 进一步补充说明:
在实际这类工作中,我们实际应该是要认真计算好需要推进 SCN 的值,而不应图省事直接给一个很大的值。后者不但是技术水平不成熟的表现,而且是不负责任的行为。
--ORA-00600: internal error code, arguments: [2662], [2], [1424107441], [2], [1424142235], [8388617], [], []
select 2*power(2,32)+1424142235 from dual;
10014076827
--ORA-00600: internal error code, arguments: [2662], [2], [1424142249], [2], [1424142302], [8388649], [], []
select 2*power(2,32)+1424143000 from dual;
10014077592
总结公式:c * power(2,32) + d {+ 可适当加一点,但不要太大!}
c 代表:Arg [c] dependent SCN WRAP
d 代表:Arg [d] dependent SCN BASE
oradebug setmypid
oradebug dumpvar sga kcsgscn_
oradebug poke 0x060012658 8 10014077592
oradebug dumpvar sga kcsgscn_
alter database open;
最后要说的是,做事情还是多考虑些,在非常规恢复中也能温柔的去推进 SCN,高级 DBA 的价值从细节上体现。