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

简介: 文章转自:http://hi.baidu.com/asamchen/item/d9f527cd908b3c28a0b50ae5 今天接到一个很变态的要求,需要修改oracle的scn到非常非常大,找了点资料,尝试一下看看: 1.

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

相关文章
|
存储 Oracle 关系型数据库
oracle数据库 修改表空间数据文件大小,优化存储
oracle数据库 修改表空间数据文件大小,优化存储
|
存储 Oracle 关系型数据库
MySQL数据库: 添加列、修改列、删除列、修改列属性、修改表名(包括MySQL、SQLServer、Oracle)
MySQL数据库: 添加列、修改列、删除列、修改列属性、修改表名(包括MySQL、SQLServer、Oracle)
436 0
MySQL数据库: 添加列、修改列、删除列、修改列属性、修改表名(包括MySQL、SQLServer、Oracle)
|
Oracle 关系型数据库
oracle学习21-修改为静态监听
oracle学习21-修改为静态监听
104 0
oracle学习21-修改为静态监听
|
Oracle 算法 关系型数据库
Oracle如何修改数据库的DBID和DBNAME?
Oracle如何修改数据库的DBID和DBNAME?
441 0
|
网络协议 Oracle 关系型数据库
Oracle rac 修改SCAN IP
Oracle rac 修改SCAN IP
739 0
|
Oracle 关系型数据库 数据安全/隐私保护
oracle学习25-手工删除oracle归档日志后操作步骤 和修改用户默认解锁时间
oracle学习25-手工删除oracle归档日志后操作步骤 和修改用户默认解锁时间
157 0
|
Oracle 关系型数据库 数据安全/隐私保护
oracle学习22-ora-01691和修改密码过期时间
oracle学习22-ora-01691和修改密码过期时间
153 0
|
Oracle 关系型数据库 Windows
oracle学习29-检查操作系统版本和查询表中修改数据
oracle学习29-检查操作系统版本和查询表中修改数据
193 0
|
Oracle 关系型数据库
Oracle归档目录修改的坑,请留意
Oracle归档目录修改的坑,请留意
173 0
Oracle归档目录修改的坑,请留意
|
Oracle 关系型数据库 数据库
Oracle用户操作、数据类型、表格修改、约束设置详解
Oracle用户操作、数据类型、表格修改、约束设置相关操作以及使用案例