一、构建一条比较耗费性能的SQL语句:
-
SQL>
set linesize
200
-
SQL>
select count(*) from all_objects a,all_objects b,all_objects c group by a.object_id;
二、登陆Linux,使用top工具查看进程信息
-
top - 14:39:46 up 9 min, 3 users,
load average:
0.41,
0.51,
0.32
-
Tasks:
381 total,
1 running,
380 sleeping,
0 stopped,
0 zombie
-
Cpu(s):
3.5%us,
2.2%sy,
0.0%ni,
64.5%
id,
28.8%wa,
0.1%hi,
0.9%si,
0.0%st
-
Mem:
2941544k total,
2799796k used,
141748k free,
47072k buffers
-
Swap:
3145724k total,
0k used,
3145724k free,
1024096k cached
-
-
PID
USER PR NI VIRT RES SHR S %CPU %MEM
TIME+ COMMAND
-
5241
oracle
20
0
1502m
132m
49m S
8.6
4.6
0:
04.28
oracle
-
2023 root
0
-20
0
0
0 S
4.6
0.0
0:
05.85 iscsi_q_33
-
4816
oracle
-2
0
1403m
16m
14m S
3.0
0.6
0:
08.61
oracle
-
3865 root RT
-5
693m
154m
63m S
2.0
5.4
0:
10.37 ologgerd
-
4129 grid
-2
0
1306m
15m
12m S
1.7
0.5
0:
09.79
oracle
-
3774 root
20
0
1567m
38m
16m S
1.0
1.3
0:
02.31 orarootagent.bi
-
4191 root
20
0
2205m
66m
26m S
1.0
2.3
0:
07.08 crsd.bin
-
3393 root
20
0
1850m
55m
22m S
0.7
1.9
0:
04.81 ohasd.bin
-
3740 grid
20
0
1836m
41m
16m S
0.7
1.5
0:
02.40 oraagent.bin
-
3776 grid
20
0
559m
39m
12m S
0.7
1.4
0:
02.96 gipcd.bin
-
3828 grid RT
0
1612m
123m
54m S
0.7
4.3
0:
05.42 ocssd.bin
-
4317 root
20
0
962m
28m
14m S
0.7
1.0
0:
03.49 orarootagent.bi
-
4 root
20
0
0
0
0 S
0.3
0.0
0:
00.04 ksoftirqd/
0
-
3928 root
20
0
751m
25m
10m S
0.3
0.9
0:
01.99 octssd.bin
-
3959 grid
20
0
1093m
28m
13m S
0.3
1.0
0:
02.04 evmd.bin
-
4141 grid
20
0
1314m
26m
17m S
0.3
0.9
0:
01.03
oracle
-
4143 grid
20
0
1322m
30m
16m S
0.3
1.1
0:
00.99
oracle
-
4145 grid
-2
0
1321m
31m
17m S
0.3
1.1
0:
01.87
oracle
-
4305 grid
20
0
565m
19m
10m S
0.3
0.7
0:
00.31 scriptagent.bin
-
4479 grid
20
0
2755m
162m
16m S
0.3
5.6
0:
11.50
java
-
4744
oracle
20
0
1103m
33m
16m S
0.3
1.2
0:
02.07 oraagent.bin
-
4832
oracle
20
0
1418m
31m
21m S
0.3
1.1
0:
00.83
oracle
-
4836
oracle
-2
0
1418m
49m
36m S
0.3
1.7
0:
02.26
oracle
-
[root@or11g1 ~]#
从中可以看出,进程号为5241的oracle进程占用CPU资源是最多的
三、查看5241这个oracle进程对应的会话信息
-
SELECT sql_text
FROM v$sqltext a
WHERE (a.hash_value, a.address)
IN
-
(
SELECT
DECODE(sql_hash_value,
0, prev_hash_value, sql_hash_value),
DECODE(sql_hash_value,
0, prev_sql_addr, sql_address)
FROM
-
v$
session b
WHERE b.paddr =(
SELECT addr
FROM v$process c
WHERE c.spid =
'5241'))
ORDER
BY piece
ASC;
或者:
-
SELECT sql_text
FROM v$sqltext a
WHERE (a.hash_value, a.address)
-
IN (
SELECT
DECODE(sql_hash_value,
0, prev_hash_value, sql_hash_value),
DECODE(sql_hash_value,
0, prev_sql_addr, sql_address)
-
FROM v$
session b
WHERE b.paddr =(
SELECT addr
FROM v$process c
WHERE c.spid =
'&pid'))
ORDER
BY piece
ASC;
查询结果如下:
-
SQL>
SELECT sql_text
FROM v$sqltext a
WHERE (a.hash_value, a.address)
IN
-
(
SELECT DECODE(sql_hash_value,
0, prev_hash_value, sql_hash_value),DECODE(sql_hash_value,
0, prev_sql_addr, sql_address)
FROM
-
v$session b
WHERE b.paddr =(
SELECT addr
FROM v$process c
WHERE c.spid =
'5241')) ORDER BY piece ASC; 2 3
-
-
SQL_TEXT
-
----------------------------------------------------------------
-
select count(*)
from all_objects a,all_objects b,all_objects c g
-
roup
by a.object_id
-
-
SQL>
结果显示SQL语句就是我们之前构建的SQL。
在执行如下SQL语句,找出相应的会话信息:
-
select
sid,
serial# ,username,osuser,machine,program,process,to_char(logon_time,
'yyyy-mm-dd hh24:mi:ss')
logon
from
-
v$
session
where paddr
in (
select addr
from v$process
where spid
in(
'5241'));
或者:
-
select
id,
serial# ,username,osuser,machine,program,process,to_char(logon_time,
'yyyy-mm-dd hh24:mi:ss')
logon
-
from v$
session
where paddr
in (
select addr
from v$process
where spid
in(
'&pid'));
执行的结果如下:
到这里,就可以根据SID和SERIAL#来杀掉用户会话了。
alter system kill session '76,21' immediate;
-
SQL> alter
system
kill session
'76,21' immediate;
-
-
System altered.
-
-
SQL>
但是,这要是通过PMON进程来定期清除会话的,因此会有一定的时间间隔,如果情况很紧急,需要立即释放资源,那么就要杀操作系统进程了。
四、找出操作系统进程
select PADDR from v$session where SID=76 and SERIAL#=21;
找出拥有会话的进程地址
然后通过PAAD号找出系统进程号
然后在操作系统上kill -9 5241即可。