ITPub博客

首页 > 数据库 > Oracle > [20260715]对象RECO.ORACLE.COM的FULL_HASH_VALUE.txt

[20260715]对象RECO.ORACLE.COM的FULL_HASH_VALUE.txt

原创 Oracle 作者:lfree 时间:2026-07-23 20:45:55 0 删除 编辑

[20260715]对象RECO.ORACLE.COM的FULL_HASH_VALUE.txt

--//后记:链接 https://www.anbob.com/archives/9706.html =》High 'latch: shared pool' and 'library cache: mutex X' in
--//Oracle 19c(19.13),我没遇到这类问题,开始仅仅想在21c上查询是否通过hash_value蔡查询找到对应对象,发现无法查询,接着直接
--//通过name='RECO.ORACLE.COM',查询发现hash_value与对方的对不上,不过马上明白问题在那里,因为对方数据库不是cdb,当使用自己
--//写的查询脚本查询时,发现OBJECT_STR=RECO.ORACLE.COM.    .CDB$ROOT\x45\0\0\0,(显示含有4个空格),这才想起以前我拿该对象计
--//算过FULL_HASH_VALUE,无论如何组合猜测计算都对不上,或许owner真是4个空格.才有下面详细的分析测试.

--//更正:看了以前的笔记,实际上2017/12/28号就使用hashcat破解过。
--//参考链接 :https://blog.itpub.net/267265/viewspace-2149494/ =>20171228db_link的full_hash_value值的计算

--//链接的查询结果如下:
> select hash_value, addr, owner, name, namespace, type from v$db_object_cache where hash_value in (991821498)

HASH_VALUE ADDR             OWNER NAME            NAMESPACE TYPE
---------- ---------------- ----- --------------- --------- ----------
 991821498 00000000FA5A4168       RECO.ORACLE.COM DBLINK    CURSOR

--//按照道理我的测试环境应该也能查询到,并且HASH_VALUE一样.

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.问题提出:
SYS@book> select hash_value, addr, owner, name, namespace, type from v$db_object_cache where hash_value =991821498;
no rows selected
--//奇怪无法查询到结果。

SYS@book> select hash_value, addr, owner, name, namespace, type from v$db_object_cache where name='RECO.ORACLE.COM';
HASH_VALUE ADDR             OWNER   NAME            NAMESPACE TYPE
---------- ---------------- ------- --------------- --------- -------
3961707784 00000000707FA920         RECO.ORACLE.COM DBLINK    CURSOR
--//很明显19c与21c计算的HASH_VALUE值不同。仔细看发现对方的数据库不是cdb.

3.分析:
SYS@book> @ kglob '' 3961707784 ''
==============================
INST_ID                       : 1
OWNER                         :
NAME                          : RECO.ORACLE.COM
DB_LINK                       :
NAMESPACE                     : DBLINK
TYPE                          : CURSOR
NAMESPACE_NUM                 : 69
NAMESPACE_HEX                 : 45
SHARABLE_MEM                  : 0
PERSISTENT_MEM                : 0
RUNTIME_MEM                   : 0
LOADS                         : 0
EXECUTIONS                    : 0
LOCKS                         : 0
PINS                          : 0
KEPT                          : NO
CHILD_LATCH                   : 56584
INVALIDATIONS                 : 0
HASH_VALUE                    : 3961707784
HASH_HEX                      : ec22dd08
LOCK_MODE                     : NONE
PIN_MODE                      : NONE
STATUS                        : UNKOWN
TIMESTAMP                     :
PREVIOUS_TIMESTAMP            :
LOCKED_TOTAL                  : 5
PINNED_TOTAL                  : 0
PROPERTY                      :
FULL_HASH_VALUE               : e9227ddff117c872f0ff6b77ec22dd08
CON_ID                        : 1
CON_NAME                      : CDB$ROOT
ADDR                          : 00000000707FA920
PAR_ADDR                      : 00000000707FA920
HANDLE_TYPE                   : parent handle address
KGLOBHD0                      : 00
KGLOBHD6                      : 00
EDITION                       :
SQL_ID                        :
KGL_BUCKET                    : 56584
OBJECT_STR                    : RECO.ORACLE.COM.    .CDB$ROOT\x45\0\0\0
PL/SQL procedure successfully completed.
--//生成的OBJECT_STR字符串中间有4个空格?到这里才想起以前拿来计算过FULL_HASH_VALUE,总是不对,是否真含有4个空格参与运算.

--//做了几种组合尝试都没有猜对,仔细看看owner到底记录是什么?
SYS@book> select hash_value, addr, owner,dump(owner,16) c20 , name, namespace, type from v$db_object_cache where hash_value =3961707784;
HASH_VALUE ADDR             OWNER   C20                  NAME            NAMESPACE TYPE
---------- ---------------- ------- -------------------- --------------- --------- -------
3961707784 00000000707FA920         Typ=1 Len=4: 0,0,0,0 RECO.ORACLE.COM DBLINK    CURSOR
--//实际owner实际上保存的不是空格,而是ascii码 chr(0),并且是4个.

SYS@book> select '1'||chr(0)||'2' c10 from dual ;
C10
----------
1 2

$ ~/sqllaji/bin/ext_kglob.sh 00000000707FA920
0x707faae8:     "RECO.ORACLE.COM"
--//因为后面跟着chr(0),写的执行脚本输出被截断了。

SYS@book> @ sharepool/shp4  '' 3961707784
SYS@book> @ pr
==============================
HANDLE_TYPE                   : parent handle address
KGLHDADR                      : 00000000707FA920
KGLHDPAR                      : 00000000707FA920
C40                           : RECO.ORACLE.COM.
KGLHDLMD                      : 0
KGLHDPMD                      : 0
KGLHDIVC                      : 0
KGLOBHD0                      : 00
KGLOBHD6                      : 00
KGLOBHS0                      : 0
KGLOBHS6                      : 0
KGLOBT16                      : 0
N0_6_16                       : 0
N20                           : 0
KGLNAHSH                      : 3961707784
KGLOBT03                      :
KGLHDBID                      : 56584
KGLOBT09                      : 0
PL/SQL procedure successfully completed.

SYS@book> @ ksmsp 00000000707FA920 ''
LOC KSMCHPTR           KSMCHIDX   KSMCHDUR KSMCHCOM           KSMCHSIZ KSMCHCLS   KSMCHTYP KSMCHPAR         KSMCHPTR_BEGIN   KSMCHPTR_END+1    HEAP_DESC
--- ---------------- ---------- ---------- ---------------- ---------- -------- ---------- ---------------- ---------------- ----------------- -------------------------
SGA 00000000707FA8F0          1          1 KGLHD                  3888 recr             80 00               00000000707FA8F0 00000000707FB820

--//到处对象的chunk,看看具体的内容.
SYS@book> @ opeekz 00000000707FA8F0 3888 1
New tracefile_identifier = /u01/app/oracle/diag/rdbms/book/book/trace/book_ora_4203_0001.trc
[0707FA8F0, 0707FB820) = 00000F31 80B38F00 707FA5C0 00000000 69AF8738 00000000 6896D470 00000000 7E11E130 00000000 00000001 00000050 752D7C90 00000000 ...

--//查看跟踪文件,发现如下内容:
....
0707FAAE0 00000000 00000000 4F434552 41524F2E  [........RECO.ORA]
0707FAAF0 2E454C43 004D4F43 43000000 52244244  [CLE.COM....CDB$R]
0707FAB00 00544F4F 00000000 00000000 00000000  [OOT.............]
0707FAB10 00000000 00000000 00000000 00000000  [................]

--//参与运算的字符串改写如下,注意使用单引号,因为字符串里面存在$ROOT,否则当作bash shell变量处理.
$ sql_idz.sh 'RECO.ORACLE.COM.\0\0\0\0.CDB$ROOT\x45\0\0\0' 3
sql_text = RECO.ORACLE.COM.\0\0\0\0.CDB$ROOT\x45\0\0\0
full_hash_value(16) = E9227DDFF117C872F0FF6B77EC22DD08 or e9227ddff117c872f0ff6b77ec22dd08
xxxxx_matching_signature(10) = -1081027222738641656 or  17365716850970909960
hash_value(10) = 3961707784 or hash_value(16) = EC22DD08 or ec22dd08
kgl_backet(10) = 56584 or kgl_bucket(16) =  DD08 or dd08
sql_id(16) = F0FF6B77EC22DD08 or f0ff6b77ec22dd08
sql_id(32) = g1zvbfzq25r88
sql_id(32) = g1zvbfzq25r88
sql_id(32) = g1zvbfzq25r88
--//注:\x45\0\0\0 对应NAMESPACE。十进制69.
--//对方的数据库没有使用pdb,要删除con_name.

$ sql_idz.sh 'RECO.ORACLE.COM.\0\0\0\0\x45\0\0\0' 3
sql_text = RECO.ORACLE.COM.\0\0\0\0\x45\0\0\0
full_hash_value(16) = 022BFB39389939832AAA659C3B1DFEBA or 022bfb39389939832aaa659c3b1dfeba
xxxxx_matching_signature(10) = 3074381417314909882 or  21521125491024461498
hash_value(10) = 991821498 or hash_value(16) = 3B1DFEBA or 3b1dfeba
kgl_backet(10) = 130746 or kgl_bucket(16) =  1FEBA or 1feba
sql_id(16) = 2AAA659C3B1DFEBA or 2aaa659c3b1dfeba
sql_id(32) = 2pam5mhxjvzpu
sql_id(32) = 2pam5mhxjvzpu
sql_id(32) = 2pam5mhxjvzpu
--//这样就完全对上了,实际上是4个chr(0).
--//当时11g为什么没有计算正确呢,在11g下的看再次验证看看.

4.补充测试:
--//在11g测试看看.
SCOTT@book> @ ver1
PORT_STRING                    VERSION        BANNER
------------------------------ -------------- --------------------------------------------------------------------------------
x86_64/Linux 2.4.xx            11.2.0.4.0     Oracle Database 11g Enterprise Edition Release 11.2.0.4.0 - 64bit Production

SCOTT@book> select hash_value,  owner,dump(owner,16) c20 , name, namespace, type from v$db_object_cache where hash_value =991821498;
HASH_VALUE OWNER     C20     NAME             NAMESPACE  TYPE
---------- --------- ------- ---------------- ---------- --------
 991821498           NULL    RECO.ORACLE.COM  DBLINK     CURSOR
--//11g下owner=NULL,怪不得当时什么猜测都是不对.

$ sql_idz.sh 'RECO.ORACLE.COM.\0\0\0\0\x45\0\0\0' 3
sql_text = RECO.ORACLE.COM.\0\0\0\0\x45\0\0\0
full_hash_value(16) = 022BFB39389939832AAA659C3B1DFEBA or 022bfb39389939832aaa659c3b1dfeba
xxxxx_matching_signature(10) = 3074381417314909882 or  21521125491024461498
hash_value(10) = 991821498 or hash_value(16) = 3B1DFEBA or 3b1dfeba
kgl_backet(10) = 130746 or kgl_bucket(16) =  1FEBA or 1feba
sql_id(16) = 2AAA659C3B1DFEBA or 2aaa659c3b1dfeba
sql_id(32) = 2pam5mhxjvzpu
sql_id(32) = 2pam5mhxjvzpu
sql_id(32) = 2pam5mhxjvzpu
--//这样就完全对上了,也就是计算包括owner=NULL,实际上是4个chr(0).

SYS@book> @ kglob '' 991821498 ''
==============================
INST_ID                       : 1
OWNER                         :
NAME                          : RECO.ORACLE.COM
DB_LINK                       :
NAMESPACE_NUM                 : DBLINK
NAMESPACE_HEX                 : 45
TYPE                          : CURSOR
SHARABLE_MEM                  : 0
PERSISTENT_MEM                : 0
RUNTIME_MEM                   : 0
LOADS                         : 0
EXECUTIONS                    : 0
LOCKS                         : 0
PINS                          : 0
KEPT                          : NO
CHILD_LATCH                   : 130746
INVALIDATIONS                 : 0
HASH_VALUE                    : 991821498
HASH_HEX                      : 3b1dfeba
LOCK_MODE                     : NONE
PIN_MODE                      : NONE
STATUS                        : UNKOWN
TIMESTAMP                     :
PREVIOUS_TIMESTAMP            :
LOCKED_TOTAL                  : 10
PINNED_TOTAL                  : 0
PROPERTY                      :
FULL_HASH_VALUE               : 022bfb39389939832aaa659c3b1dfeba
ADDR                          : 000000008851FE60
PAR_ADDR                      : 000000008851FE60
HANDLE_TYPE                   : parent handle address
KGLOBHD0                      : 00
KGLOBHD6                      : 00
SQL_ID                        :
KGL_BUCKET                    : 130746
OBJECT_STR                    : RECO.ORACLE.COM
PL/SQL procedure successfully completed.

--//sql_idz.sh的脚本来源源代码看以前的链接,不再贴出。
--//下载链接:https://www.cnblogs.com/lfree/p/18199806

5.疑问:
--//回到21c。
--//为什么存在这样一个dblink的对象RECO.ORACLE.COM,oracle拿它做什么呢?
--//检查其它机器视乎每台机器都有一个RECO.ORACLE.COM的dblink,查询根本看不到.

--//直接查询x$kglob可以发现KGLNAOBJ=RECO.ORACLE.COM的有3个。
SYS@book> SELECT KGLHDNSP ,kglnaown,dump(kglnaown,16) c20 ,kglnaobj,kglnahsv,kglobtyd,con_id FROM x$kglob where  kglhdnsd='DBLINK' and KGLHDNSP=69;
  KGLHDNSP KGLNAOWN C20                  KGLNAOBJ        KGLNAHSV                         KGLOBTYD  CON_ID
---------- -------- -------------------- --------------- -------------------------------- --------- ------
        69          Typ=1 Len=4: 0,0,0,0 RECO.ORACLE.COM e9227ddff117c872f0ff6b77ec22dd08 CURSOR         1
        69          Typ=1 Len=4: 1,0,0,0 RECO.ORACLE.COM 7f0d14c2cc16340bbedccd722d28ea07 CURSOR         1
        69          Typ=1 Len=4: 0,0,0,0 RECO.ORACLE.COM e817d5f576852131f2c7e6d79c7d3a2f CURSOR         3

--//换成pdb name带入。
$ sql_idz.sh 'RECO.ORACLE.COM.\0\0\0\0.BOOK01P\x45\0\0\0' 3
sql_text = RECO.ORACLE.COM.\0\0\0\0.BOOK01P\x45\0\0\0
full_hash_value(16) = E817D5F576852131F2C7E6D79C7D3A2F or e817d5f576852131f2c7e6d79c7d3a2f
xxxxx_matching_signature(10) = -952538982447760849 or  17494205091261790767
hash_value(10) = 2625452591 or hash_value(16) = 9C7D3A2F or 9c7d3a2f
kgl_backet(10) = 80431 or kgl_bucket(16) =  13A2F or 13a2f
sql_id(16) = F2C7E6D79C7D3A2F or f2c7e6d79c7d3a2f
sql_id(32) = g5jz6uyf7ufjg
sql_id(32) = g5jz6uyf7ufjg
sql_id(32) = g5jz6uyf7ufjg

--//cdb下还存在一个kglnaown是\x1\0\0\0的对象。
$ sql_idz.sh 'RECO.ORACLE.COM.\01\0\0\0.CDB$ROOT\x45\0\0\0' 3
sql_text = RECO.ORACLE.COM.\01\0\0\0.CDB$ROOT\x45\0\0\0
full_hash_value(16) = 7F0D14C2CC16340BBEDCCD722D28EA07 or 7f0d14c2cc16340bbedccd722d28ea07
xxxxx_matching_signature(10) = -4693650821359277561 or  13753093252350274055
hash_value(10) = 757656071 or hash_value(16) = 2D28EA07 or 2d28ea07
kgl_backet(10) = 59911 or kgl_bucket(16) =  EA07 or ea07
sql_id(16) = BEDCCD722D28EA07 or bedccd722d28ea07
sql_id(32) = bxr6df8qkjuh7
sql_id(32) = bxr6df8qkjuh7
sql_id(32) = bxr6df8qkjuh7

$ sql_idz.sh 'RECO.ORACLE.COM.\x1\0\0\0.CDB$ROOT\x45\0\0\0' 3
sql_text = RECO.ORACLE.COM.\x1\0\0\0.CDB$ROOT\x45\0\0\0
full_hash_value(16) = 7F0D14C2CC16340BBEDCCD722D28EA07 or 7f0d14c2cc16340bbedccd722d28ea07
xxxxx_matching_signature(10) = -4693650821359277561 or  13753093252350274055
hash_value(10) = 757656071 or hash_value(16) = 2D28EA07 or 2d28ea07
kgl_backet(10) = 59911 or kgl_bucket(16) =  EA07 or ea07
sql_id(16) = BEDCCD722D28EA07 or bedccd722d28ea07
sql_id(32) = bxr6df8qkjuh7
sql_id(32) = bxr6df8qkjuh7
sql_id(32) = bxr6df8qkjuh7
--//注:16进制写成\x01不对,8进制写成\1也不对.
--//    16进制写成\x1     , 8进制写成\01 , 不然计算结果对不上.

--//看了以前笔记x$kglob的字段KGLNAOWN不是建立的owner,不知道oracle为什么这样设置.
        

来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/267265/viewspace-3176619/ ,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论
熟悉oracle相关技术,擅长sql优化,rman备份与恢复,熟悉linux shell编程。

注册时间:2008-01-03

  • 博文量
    4006
  • 访问量
    7969252