手工推进oracle scn方式(2)通过修改控制文件推进scn
其实该方式可以理解为bbed修改数据文件头重建控制文件的另外一种方式,直接修改控制文件。生产库敬请谨慎变更!
该方式的要点,
1.定位控制文件的scn位置
2.修改scn以及check sum
3.重启DB确认修改成功
1.数据库当前的SCN号
SQL> select file#,checkpoint_change#,last_change# from v$datafile; FILE# CHECKPOINT_CHANGE# LAST_CHANGE# ---------- ------------------ ------------ 1 507224 507224 2 507224 507224 3 507224 507224 4 507224 507224 SQL> select checkpoint_change# from v$database; CHECKPOINT_CHANGE# ------------------ 507224 SQL> select to_char('507224','xxxxxxxxx') from dual; TO_CHAR('5 ---------- 7bd58
2.用ue打开控制文件
通过07bd58定位当前scn所在的块为00048000H,偏移量为60的行的第9个字节开始到11个字节之间;flag为该块第一行偏移量为15的0x04;checksum为该块第二行的offset 16,17的0x6682
这里将scn推进1个g,总的scn为1024*1024*1024+507224=1074249048,转化为16进制为如下
SQL> select to_char('1074249048','xxxxxxxxx') from dual; TO_CHAR('1 ---------- 4007bd58
在UE修改控制文件将checksum以及flag清0,将scn变更为0x004007bd58,变更后的控制文件为如下图:
重启数据库验证
SQL> shutdown immediate ORA-01109: database not open Database dismounted. ORACLE instance shut down. SQL> startup mount ORACLE instance started. Total System Global Area 436207616 bytes Fixed Size 1267908 bytes Variable Size 125830972 bytes Database Buffers 301989888 bytes Redo Buffers 7118848 bytes Database mounted.
检查修改后的SCN,已经变为我们要修改的SCN号了^@^
SQL> select checkpoint_change# from v$database; CHECKPOINT_CHANGE# ------------------ 1074249048 SQL> alter database open; Database altered.
在生产库上请慎重,该方式风险比较大。