v$process v$sesson 通过会话号查找进程号 查看会话信息

–进程视图

v$process

–会话视图

v$session 

v$mystat

v$sql 

v$transaction

v$lock

v$transaction.ADDR=v$lock.ADDR 

v$lock.SID=v$session.SID

v$session.SQL_ID=v$sql.SQL_ID

v$session.PADDR=v$process.SPID

查看有哪些进程

[oracle@orale ~]$ ps -ef |grep LOCAL |grep -v grep

oracle    4245  4202  0 09:18 ?        00:00:02 oraclemypl (DESCRIPTION=(LOCAL=YES)(ADDRESS=(PROTOCOL=beq)))

oracle    4298     1  0 09:20 ?        00:00:00 oraclemypl (LOCAL=NO)

当连接oracle后会自动分配一个会话号

–查当前会话号

SQL> select distinct sid from v$mystat;

       SID

———-

        17

–通过会话号查进程号

SQL> select a.spid from v$process a ,v$session b where a.addr=b.paddr and b.sid

in (select sid from v$mystat where rownum=1); 

SPID

————————

4298

–通过进程号查会话号

SQL> select b.sid from  v$process a ,v$session b where a.addr=b.paddr and a.spid=4298;

       SID

———-

        17

–查看进程占用的CPU内存情况

[oracle@orale ~]$ ps aux|grep 4298

oracle    4298  0.0  2.5 772120 37076 ?        Ss   09:20   0:00 oraclemypl (LOCAL=NO)

oracle    8317  0.0  0.0   3920   660 pts/2    R+   15:04   0:00 grep 4298

[oracle@orale ~]$ ps aux |grep oracle

oracle    4245  0.0  4.8 774612 70128 ?        Ss   09:18   0:02 oraclemypl (DESCRIPTION=(LOCAL=YES)(ADDRESS=(PROTOCOL=beq)))

oracle    4248  0.0  1.0 770252 14792 ?        Ss   09:18   0:00 ora_qmnc_mypl

oracle    4263  0.0  3.5 773904 51968 ?        Ss   09:18   0:08 ora_cjq0_mypl

oracle    4267  0.0  1.8 771808 26480 ?        Ss   09:19   0:00 ora_q000_mypl

oracle    4271  0.0  1.0 770248 15628 ?        Ss   09:19   0:00 ora_q002_mypl

oracle    4298  0.0  2.5 772120 37076 ?        Ss   09:20   0:00 oraclemypl (LOCAL=NO)

root      4332  0.0  0.0   4920  1236 pts/2    S    09:20   0:00 su – oracle

oracle    4333  0.0  0.1   4668  1496 pts/2    S    09:20   0:00 -bash

oracle    4395  0.0  0.9 770252 13860 ?        Ss   09:23   0:00 ora_smco_mypl

oracle    5766  0.0  2.6 772112 38864 ?        Ss   10:48   0:00 oraclemypl (LOCAL=NO)

oraclemypl (LOCAL=NO)表示用户连上来的 其他的后台进程是查看不了的

例如看到某个进程占用内存CPU很大 

–通过进程号查会话号

SQL> select b.sid from  v$process a ,v$session b where a.addr=b.paddr and a.spid=4298;

       SID

———-

        17

–通过会话号查看会话的所有操作

select * from v$session where sid=17;  

[oracle@orale ~]$ kill -9 5766  –强制干掉某个进程

v$session 视图一些重要的字段

v$session.TADDR = v$transaction.addr = v$lock.addr

v$session.lockwait = v$lock.kaddr

字段 STATUS    ACTIVE活跃  表示sql正在执行或被阻塞  等待-锁 (没有commit) 

字段TADDR 事务/锁的地址 = v$transaction.addr = v$lock.addr  v$tran 如果有值就有事务

字段SQL_ID
如果有值要么SQL正在执行,要么被阻塞了 肯定是ACTIVE状态

利用v$session.SQL_ID 可以找出被阻塞的语句

select sql_text from v$sql where sql_id =”;

select a.SQL_TEXT from v$sql a ,v$session b where a.SQL_ID=b.SQL_ID;

字段ROW_WAIT_OBJ#  dba_objects.object_id=  通过对象ID可以找出表名

字段BLOCKING_SESSION_STATUS 阻塞状态  VALID 表示被阻塞了

字段BLOCKING_SESSION 被哪个会话阻塞了 (没有commit的会话)

字段STATE 等待事件 enq: TX – row lock contention 行锁争用(两个对话同时执行同一行

知道是被哪个会话阻塞了就好办了

SQL> select sid,serial# from v$session where sid=35;

       SID    SERIAL#

———- ———-

        35         45

查看事物

select * from v$transaction;

–确认后执行下面的语句就可以干掉

SQL> alter system kill session ‘35,45’;

System altered.

    原文作者:常语
    原文地址: https://blog.csdn.net/u011631923/article/details/16994737
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞