BUFFER CACHE学习过程的积累一

内存的研究要适可而止,但要把已经学习到的东西搞懂,随着积累的增多再不断深入学习。

1. BUFFER CACHE的大小,下面的查询包括BH和BUFFER BLOCKS的大小之和
SYS@PROD>select component,current_size from v$sga_dynamic_components;

COMPONENT                                                        CURRENT_SIZE
---------------------------------------------------------------- ------------
shared pool                                                         222298112
large pool                                                            4194304
java pool                                                             4194304
streams pool                                                                0
DEFAULT buffer cache                                                398458880
KEEP buffer cache                                                           0
RECYCLE buffer cache                                                        0
DEFAULT 2K buffer cache                                                     0
DEFAULT 4K buffer cache                                                     0
DEFAULT 8K buffer cache                                                     0
DEFAULT 16K buffer cache                                                    0

COMPONENT                                                        CURRENT_SIZE
---------------------------------------------------------------- ------------
DEFAULT 32K buffer cache                                                    0
Shared IO Pool                                                              0
ASM Buffer Cache                                                            0

14 rows selected.

等价操作:比较上面的DEFAULT buffer cache与下面的Database Buffer是相等的
SYS@PROD>SHOW SGA

Total System Global Area  638853120 bytes
Fixed Size                  2216064 bytes
Variable Size             230690688 bytes
Database Buffers          398458880 bytes
Redo Buffers                7487488 bytes

如果只查询BUFFER BLOCKS的大小,则需要查询隐含参数:_db_block_buffers
P_NAME             P_DESCRIPTION                                            P_VALUE         ISDEFAULT  ISMODIFIED  ISADJ
------------------ ----------------------------------------------------------------    ----------  ---------  ----------- ----------
_db_block_buffers  Number of database blocks cached in memory: hidden parameter    46645           TRUE       FALSE       FALSE
上面查询出来的隐含参数值:46645,是BUFFER BLOCKS的数量,字节数等于46645*8192=382115840
其与DEFAULT buffer cache=398458880的差398458880-382115840=16343040就是BUFFER CACHE中的BH的大小,转换成每一个BH的大小16343040/46645,约等于350个字节。

2. 查询HASH BUCKET(位于SHARED POOL)的数量
查询隐含参数:_db_block_hash_buckets
P_NAME                   P_DESCRIPTION                           P_VALUE  ISDEFAULT ISMODIFIED ISADJ
------------------------ --------------------------------------- -------- --------- ---------- -----
_db_block_hash_buckets   Number of database block hash buckets   131072   TRUE      FALSE      FALSE
注意上面查询结果中131072与HASH BLOCKS的数量46645的对比,要远大于。

3. 定位表的文件号和段头块号
select * from zn.t1 where x=1;
SYS@PROD>select obj#,dataobj# from obj$ where name='T1';

      OBJ#   DATAOBJ#
---------- ----------
     13225      13225
上面查询中的OBJ#表示的是逻辑id,DATAOBJ#表示的是表示的是物理id,对应object实际存储的seg$的对应的编号,这样就可以将逻辑存储与物理存储隔离, 提高处理的灵活性。
如果一些object没有物理属性的话那它就不存在data_object_id,例如procedure,function,package,data type,db link,mv定义,view定义,临时表,分区表定义等等这些object都是没有对应着某个segment,因此它们的data_object_id都为空。当表刚创建的时候它的object_id和data_object_id都是相等的,但是如果表经过move或truncate后那么data_object_id将会有变化。

4. 查询某一条表记录的文件号和块号信息
SYS@PROD>create table zn.t3(x int, y int);

Table created.
SYS@PROD>insert into zn.t3 values(1,2);

1 row created.

SYS@PROD>commit;

Commit complete.

SYS@PROD>select dbms_rowid.rowid_relative_fno(rowid) file#,dbms_rowid.rowid_block_number(rowid) block# from zn.t3 where x=1;

     FILE#     BLOCK#
---------- ----------
         4        213
        
以上查询即可获得DBA(DATA BLOCK ADDRESS)=4, 213,根据Oracle内部的HASH算法找到对应的HASH BUCKET(位于SHARED POOL),定位到某个HASH BUCKET后,找到对应的CBC(CACHE BUFFER CHAIN,由指针相连的BH组成),然后找到对应4号文件131号块的BH,获取到记录在BH中的BA,就能定位到BUFFER CACHE中的对应的BUFFER BLOCK。

5. 查看某个ROWID对应的数据块在BUFFER CACHE中的内容
SYS@PROD>alter system dump datafile 4 block 213;

System altered.

SYS@PROD>select * from v$diag_info where name='Default Trace File';

   INST_ID NAME                                                             VALUE
---------- ---------------------------------------------------------------- --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
         1 Default Trace File                                               /s01/app/oracle/diag/rdbms/prod/PROD/trace/PROD_ora_2561.trc
        
vi /s01/app/oracle/diag/rdbms/prod/PROD/trace/PROD_ora_2561.trc

Start dump data blocks tsn: 4 file#:4 minblk 213 maxblk 213

*** 2014-04-06 13:32:26.749
Block dump from cache:
Dump of buffer cache at level 4 for tsn=4, rdba=16777429
BH (0x747dbca8) file#: 4 rdba: 0x010000d5 (4/213) class: 1 ba: 0x74468000
  set: 9 pool 3 bsz: 8192 bsi: 0 sflg: 2 pwc: 115,28
  dbwrid: 0 obj: 13506 objn: 13506 tsn: 4 afn: 4 hint: f
  hash: [0x841d7900,0x841d7900] lru: [0x747dbec0,0x843ead88]
  obj-flags: object_ckpt_list
  ckptq: [0x843ef650,0x787f1e88] fileq: [0x843ef6d0,0x747dbde8] objq: [0x747dbee8,0x7f3f7620]
  st: XCURRENT md: NULL tch: 2
  flags: buffer_dirty redo_since_read
  LRBA: [0xe.287cc.0] LSCN: [0x0.7581d] HSCN: [0x0.75821] HSUB: [1]
  cr pin refcnt: 0 sh pin refcnt: 0
Block dump from disk:
buffer tsn: 4 rdba: 0x000000d5 (0/213)
scn: 0x0000.00000000 seq: 0x01 flg: 0x05 tail: 0x00000001
frmt: 0x02 chkval: 0xa7d5 type: 0x00=unknown
Hex dump of corrupt header 4 = CORRUPT
Dump of memory from 0x00007FF7DAE02200 to 0x00007FF7DAE02214

下面先引用一段理论:
对于BH(Buffer Header)来说,每一个数据块在被读入BUFFER CACHE时,都会先在BUFFER CACHE中构造一个BH,BH与数据块一一对应。BH包含的主要信息有:
1) 该数据块在BUFFER CACHE中实际的内存地址。-- 上面DUMP出来的ba: 0x75628000和ba: 0x75672000
2) 该数据块的类型,包括data、segment header、undo header、undo block等等。
3) 该BH所在的hash chain,是通过在BH里保存指向前一个BH的指针和指向后一个BH的指针的方式实现的。
4) 该BH所在的LRU、LRUW、CKPTQ等链表(这些链表我们后面都会详细说明)。也是通过记录前后BH指针的方式实现。
5) 当前该BH所对应的数据块的状态以及标记。
6) 该BH被访问(touch)的次数。
7) 正在等待该BH的进程列表(waiter list)和正在使用该buffer header的进程列表(user list)。


6. 转储BUFFER CACHE
ALTER SESSION SET EVENTS 'immediate trace name buffers level level';
这里的level有很多值,分别可以转储buffer cache中的不同的内容。level的可选值包括:
1 只转储buffer header
2 在level 1的基础上再转储数据块头
3 在level 2的基础上再转储数据块内容
4 转储buffer header和hash chain
5 在level 1的基础上再转储数据块头和hash chain
6 在level 2的基础上再转储数据块内容和hash chain
8 转储buffer header和hash chain以及users/waiters链表
9 在level 1的基础上再转储数据块头、hash chain以及users/waiters链表
10 在level 2的基础上再转储数据块内容、hash chain以及users/waiters链表

我们把BUFFER CACHE的BH转出出来看一下:
SYS@PROD>ALTER SESSION SET EVENTS 'immediate trace name buffers level 1';

Session altered.

SYS@PROD>select * from v$diag_info where name='Default Trace File';

   INST_ID NAME                                                             VALUE
---------- ---------------------------------------------------------------- --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
         1 Default Trace File                                               /s01/app/oracle/diag/rdbms/prod/PROD/trace/PROD_ora_2561.trc
        
vi /s01/app/oracle/diag/rdbms/prod/PROD/trace/PROD_ora_2561.trc

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

转载于:http://blog.itpub.net/26521853/viewspace-1137853/

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值