2012年(28)
分类: Oracle
2012-03-13 22:18:45
Oracle里有各种我们见不到的逻辑数据结构和内存结构,有时我们要更深入的研究故障和问题的时候,我们需要深入到这里的内部结构里进行研究。而这些文件或者结构信息都是二进制的,通过Oracle提供了dump的命令,让我们很方便的把这些逻辑结构和内存结构展现到我们的面前。
1. Block dump
可以dump出,数据块里的结构, 分析数据文件块,转储数据文件n的块m
alter system dump datafile n block m
数据文件的blockid和file id可以S从Rowid里得到,
SELECT DBMS_ROWID.ROWID_RELATIVE_FNO(ROWID) R_FILE_NO,DBMS_ROWID.ROWID_BLOCK_NUMBER(ROWID) BLOCK_NO
FROM test得到文件号和数据块号,
Rowid转换为物理地址有更方便的方法.
然后alter system dump datafile 6 block 149140
2. Control dump
可以dump出,Controlfile里的结构,控制文件是二进制的,通过dump把内部信息展示出来
alter session set events 'immediate trace name controlf level 10'
3. Logfile dump
可以dump出日志文件,日志文件都是二进制的,通过这个我们可以看到文本的内部信息
alter system dump logfile logfilename;
4. Data File header dump
可以dump出数据文件头, 数据文件头也是都是二进制的,通过这个我们可以看到文本的内部信息
alter session set events 'immediate trace name FILE_HDRS level 10'
5. Log File Header dump
可以dump出日志文件头, 日志文件头也是都是二进制的,通过这个我们可以看到文本的内部信息
alter session set events 'immediate trace name REDOHDR level 10'
6. Process dump
可以dump出进程状态
alter session set events 'immediate trace name PROCESSSTATE level 10'
7、Shared pool dump
可以dump出Library Cache的详细情况
alter session set events 'immediate trace name library_cache level 10'
8 Buffer cache dump
可以dump出分析data buffer的详细情况
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链表。
通过上面的dump的命令,Oracle可以把这些逻辑结构和内存已经进程的信息都dump到trc文件里。我们运行完命令以后可以打开trc文件看看我们的dump的内容
以前有一个gettracename的工具就可以用上了。
我们来个buffer cache的dump看看
现在有一个表test_redolog
SQL> select * from test_redolog;
ID
----------
1
2
现在queyr了这个表,这个表有没有被load buffer cache里叻
查看一下
SQL> alter session set events 'immediate trace name buffers level 1';
Session altered
SQL> select gettracename from dual;
GETTRACENAME
--------------------------------------------------------------------------------
F:/Synchrophy/Server/oracle/admin/ORA9i/udump/ora9i_ora_3764.trc
打开这个文件
查询出test_redolog的对象号
SQL> select object_id, object_name from dba_objects b where b.object_name like 'TEST_REDO%';
OBJECT_ID OBJECT_NAME
---------- --------------------------------------------------------------------------------
47469 TEST_REDOLOG
ObjectID是47469 我们找到其中文件的段落
BH (0x257DD040) file#: 14 rdba: 0x0381a5b2 (14/107954) class 1 ba: 0x251E0000
set: 3 dbwrid: 0 obj: 47469 objn: 47469
hash: [257dd1b8,17eb590c] lru: [257dd144,257dcfcc]
ckptq: [NULL] fileq: [NULL]
st: XCURRENT md: NULL rsop: 0x00000000 tch: 1
flags: gotten_in_current_mode block_written_once redo_since_read
LRBA: [0x0.0.0] HSCN: [0xffff.ffffffff] HSUB: [1] RRBA: [0x0.0.0]
BH (0x257DD1B8) file#: 14 rdba: 0x0381a5b2 (14/107954) class 1 ba: 0x251E4000
set: 3 dbwrid: 0 obj: 47469 objn: 47469
hash: [257dd3ec,257dd040] lru: [257dd2bc,257dd144]
ckptq: [NULL] fileq: [NULL]
st: CR md: NULL rsop: 0x00000000 tch: 0
cr:[[scn: 0x0000.007bb261],[xid: 0x0000.000.00000000],[uba: 0x00000000.0000.00],[cls: 0x0000.007bb261],[sfl: 0x0]]
flags: buffer_dirty gotten_in_current_mode block_written_once
redo_since_read
BH (0x257DD3EC) file#: 14 rdba: 0x0381a5b2 (14/107954) class 1 ba: 0x251EA000
set: 3 dbwrid: 0 obj: 47469 objn: 47469
hash: [17eb590c,257dd1b8] lru: [257dd4f0,257dd378]
ckptq: [NULL] fileq: [NULL]
st: CR md: NULL rsop: 0x00000000 tch: 0
cr:[[scn: 0x0000.007bb1e1],[xid: 0x0000.000.00000000],[uba: 0x00000000.0000.00],[cls: 0x0000.007bb1e1],[sfl: 0x0]]
flags: buffer_dirty only_sequential_access redo_since_read
这块部分就是我们的buffer cache里有关TEST_REDOLOG这个表里的记录的信息了。
这样我们根本就看不见的内存里的信息,一下就一览无遗的展现在我们的眼前了,有了这个走道,我们就可以走进Oracle的内部结构了,探索Oracle内部的奥秘.