暂无图片
暂无图片
暂无图片
暂无图片
暂无图片
11g_poke_scn.sql
124
1次
2022-12-02
免费下载
11g_poke_scn
https://www.cnblogs.com/nathon-wang/p/13307047.html

SELECT DISTINCT CHECKPOINT_CHANGE# FROM V$DATAFILE;
SELECT DISTINCT CHECKPOINT_CHANGE# FROM V$DATAFILE_HEADER;
       CHECKPOINT_CHANGE#
-------------------------
            9713910384621

SELECT CURRENT_SCN FROM V$DATABASE;



COL DATAFILE_SCN FOR 999999999999999
COL DATAFILE_HEADER_SCN FOR 999999999999999
COL CURRENT_SCN FOR 999999999999999
COL  NEXT_CHANGE# FOR 999999999999999
SELECT (SELECT MIN(D.CHECKPOINT_CHANGE#) FROM V$DATAFILE D) DATAFILE_SCN,
       (SELECT MIN(D.CHECKPOINT_CHANGE#)
          FROM V$DATAFILE_HEADER D
         WHERE ROWNUM = 1) DATAFILE_HEADER_SCN,
       (SELECT CURRENT_SCN FROM V$DATABASE) CURRENT_SCN,
       (SELECT NEXT_CHANGE#
          FROM V$ARCHIVED_LOG
         WHERE SEQUENCE# = 19760
           AND RESETLOGS_CHANGE# =
               (SELECT D.RESETLOGS_CHANGE# FROM V$DATABASE D)
           AND ROWNUM = 1) NEXT_CHANGE#
  FROM DUAL;

    DATAFILE_SCN DATAFILE_HEADER_SCN      CURRENT_SCN     NEXT_CHANGE#
---------------- ------------------- ---------------- ----------------
   9734055461915       9734055461915    9734055461914    9734055461915

SELECT to_char('9625438676018','xxxxxxxxxxxxxxx') FROM dual;

TO_CHAR('9625438
----------------
     8c118da6432
	 
SELECT to_char('9713910385001','xxxxxxxxxxxxxxxX') FROM dual;

TO_CHAR('9713910
----------------
     8d5b22d8968

COL SCN FOR 999999999999999
SELECT to_number('8d5b22d8969','xxxxxxxxxxxxxxxxx') SCN FROM dual;

select 7*power(2,32) + 2516660859 from dual;
select 7*power(2,32) + 2516661000 from dual;

9713910384621 / 4294967296 = 2261 
SELECT MOD(9713910384621, POWER(2, 32)) SCNBASE, TRUNC(9713910384621 / POWER(2, 32)) SCNWRAP FROM DUAL;
-- (2^32 = 4294967296), POWER(2, 32)
-- SCN=SCNWRAP * POWER(2,32) + SCNBASE, ( 9713910384621 )

 SCNBASE    SCNWRAP
---------- ----------
2989328365       2261

SELECT to_char('9588285831202','xxxxxxxxxxxxxxx')TO_OX FROM dual;

set *((int *) 0x0600113B8) = 0x8b8725ef822

TO_OX
----------------
        b22d87ed


startup mount

oradebug setmypid

oradebug DUMPvar SGA kcsgscn  --查看当前内存中的SCN  (这个内存中的SCN,控制文件的当前SCN,数据文件头的start SCN  --具体是什么关系,暂时待定。)

oradebug  poke 【内存地址】 【长度】  【要修改的内容】  

recover database;

alter database open;

SQL> oradebug DUMPvar SGA kcsgscn
kcslf kcsgscn_ [06001AE70, 06001AEA0) = 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 6001AB50 00000000
SQL> 
oradebug poke 0x06001AE70 4 9625438676018

SQL> oradebug DUMPvar SGA kcsgscn
kcslf kcsgscn_ [06001AE70, 06001AEA0) = 62EB041B 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 6001AB50 00000000
SQL> 

alter database open;

ORADEBUG POKE SCN (版本适用于12.2以下,12.2以上ORACLE屏蔽了该方法)
一、判断oracle所在的服务器是 大端 还是 小端 (Endian,此方法仅限Linux)
方法一
echo -n I | od -o | head -n1 | cut -f2 -d" " | cut -c6
输出:1为小端模式,0为大端模式;
解析:od命令的作用为将指定内容以八进制、十进制、十六进制、浮点格式或ASCII编码字符方式显示;


方法二
echo -n I | od -o | head -n1 | awk '{print $2}'| cut -c6
输出:1为小端模式,0为大端模式;
解析:awk命令为文本处理。


方法三
lscpu | grep -i byte
输出:Byte Order:            Little Endian(小端模式)
解析:grep -i 为不区分大小写匹配;
注意:在低版本的Linux可能不支持lscpu命令。
 

二、确认系统是32-bit还是64bit(大端、小端)

如下命令在mount下是可以执行的:

COL PLATFORM_NAME FOR A40;
SELECT D.PLATFORM_NAME,P.ENDIAN_FORMAT FROM V$DATABASE D JOIN V$TRANSPORTABLE_PLATFORM P ON D.PLATFORM_ID=P.PLATFORM_ID;

PLATFORM_NAME                            ENDIAN_FORMAT
---------------------------------------- --------------
Linux x86 64-bit                         Little

SQL> SELECT * FROM V$TRANSPORTABLE_PLATFORM ORDER BY 1;

 PLATFORM_ID PLATFORM_NAME                       ENDIAN_FORMAT
------------ ----------------------------------- --------------
           1 Solaris[tm] OE (32-bit)             Big
           2 Solaris[tm] OE (64-bit)             Big
           3 HP-UX (64-bit)                      Big
           4 HP-UX IA (64-bit)                   Big
           5 HP Tru64 UNIX                       Little
           6 AIX-Based Systems (64-bit)          Big
           7 Microsoft Windows IA (32-bit)       Little
           8 Microsoft Windows IA (64-bit)       Little
           9 IBM zSeries Based Linux             Big
          10 Linux IA (32-bit)                   Little
          11 Linux IA (64-bit)                   Little
          12 Microsoft Windows x86 64-bit        Little
          13 Linux x86 64-bit                    Little
          15 HP Open VMS                         Little
          16 Apple Mac OS                        Big
          17 Solaris Operating System (x86)      Little
          18 IBM Power Based Linux               Big
          19 HP IA Open VMS                      Little
          20 Solaris Operating System (x86-64)   Little
          21 Apple Mac OS (x86-64)               Little


三、推进内存中的SCN

语法和过程:

startup mount

oradebug setmypid

oradebug DUMPvar SGA kcsgscn  --查看当前内存中的SCN  (这个内存中的SCN,控制文件的当前SCN,数据文件头的start SCN  --具体是什么关系,暂时待定。)

oradebug  poke 【内存地址】 【长度】  【要修改的内容】  

关于db中scn存储方式的解释:

scn=scnwrap * power(2,32) + scnbase      (2^32 = 4294967296)

SCN分为两部分存储,scnwrap和scnbase,每当scnbase增长到2^32之后,scnwarp加1,然后scnbase清零。

scnwrap和scnbase都由4个字节组成,一共占用8字节。

(一个字节为8个bit,最小为0,最大为256,因此一个字节可以用两个16进制数(16*16)来表示,所以整个SCN显示出来应该是16个16进制数,两个16进制数表示一个字节。eg:0016CE5E 00000000)

在64-bit小字端中:前4位为scnbase,后4位为scnwrap

在64-bit大字端中:前4为为scnwrap,后4为为scnbase


根据以上的方法,修改对应的scnbase或者scnwrap就好。


我看了好多更改SCN的文章,包括贴子,他们给定了一些规矩通用的计算方法,如下:

POKE计算方法

64位小字端,修改前8位:

select to_char(5080542,'xxxxxxxxx') from dual;  --4d85de

oradebug poke 0x060019598 8 0x4d85de;

64位大字端,SCN WARP加1

select to_char(5080542,'xxxxxxxxx') from dual;  --4d85de

oradebug poke 0x060019598 8 0x00000001004d85de;

32位小字端,POKE地址加4,修改后8位:

select to_char(5080542,'xxxxxxxxx') from dual;  --4d85de

oradebug poke 0x06001959C 4 0x4d85de;
of
免费下载
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文档的来源(墨天轮),文档链接,文档作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论

关注
最新上传
暂无内容,敬请期待...
下载排行榜
Top250 周榜 月榜