项目上线后,数据库难免有时会出现一些异常情况,尤其是刚上线阶段。
以下是一些平时积累的简单的数据库查询sql,可以配合实际情况进行问题排查。
按主机名统计连接数
select MACHINE,count(*) from v$session group by MACHINE order by 2 desc;
检查表锁
select object_name as 对象名称,s.sid,s.serial#,p.spid as 系统进程号
from v$locked_object l , dba_objects o , v$session s , v$process p
where l.object_id=o.object_id and l.session_id=s.sid and s.paddr=p.addr;
kill锁
ALTER SYSTEM KILL SESSION '2118,31521'
查异常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;
根据sid查询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.sid='2020') ----查找耗时长的session
ORDER BY piece ASC;
查询目前有哪些语句存在硬解析(未绑定变量方式)
select substr(sql_text,1,50),count(*) from v$sqlarea group by substr(sql_text,1,50) having count(*) > 250 order by count(*);
select sql_id , sql_text , module from v$sqlarea where sql_text like '%&name%' and rownum < 20;
一般的异常排查,都是根据报错内容,结合系统的具体代码,从代码方面开头进行检查,大多都是具体的sql、数据库事务问题引起。但有时候数据库的异常,没有具体的报错,也似乎与后台代码、进程联系不起来。
这种情况下的排查,可以从以下两个方面入手:
- 连接情况:
数据库的连接数异常增高,会影响数据库的查询效率,甚至导致大量访问被拒绝。
对于数据库连接情况,可以根据以下步骤来检查:
- 检查数据库的连接数,是否超过正常连接量。
- 用户的连接数量如何,各自检查,并对比,是否有哪个用户的连接数量比其他用户多很多。
- 具体服务器的连接数量,各自检查,并与其他服务器进行对比。
- 具体的库的连接数量,根据不同的系统业务,可能有些库的连接量会远超其他库。但也同样可以排除那些连接量少的库。
- 阻塞情况:
阻塞情况的产生,也是不容易从系统代码上进行排查,毕竟一个系统的业务复杂起来,很难分辨清互相之间的事务影响。但一旦发生阻塞,就容易导致数据库查询异常缓慢、甚至系统崩溃。
对于阻塞的情况,可以按以下步骤来排查:
- 查看阻塞情况
- 查找阻塞源头
- 被阻塞时间最长的进程