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;
评论