12
返回列表 发新帖
楼主: catchwo

x$bh 的addr列的内容是什么?

[复制链接]
论坛徽章:
113
ITPUB9周年纪念徽章
日期:2010-10-08 09:28:512011新春纪念徽章
日期:2011-02-18 11:42:50现任管理团队成员
日期:2011-05-07 01:45:08ITPUB官方微博粉丝徽章
日期:2011-06-28 19:45:36蛋疼蛋
日期:2011-07-24 22:25:332012新春纪念徽章
日期:2012-02-13 15:12:252012新春纪念徽章
日期:2012-02-13 15:12:252012新春纪念徽章
日期:2012-02-13 15:12:252012新春纪念徽章
日期:2012-02-13 15:12:252012新春纪念徽章
日期:2012-02-13 15:12:25
11#
发表于 2009-6-18 19:08 | 只看该作者
原帖由 viadeazhu 于 2009-6-18 14:04 发表
【error】见后。

很好的一个问题。我本来也不知道ADDR是什么东西,只是知道网上有篇文章说这个x$bh的addr指:
RAW(4) Hex address of the Buffer Header
我也深信不疑。因为很少用到这个列。我相信大家用到的最多的是HLADDR,这个列是cbc child latch address。

但楼上的catchwo兄弟一阵见血地证明了这个addr并不是buffer header的address。那么,网上的那篇文档错了?
于是开始做实验:
我建了一个table,叫BUFFER_TEST,它的object_id 是49926。
这时,我们在buffer header里找到了这个object,其中一个是segment header block,一个是data block。
(class=4代表是segment header block,class=1代表是data block)
SQL> select ADDR,INDX,HLADDR,FLAG,TS#,FILE#,DBABLK,CLASS,BA from x$bh where OBJ=49926;

ADDR                   INDX HLADDR                 FLAG        TS#      FILE#     DBABLK      CLASS BA
---------------- ---------- ---------------- ---------- ---------- ---------- ---------- ---------- ----------------
FFFFFFFF79FC1DC8       3676 00000003A7A190B0   35659776          0          1      35946          1 000000038F67C000
FFFFFFFF79FC1DC8       6017 00000003A71C1178   35659776          0          1      35945          4 000000038F59C000

然后转储buffer cache:

SQL> ALTER SESSION SET EVENTS 'immediate trace name buffers level 1';

Session altered.

这时在trace文件里,我找到了这两个block的buffer header,根据object number:
BH (38f7e9af8) file#: 1 rdba: 0x00408c69 (1/35945) class: 4 ba: 38f59c000
  set: 11 blksize: 8192 bsi: 0 set-flg: 2 pwbcnt: 33
  dbwrid: 2 obj: 49926 objn: 49926 tsn: 0 afn: 1
  hash: [3a75168d0,3a75168d0] lru: [38f7e9c88,38f7e9a68]
  obj-flags: object_ckpt_list
  ckptq: [3a7618580,38f7e9f68] fileq: [3a76185a0,38f7e9f78] objq: [3a430c2a8,3a430c2a8]
  st: XCURRENT md: NULL tch: 2
  flags: buffer_dirty gotten_in_current_mode redo_since_read
  LRBA: [0xd.108.0] HSCN: [0x0.c7f2f3b] HSUB: [1]
  

BH (38f7f11f8) file#: 1 rdba: 0x00408c6a (1/35946) class: 1 ba: 38f67c000
  set: 12 blksize: 8192 bsi: 0 set-flg: 2 pwbcnt: 37
  dbwrid: 3 obj: 49926 objn: 49926 tsn: 0 afn: 1
  hash: [3a7193ca8,3a7193ca8] lru: [38f7f1388,3a75fb3d8]
  obj-flags: object_ckpt_list
  ckptq: [3a761b7a0,3927dfcd8] fileq: [3a761b7c0,3927dfce8] objq: [3a32b7250,3a32b7250]
  st: XCURRENT md: NULL tch: 1
  flags: buffer_dirty gotten_in_current_mode redo_since_read
  LRBA: [0xd.117.0] HSCN: [0x0.c7f2f3b] HSUB: [1]


于是我们看到,我实在找不到这个ADDR的值代表什么意思。但我确定它代表的是一个内存地址。
于是问题就变成,这个内存地址是什么地址?反正,他肯定不是SGA中的。

重启数据库,用sid=2176的session采用dedicate方式连入数据库,操作系统进程号是4691。
SQL> select sid from v$mystat where rownum<2;

       SID
----------
      2176

SQL> select * from BUFFER_TEST;

        ID
----------
         2

这时,我用另一个session(操作系统pid=4629)连入查询v$bh
SQL> select ADDR,INDX,HLADDR,FLAG,TS#,FILE#,DBABLK,CLASS,BA,state from x$bh where OBJ=49926;

ADDR                   INDX HLADDR                 FLAG        TS#      FILE#     DBABLK      CLASS BA                    STATE
---------------- ---------- ---------------- ---------- ---------- ---------- ---------- ---------- ---------------- ----------
FFFFFFFF79FC1DC8       3605 00000003A7A190B0     524288          0          1      35946          1 000000038F784000          1
FFFFFFFF79FC1DC8       5912 00000003A71C1178          0          0          1      35945          4 000000038F6AC000          1
FFFFFFFF79FC1CA0       5913 00000003A71C1178          0          0          1      35945          4 000000038F5AC000          3

不知道这个地址到底在哪里,于是我只有把所有的oracle process做pmap。
ps -ef | grep hao | grep -v grep | awk -F' ' '{print $2}' | xargs pmap > temp.txt

然后在里面找这个地址,最后我发现这个地址在我的一个用户进程里:
4629: oraclehaozhu (DESCRIPTION=(LOCAL=YES)(ADDRESS=(PROTOCOL=beq)))
0000000100000000      98304K r-x--  /xxx/10203/bin/oracle
0000000106000000       3824K r-x--  /xxx/10203/bin/oracle
00000001064BA000        816K rwx--  /xxx/10203/bin/oracle
0000000106586000       2016K rwx--    [ heap ]
0000000380000000     720896K rwxs-    [ dism shmid=0x6000064 ]
FFFFFFFF79FC0000         64K rw---    [ anon ]

这个操作系统process 4629并不是我们做select * from BUFFER_TEST;的那个用户进程,
而是我们做查询x$bh的进程。
于是我对这个查询x$bh的进程进行pga dump:
SQL> oradebug setospid 4629
Oracle pid: 19, Unix process pid: 4629, image: oracle@xxx(TNS V1-V3)
SQL> oradebug dump heapdump 1
Statement processed.

终于,在trace文件里,显示为session heap!

不放心,退出查询x$bh的session,重新连接重新查询,
SQL> select ADDR,INDX,HLADDR,FLAG,TS#,FILE#,DBABLK,CLASS,BA,state from x$bh where OBJ=49926;

ADDR                   INDX HLADDR                 FLAG        TS#      FILE#     DBABLK      CLASS BA                    STATE
---------------- ---------- ---------------- ---------- ---------- ---------- ---------- ---------- ---------------- ----------
FFFFFFFF7D7A9FA8       3630 00000003A7A190B0   35659777          0          1      35946          1 000000038F766000          1
FFFFFFFF7D7A9E80       3631 00000003A7A190B0   36175872          0          1      35946          1 000000038FD6C000          3
FFFFFFFF7D7A9FA8       5955 00000003A71C1178          0          0          1      35945          4 000000038FC88000          1
FFFFFFFF7D7A9E80       5956 00000003A71C1178          0          0          1      35945          4 000000038FF6E000          3

重新dump这个session的pga,发现这时的ADDR变成了这个session的PGA session heap。


综上,从实验结果来看,x$BH的ADDR这一列并不是所谓的buffer header的address,也不是cbc child latch的address,也不是产生这个buffer的用户session的地址,
而是做这个x$bh查询的用户session 的PGA heap session!当你重复更换session查询某一个object的x$bh时,你会发现这个addr不停变化,而其他列不变。
至于为什么会有这种诡异的列,恐怕答案只有oracle开发者知道了。

使用道具 举报

回复
论坛徽章:
150
蓝锆石
日期:2011-11-16 22:31:22萤石
日期:2011-11-17 13:05:31祖母绿
日期:2008-06-14 15:23:26海蓝宝石
日期:2011-11-16 22:25:15紫水晶
日期:2011-11-16 22:31:22红宝石
日期:2011-10-09 08:54:30蓝锆石
日期:2009-01-31 15:20:54萤石
日期:2008-12-22 15:22:00祖母绿
日期:2011-11-17 13:13:26海蓝宝石
日期:2008-07-05 14:52:18
12#
发表于 2009-6-18 23:02 | 只看该作者
也一直是我的疑问...

使用道具 举报

回复
论坛徽章:
122
现任管理团队成员
日期:2011-05-07 01:45:08
13#
发表于 2009-6-18 23:34 | 只看该作者
顶!

使用道具 举报

回复
论坛徽章:
2
奥运会纪念徽章:水球
日期:2008-10-24 13:17:39ITPUB十周年纪念徽章
日期:2011-11-01 16:21:15
14#
发表于 2009-7-23 17:45 | 只看该作者
给出一个信息。一共有572个session 但是这个ADDR确很集中!!只有7个而已。让我们计算下相近的addr的间隔是:110(H16)=272字节:。从session和ADDR的比例看 .和session的PGA是无关的。有可能是每建立一个session后。会读取相应的ADDR,然后写入到PGA中。我认为这个是一种内部的数据结构。
SQL> select addr ,count(*) from x$bh group by addr ;

ADDR               COUNT(*)
---------------- ----------
0000002A97317B58      15833
0000002A97317A48       1206
0000002A97378C78        155
0000002A97317938        208
0000002A97378A58          5
0000002A97317C68     197868
0000002A97378B68         45

7 rows selected.

SQL> select count(*) from v$session;

  COUNT(*)
----------
       572

[ 本帖最后由 zx2010 于 2009-7-23 18:04 编辑 ]

使用道具 举报

回复
论坛徽章:
10
授权会员
日期:2007-08-09 15:37:26会员2007贡献徽章
日期:2007-09-26 18:42:10ITPUB元老
日期:2007-10-15 21:12:09ITPUB新首页上线纪念徽章
日期:2007-10-20 08:38:44ITPUB十周年纪念徽章
日期:2011-11-01 16:20:28灰彻蛋
日期:2013-06-24 14:20:02
15#
 楼主| 发表于 2009-12-15 10:30 | 只看该作者
viadeazhu

使用道具 举报

回复
招聘 : 数据库管理员
论坛徽章:
4
授权会员
日期:2005-10-30 17:05:332010新春纪念徽章
日期:2010-03-01 11:20:00ITPUB9周年纪念徽章
日期:2010-10-08 09:28:51ITPUB十周年纪念徽章
日期:2011-11-01 16:19:41
16#
发表于 2009-12-15 11:22 | 只看该作者
综上,从实验结果来看,x$BH的ADDR这一列并不是所谓的buffer header的address,也不是cbc child latch的address,也不是产生这个buffer的用户session的地址,
而是做这个x$bh查询的用户session 的PGA heap session!当你重复更换session查询某一个object的x$bh时,你会发现这个addr不停变化,而其他列不变。

看测试结果是SO的地址了

使用道具 举报

回复
论坛徽章:
3
蜘蛛蛋
日期:2012-11-01 15:21:292013年新春福章
日期:2013-02-25 14:51:24优秀写手
日期:2014-07-04 06:00:11
17#
发表于 2013-4-8 18:13 | 只看该作者
精彩

使用道具 举报

回复
论坛徽章:
7
ITPUB十周年纪念徽章
日期:2011-11-01 16:25:222013年新春福章
日期:2013-02-25 14:51:24优秀写手
日期:2013-12-18 09:29:082014年新春福章
日期:2014-02-18 16:44:08马上有对象
日期:2014-02-18 16:44:08喜羊羊
日期:2015-03-04 14:52:462015年新春福章
日期:2015-03-06 11:58:18
18#
发表于 2013-4-8 18:49 | 只看该作者

使用道具 举报

回复

您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

TOP技术积分榜 社区积分榜 徽章 团队 统计 知识索引树 积分竞拍 文本模式 帮助
  ITPUB首页 | ITPUB论坛 | 数据库技术 | 企业信息化 | 开发技术 | 微软技术 | 软件工程与项目管理 | IBM技术园地 | 行业纵向讨论 | IT招聘 | IT文档
  ChinaUnix | ChinaUnix博客 | ChinaUnix论坛
CopyRight 1999-2011 itpub.net All Right Reserved. 北京盛拓优讯信息技术有限公司版权所有 联系我们 未成年人举报专区 
京ICP备16024965号-8  北京市公安局海淀分局网监中心备案编号:11010802021510 广播电视节目制作经营许可证:编号(京)字第1149号
  
快速回复 返回顶部 返回列表