文章转自:http://hi.baidu.com/asamchen/item/d9f527cd908b3c28a0b50ae5
今天接到一个很变态的要求,需要修改oracle的scn到非常非常大,找了点资料,尝试一下看看:
1.使用强大的oradebug工具,三个命令:oradebug setmypid / oradebug DUMPvar SGA kcsgscn_ / oradebug poke
2. sqlplus '/as sysdba'
1 SQL> select dbms_flashback.get_system_change_number a from dual; 2 3 A 4 5 ---------- 6 7 613517
1 SQL> oradebug setmypid 2 3 Statement processed.
1 SQL> oradebug DUMPvar SGA kcsgscn_ 2 3 kcslf kcsgscn_ [0600122B0, 0600122E0) = 00095C7D 00000000 00000000 00000000 00000047 00000000 00000000 00000000 00000000 00000000 60011F90 00000000 4 5 //做点注释:内存地址从0600122B0开始
1 SQL> select to_char(dbms_flashback.get_system_change_number,'XXXXXXXXXXXX') from dual; 2 3 TO_CHAR(DBMS_ 4 5 ------------- 6 7 95C7D
//这个命令可以帮助确定当前的scn尾数在指定的那几个位置,这里可以确定从B0开始的4位。所以如果要修改得稍微小一点,那么就修改这四位
1 SQL> oradebug poke 0x0600122B0 4 0xffffffff 2 3 BEFORE: [0600122B0, 0600122B4) = 0000ACF0 4 5 AFTER: [0600122B0, 0600122B4) = FFFFFFFF
1 SQL> oradebug DUMPvar SGA kcsgscn_
kcslf kcsgscn_ [0600122B0, 0600122E0) = 0000000D 00000001 00000000 00000000 00000059 00000000 00000000 00000000 00000000 00000000 60011F90 00000000
这里可以看到,修改前面4位成0xffffffff之后,oracle的scn因为一直在往前走,所以直接在第8位进了一位。现在的scn已经比较大了,但是也不是说能够将scn修改成无限大,因为这里有些限制。所以我只尝试修改到14bit的scn,经过如下的修改:
1 SQL> oradebug poke 0x0600122B4 4 0x000009ff 2 3 BEFORE: [0600122B4, 0600122B8) = 00000900 4 5 AFTER: [0600122B4, 0600122B8) = 000009FF
1 SQL> oradebug DUMPvar SGA kcsgscn_ 2 3 kcslf kcsgscn_ [0600122B0, 0600122E0) = 00005252 000009FF 00000000 00000000 0000004A 00000000 00000000 00000000 00000000 00000000 60011F90 00000000
1 SQL> select dbms_flashback.get_system_change_number a from dual; 2 3 A 4 5 ---------------- 6 7 10990821331540
1 SQL> oradebug poke 0x0600122B0 4 0xffffffff 2 3 BEFORE: [0600122B0, 0600122B4) = 00005272 4 5 AFTER: [0600122B0, 0600122B4) = FFFFFFFF
1 SQL> oradebug DUMPvar SGA kcsgscn_ 2 3 kcslf kcsgscn_ [0600122B0, 0600122E0) = 00000001 00000A00 00000000 00000000 00000062 00000000 00000000 00000000 00000000 00000000 60011F90 00000000
1 SQL> select dbms_flashback.get_system_change_number a from dual; 2 3 A 4 5 ---------------- 6 7 10995116277765
这样就修改成功了,但是呢,如果修改之后碰到ora-600的问题就要注意了,可能是修改的值太大,不要一口吃成胖子,目前好像只能修改到14bit,反正满足了测试要求就行了。不要试图修改成0600122B4 4 0x0000ffff,好像不允许。重申一下 ,在生产库上修改的话,你早点卷铺盖走人吧,因为很可能你就回不去了,有人在等着用手掐死你。
如果取得当前oracle支持的最大的scn:
1 SQL> select to_char(((((((to_char(sysdate, 'YYYY') - 1988) * 12 + 2 2 to_char(sysdate, 'mm') - 1) * 31 + 3 3 to_char(sysdate, 'dd') - 1) * 24 + 4 4 to_char(sysdate, 'hh24')) * 60 + to_char(sysdate, 'mi')) * 60 + 5 5 to_char(sysdate, 'ss')) * to_number('ffff', 'XXXXXXXX') / 4,'XXXXXXXXXXXXXXXX') scn_hex 6 6 from dual; 7 8 SCN_HEX 9 ----------------- 10 BC79637DE01
用这个语句可以知道当前的oracle支持的最大的scn值,所以修改的时候可以注意啦,别搞得太大了。14bit的scn,等于2的43次方,2的32次方是4G,所以这个值远远超过了4GB的限制,这样就可以解决某个问题啦。哈哈!