我们如何面对Oracle服务器内存耗尽(诊断)

PGA(program global areas) 保存服务进程的数据和控制信息的内存结构,这个内存结构是非共享的,只有服务进程本身才能够访问它自已的PGA区。每个服务进程都有它自已的PGA区,各个服务进程PGA的总和即为实例的PGA区的大小
show parameter pga;
show parameter sga;
show sga;---显示内存分配量(Total SGA与sga_max_size有关,可能比v$sgastat的和要多一些)
show parameter size;
select * from v$pgastat;
select sum(bytes) from v$sgastat;---显示实际内存使用量
--查查看都是哪些process占用内存多(从下面这个查询可以看到v$session s, v$sesstat st, v$statname sn, v$process p这四个动态视图之间的关系)
SELECT s.SQL_ADDRESS,s.MACHINE,s.PROGRAM,s.LOGON_TIME,s.P ROCESS,server, s.username, s.osuser, sn.NAME, st.VALUE / 1024 / 1024, s.SID, s.serial#, p.spid
FROM v$session s, v$sesstat st, v$statname sn, v$process p
WHERE st.SID = s.SID
AND st.statistic# = sn.statistic#
AND sn.NAME LIKE 'session pga memory'
AND p.addr = s.paddr
AND VALUE > 10 * 1024 * 1024 --only show pga > 10M
ORDER BY VALUE DESC

---然后通过查询v$sqlarea可得到该process正在执行的sql语句
select t.SQL_TEXT,t.ADDRESS from v$sqlarea t where t.ADDRESS='上面的SQL_ADDRESS'
-------------------------------------------------- --------
Usage: orakill sid thread
where sid = the Oracle instance to target
thread = the thread id of the thread to kill
The thread id should be retrieved from the spid column of a query such as:
select spid, osuser, s.program from
v$process p, v$session s where p.addr=s.paddr
或者:
select sid,serial#,username,program,machine,status from v$session;
然后
alter system kill session 'SID,SERIAL#';
注意,上例中SID为1到7(USERNAME列为空)的会话,是Oracle的后台进程,不要对这些会话进行任何操作。
-------------------------------------------------- --------
v$process
这个视图提供的信息,都是oracle服务进程的信息,没有客户端程序相关的信息
服务进程分两类,一是后台的,一是dedicate/shared server
pid, serial# 这是oracle分配的PID
spid 这才是操作系统的pid(实际上是oracle进程中的线程)
program 这是服务进程对应的操作系统进程名
标签: 暂无标签
oraunix

写了 199 篇文章,拥有财富 1026,被 339 人关注

转播转播 分享分享 分享淘帖
回复

使用道具

P4 | 发表于 2012-9-15 13:46:53
顶顶顶顶顶顶顶顶顶顶
回复

使用道具

您需要登录后才可以回帖 登录 | 加入社区

本版积分规则

意见
反馈