① 如何查看oracle数据库中哪些session异常阻塞了系统
Oracle数据库运维过程中有时会遇到一种异常情况,由于错误的操作或代码BUG造成session异常地持有锁不释放,并大量阻塞系统对话。这时候需要找出造成异常阻塞的session并清除。 oracle session通常具有三个特征: (1)一个session可能阻塞多个session; (2)一个session最多被一个session阻塞; (3)session阻塞关系不会形成环路。(环路即死锁,oracle能自动解除) 因此session的阻塞关系为一棵树,进而DB系统所有session的BLOCK阻塞关系是一个由若干session阻塞关系树构成的森林,而异常session一定会在故障爆发时成为根(root)。因此,找寻异常锁表session的过程就是找出异常的root。 一般认为异常root有两个特征:(1)block树的规模过大,阻塞树规模即被root层层阻塞的session总数;(2)阻塞的平均等待时间过长。 查找异常session的方法一: OEM—> performance—> Blocking Sessions 查找异常session的方法二: select r.root_sid, s.serial#, r.blocked_num, r.avg_wait_seconds, s.username,s.status,s.event,s.MACHINE, s.PROGRAM,s.sql_id,s.prev_sql_id from (select root_sid, avg(seconds_in_wait) as avg_wait_seconds, count(*) - 1 as blocked_num from (select CONNECT_BY_ROOT sid as root_sid, seconds_in_wait from v$session start with blocking_session is null connect by prior sid = blocking_session) group by root_sid having count(*) > 1) r, v$session s where r.root_sid = s.sid order by r.blocked_num desc, r.avg_wait_seconds desc; 该SQL语句即是根据v$session的字段blocking_session统计阻塞树根阻塞session的计数以及平均阻塞时间、并进行排序,排名最前的往往是异常session。 另外需要注意的是,持有锁时间最长、或等待时间最长的session都不一定是造成阻塞的根源session!
② 如何修改 Oracle 的process和Session
oracle的session和process的区别与分析
session
和
process的区别:
连接connects,会话sessions和进程pocesses的关系
每个sql
login称为一个连接(connection),而每个连接,可以产生一个或多个会话,如果数据库运行在专用服务器方式,
一个会话对应一个服务器进程(process),如果数据库运行在共享服务器方式,一个服务器进程可以为多个会话服务。
session
和
process的关系,tom在他的书里写的很清楚了
一个process可以有0个,1个或者多个session
一个session也可以存在这个或者那个process中
oracle中session跟process的研究
使用方法:
首先看看v$session跟v$processwww.hbbz08.com
中主要的字段属性:
v$session(sid,serial#,paddr,username,status,machine,terminal,sql_hash_value,sql_address,,,)
v$process(addr,spid,,,)
可看到v$session中的paddr跟v$process中的addr对应,也即会话session在数据库主机上对应进程的进程地址.
这里我们要先定位该session正在执行的sql语句,此时我们可以查询如下的语句:
select
sql_text
from
v$sqltext_with_newlines
where
(hash_value,address)
in
(select
sql_hash_value,sql_address
from
v$session
where
sid=&sid)
order
by
address,piece;
③ oracle一个sql窗口是一个session吗
是的,一个sql窗口,就是一个新的连接,一个连接就是一个Session
④ 怎么查找oracle比较慢的session和SQL
数据库管理员可以执行下述语句来查看SQL语句的解析情况:
SELECT * FROM V$SYSSTAT WHERE NAME IN ('parse_time_cpu','parse_time_elapsed','parse_count_ hard');
这里:
①parse_time_cpu:是系统服务时间。
②parse_time_elapsed:是响应时间。
而用户等待时间为:
waite_time = parse_time_elapsed – parse_time_cpu
(2)
数据库管理员还可以通过下述语句,查看低效率的SQL语句:
SELECT BUFFER_GETS,EXECUTIONS,SQL_TEXT FROM V$SQLAREA;
优化这些低效率的SQL语句也有助于提高CPU的利用率。
⑤ 如何查找Oracle session的历史记录
1. 查看性能最差的前100sql
SELECT * FROM ( SELECT PARSING_USER_ID EXECUTIONS,SORTS,COMMAND_TYPE,DISK_READS,sql_text
FROM v$sqlarea
ORDER BY disk_reads DESC)
WHERE ROWNUM<100
2.oracle 10g 查看某session的历史执行sql情况(sql采样间隔1s)
oracle 10g 通过v$active_session_history查看某session(这里指定为190)的历史执行sql情况(sql采样间隔1s)
select s.SAMPLE_TIME,
sq.SQL_TEXT,
sq.DISK_READS,
sq.BUFFER_GETS,
sq.CPU_TIME,
sq.ROWS_PROCESSED,
--sq.SQL_FULLTEXT,
sq.SQL_ID
from v$sql sq, v$active_session_history s
where s.SQL_ID = sq.SQL_ID
and s.SESSION_ID = 190
order by s.SAMPLE_TIME desc;
⑥ oracle中V$session 表中各个字段的中文说明是什么
SADDR - session address
SID - session identifier 常用于链接其他列
SERIAL# - SID有可能会重复,当两个session的SID重复时,SERIAL#用来区别session(说白了某个session是由sid和serial#这两个值确定的)
AUDSID - audit session id。可以通过audsid查询当前session的sid。select sid from v$session where audsid=userenv('sessionid');
PADDR - process address,关联v$process的addr字段,通过这个可以查询到进程对应的session
USER# - 同于dba_users中的user_id,Oracle内部进程user#为0.
USERNAME - session's username。等于dba_users中的username。Oracle内部进程的username为空。
COMMAND - session正在执行的sql id,1代表create table,3代表select。
TADDR - 当前的transaction address。可以用来关联v$transaction中的addr字段。
LOCKWAIT - 可以通过这个字段查询出当前正在等待的锁的相关信息。sid + lockwait与v$loc中的sid + kaddr相对应。
STATUS - 用来判断session状态。Active:正执行SQL语句。inactive:等待操作。killed:被标注为杀死。
SERVER - 服务类型。
SCHEMA# - schema user id。Oracle内部进程的schema#为0。
SCHEMANAME - schema username。Oracle内部进程的为sys。
OSUSER - 客户端操作系统用户名。
PROCESS - 客户端process id。
MACHINE - 客户端machine name。
TERMINAL - 客户端执行的terminal name。
PROGRAM - 客户端应用程序。比如ORACLE.EXE或sqlplus.exe
TYPE - session类型。
SQL_ADDRESS,SQL_HASH_VALUE,SQL_ID,SQL_CHILD_NUMBER - session正在执行的sql状态,和v$sql中的address,hash_value,sql_id,child_number对应。
PREV_SQL_ADDR,PREV_HASH_VALUE,PREV_SQL_ID,PREV_CHILD_NUMBER - 上一次执行的sql状态。
MODULE,MODULE_HASH,ACTION,ACTION_HASH,CLIENT_INFO - 应用通过DBMS_APPLICATION_INFO设置的一些信息。
FIXED_TABLE_SEQUENCE - 当session完成一个user call后就会增加的一个数值,也就是说,如果session挂起,它就不会增加。因此可以根据这个字段来监控某个时间点以来的session性能情况。例如,一个小时前某个session的此字段数值为10000,而现在是20000,则表明一个小时内其user call较频繁,可以重点关注此session的performance statistics。
ROW_WAIT_OBJ# - 被锁定行所在table的object_id。和dba_object中的object_id关联可以得到被锁定的table name。
ROW_WAIT_FILE# - 被锁定行所在的datafile id。和v$datafile中的file#关联可以得到datafile name。
ROW_WAIT_BLOCK# - 同上,对应块。
ROW_WAIT_ROW# - session当前正在等待的被锁定的行。
LOGON_TIME - session logon time.
⑦ oracle 怎么跟踪有问题session 的sql
selectsid,v$session.serial#,v$process.spid,v$session.username,last_call_et,status,LOCKWAIT,machine,logon_time,sql_textfromv$session,v$process,v$sqlareawherepaddr=addrandsql_hash_value=hash_valueandv$session.usernameisnotnullandsql_textnotlike'%session%'andstatus='ACTIVE'orderbylast_call_etdesc;
查询当前正在执行的sql及执行用时,如果对性能优化查看sql效率要set autotrace on;然后执行sql查看执行计划。
⑧ Oracle的session和process的区别与分析
session 和 process的区别:
连接connects,会话sessions和进程pocesses的关系
每个sql login称为一个连接(connection),而每个连接,可以产生一个或多个会话,如果数据库运行在专用服务器方式,
一个会话对应一个服务器进程(process),如果数据库运行在共享服务器方式,一个服务器进程可以为多个会话服务。
session 和 process的关系,tom在他的书里写的很清楚了
一个process可以有0个,1个或者多个session
一个session也可以存在这个或者那个process中
oracle中session跟process的研究
使用方法:
首先看看v$session跟v$processwww.hbbz08.com 中主要的字段属性:
v$session(sid,serial#,paddr,username,status,machine,terminal,sql_hash_value,sql_address,,,)
v$process(addr,spid,,,)
可看到v$session中的paddr跟v$process中的addr对应,也即会话session在数据库主机上对应进程的进程地址.
这里我们要先定位该session正在执行的sql语句,此时我们可以查询如下的语句: select sql_text
from v$sqltext_with_newlines
where (hash_value,address) in (select sql_hash_value,sql_address from v$session where sid=&sid) order by address,piece
⑨ 在Oracle中session和process的区别
Oracle的session和process的区别与分析
session 和 process的区别:
连接connects,会话sessions和进程pocesses的关系
每个sql login称为一个连接(connection),而每个连接,可以产生一个或多个会话,如果数据库运行在专用服务器方式,
一个会话对应一个服务器进程(process),如果数据库运行在共享服务器方式,一个服务器进程可以为多个会话服务。
session 和 process的关系,tom在他的书里写的很清楚了
一个process可以有0个,1个或者多个session
一个session也可以存在这个或者那个process中
oracle中session跟process的研究
使用方法:
首先看看v$session跟v$processwww.hbbz08.com 中主要的字段属性:
v$session(sid,serial#,paddr,username,status,machine,terminal,sql_hash_value,sql_address,,,)
v$process(addr,spid,,,)
可看到v$session中的paddr跟v$process中的addr对应,也即会话session在数据库主机上对应进程的进程地址.
这里我们要先定位该session正在执行的sql语句,此时我们可以查询如下的语句: select sql_text
from v$sqltext_with_newlines
where (hash_value,address) in (select sql_hash_value,sql_address from v$session where sid=&sid) order by address,piece;
⑩ Oracle数据库,PLSQLsession几分钟不用就自动断开,自己也没设置超时自动断开啊,怎么让它不断呢
1. tnsping 本地连接串 看看返回毫秒数是否正常2.关闭本机和服务器防火墙尝试,一般PLSQL会发起一个反向连接,服务器如果有防火墙的话会阻止连接导致PLSQL等待连接响应,就会出现假死现象了。你可以先试试看,不行就贴错误代码和配置,探讨探讨。