内存的研究要适可而止,但要把已经学习到的东西搞懂,随着积累的增多再不断深入学习。
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.
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/