[20240911]查看超长视图的定义2.txt

一给  论坛元老 | 2024-9-13 01:34:54 | 显示全部楼层 | 阅读模式
打印 上一主题 下一主题

主题 1853|帖子 1853|积分 5559

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

x
[20240911]查看超长视图的定义2.txt

--//昨天看了链接:https://www.anbob.com/archives/8295.html,提供了另外的方式获得超长定义试图的长文本。
--//我重复验证看看.

1.情况:
SYS@book> @ver2
==============================
PORT_STRING                   : x86_64/Linux 2.4.xx
VERSION                       : 21.0.0.0.0
BANNER                        : Oracle Database 21c Enterprise Edition Release 21.0.0.0.0 - Production
BANNER_FULL                   : Oracle Database 21c Enterprise Edition Release 21.0.0.0.0 - Production
Version 21.3.0.0.0
BANNER_LEGACY                 : Oracle Database 21c Enterprise Edition Release 21.0.0.0.0 - Production
CON_ID                        : 0
PL/SQL procedure successfully completed.

2.测试:
select
 addr,
 to_number(addr,'XXXXXXXXXXXXXXXX') addr_dec,
 to_number(lag(addr,1) over (order by indx),'xxxxxxxxxxxxxxxx') lag_addr_dec,
 to_char(
 to_number(addr,'XXXXXXXXXXXXXXXX') -
 to_number(lag(addr,1) over (order by indx),'xxxxxxxxxxxxxxxx'),
 'xxxxxxxxxxxxxxxx'
 ) row_size_hex,
 to_number(addr,'XXXXXXXXXXXXXXXX') -
 to_number(lag(addr,1) over (order by indx),'xxxxxxxxxxxxxxxx') row_size,
 indx
from x$kqfvt
where indx  @ xind X$KQFVT
TABLE_NAME                     INDEX_NUMBER COLUMN_NAME                    COLUMN_POSITION     CON_ID
------------------------------ ------------ ------------------------------ --------------- ----------
X$KQFVT                                   1 ADDR                                         0          0
X$KQFVT                                   2 INDX                                         0          0
--//仅仅存在2个索引addr,indr.

SYS@book> select i.addr,t.addr from x$kqfvi i,x$kqfvt t where i.kqfvinam = 'GV$ACTIVE_SESSION_HISTORY' and t.indx = i.indx;
ADDR             ADDR
---------------- ----------------
0000000016BDE4C0 0000000016BF3880

--//sql语句的信息生存在地址0000000016BF3880指向的地址.

SYS@book> oradebug setmypid
Statement processed.

SYS@book> oradebug peek 0x0000000016BF3880 32
[016BF3880, 016BF38A0) = 16E985C0 00000000 16C30640 00000000 00000000 00000000 00000000 00000000
--//sql语句生存在地址0000000016E985C0开始处.受KQFTPSEL varchar2(4000)限制仅仅取出4000字节.

SYS@book> @ fchaz 0000000016BF3880
no rows selected

SYS@book> @ fchaz 16E985C0
no rows selected
--//这些地址不再sga uga等地方,到底在那里呢?

SYS@book> @ spid
       SID    SERIAL# PROCESS                  SERVER    SPID                               PID  P_SERIAL# C50
---------- ---------- ------------------------ --------- ------------------------------ ------- ---------- --------------------------------------------------
       288      19200 3795                     DEDICATED 3796                                62          4 alter system kill session '288,19200' immediate;

$ pmap -x 3796 | head -10
3796:   oraclebook (DESCRIPTION=(LOCAL=YES)(ADDRESS=(PROTOCOL=beq)))
Address           Kbytes     RSS   Dirty Mode  Mapping
0000000000400000  422472   37660       0 r-x-- oracle
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
000000001a292000    1540     396       4 r---- oracle
000000001a413000     468      28      24 rw--- oracle
000000001a488000     344     196     196 rw---   [ anon ]
000000001ad7e000     316     284     284 rw---   [ anon ]
0000000060000000   10240       0       0 rw-s- SYSV00000000 (deleted)
0000000060c00000  770048       0       0 rw-s- SYSV00000000 (deleted)
000000008fc00000    8192       0       0 rw-s- SYSV00000000 (deleted)

SYS@book> @ calcx 422472*1024

                                DEC                  HEX
----------------------------------- --------------------
                   432611328.000000 0000000019c92000

SYS@book> @ calc 0x400000 + x0000000019c92000

                                DEC                  HEX
----------------------------------- --------------------
                   436805632.000000             1A092000
                   
--//0x400000 = 4194304
--//4194304+422472*1024 = 436805632
--//4194304+422472*1024 = 0x1a092000

$ echo p/x 0x400000+422472*1024 | gdb -q
(gdb) $1 = 0x1a092000
(gdb) quit

--//很显着在实行文件oracle里面,也就是通过strings抽取文本,可以找到对应的sql文本.
--//我以前通过抽取libserver.a,效果一样的.

$ strings /u01/app/oracle/product/21.0.0/dbhome_1/lib/libserver.a | grep  "x\$kewash.*x\$ash" > cc1.txt
$ strings $(which oracle) |grep "x\$kewash.*x\$ash" > cc2.txt
$ diff cc1.txt cc2.txt
--//结果不再贴出.

3.实验通过脚本是否可以实现,测试看看:

$ cat ext_sql.sh
#! /bin/bash
tn="${1^^}"
#echo $tn

# sqlplus -s -l / as sysdba
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

一给

论坛元老
这个人很懒什么都没写!
快速回复 返回顶部 返回列表