【转】修改oracle的scn,很黄很暴力

文章转自: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的限制,这样就可以解决某个问题啦。哈哈!

posted @ 2012-08-05 16:33  david_zhang@sh  阅读(1564)  评论(0编辑  收藏  举报