作者介绍:
姜刚 云和恩墨技术顾问
2017年3月加入云和恩墨,熟悉shell、perl脚本等。
为了加深对ORACLE数据库结构的了解,我们今天从C语言的角度,讲解如何使用C语言直接访问SGA。
基于的事实:
1、数据库启动后会分配共享内存(在ORACLE中称为System Global Area[SGA])
2、数据库中X$开头的表都是内存映射表
3、在Linux/Unix下提供了C的Lib库可以访问共享内存(shmat,shmdt,shmget等)
以GV$SESSION_WAIT为例
查看GV$SEESSION_WAIT的定义
通过上述创建视图信息,我们知道v$session_wait是建在X$KSUSECST和X$KSLED两个内存映射表上的,其访问路径是类似下图:
共享内存结构
select ‘0x’||addr from X$KSMMEM where rownum<2;
X$KSUSECST在内存中的位置
获取X$KSUSECST起始地址:
Select min(addr) as BEGIN_ADDR from X$KSUSECST
获取在内存中的记录数:
Select count(*) as RECORD_SZ from X$KSUSECST
X$KSUSECST在内存区域的范围
每个记录数的长度:
Select to_dec(e.addr)-to_dec(s.addr) as LENGTH from (select min(addr) as addr from X$KSUSECST where rownum<2) s, (select max(addr) as addr from X$KSUSECST where rownum<3) e
获取每个字段的偏移量:
通过上述几个信息收集,我们获得了以下信息:
附录
C语言代码:
http://www.doc88.com/p-113695303367.html http://oraperf.sourceforge.net/