一、造成系统慢的原因初步介绍
系统运行过程中,用户反映速度慢,作为DBA,应该怎么去查找系统慢的原因?首先需要运行操作系统的当前运行状态,使用一些命令,如VMSTAT、 SAR、SWAPINFO等,观察系统当前的CPU、内存、磁盘、系统缓存等目前运行状态,判断这些系统资源是否存在瓶颈,如果是这些资源的原因而造成系 统存在瓶颈,建议先在硬件资源上进行升级更新。
如果排除了硬件及操作系统的原因,对于数据库来说,需要判断系统慢的原因,建议在繁忙时期生成STATSPACK报告,并根据报告的结果才能得到比较准确 的判断。对于DBA来说,系统变慢的时候,可以运行一些脚本去检测,常见的问题有锁未及时释放、SQL本身需要优化等原因。下面我们就主要就这两种情况进 行讲解。
二、几种常见的故障检测及解决方法
1、对于锁冲突而引起的系统等待故障:
(1)首先判断当前是否存在进程锁等待的情况:
select * from v$session where lockwait is not null;
(2)如果存在,可以进一步判断是哪个进程占住了锁使得其他的进程在等待。如果这是第一次使用,需要安装ORACLE的内部视图,方法如下:使用SYS用户登上数据库服务器的SQL*PLUS,运行如下SQL命令安装检测锁冲突的系统视图:
@?/rdbms/admin/catblock.sql
(3)使用以下命令可以查看系统当前锁的情况:
@?/rdbms/admin/utllockt.sql
(4)由于某些特殊情况,一些进程一直没有释放锁,使得其他进程无法使用锁住的数据而一直在等待,做为DBA,可以将这些异常的进程找出来并 KILL掉,使系统恢复正常。
找出锁住别的进程的进程sid和serial#:
SELECT sid, serial#
FROM v$session
WHERE sid in (SELECT holding_session FROM dba_waiters);
将这些进程KILL掉:
ALTER SYSTEM
KILL SESSION 'sid,serial#';
以上介绍的是一种常用的方法,用来解决因锁冲突而引起故障,但是由于以上脚本也有些需要申请锁,因此有时也会出现等待的情况,因此建议大家也可以使用OEM工具中的Lock Manager来处理这种情况。
2、对于因SQL语句原因造成系统慢:
这种情况一般CPU负荷运行时比较满,因此我们可以使用TOP进程观察当前最忙的几个进程分别是什么,如果是ORACLE的前台进程,有可能是此进程造成系统目前比较慢。
记下此进程的PID,使用如下SQL语句查找当前的进程:
select a1.*,a2.* from v$session a1,v$process a2 where a1.paddr=a2.addr and a2.spid=&pid;
对此进程进行分析,看其当前在运行的SQL语句
可以使用以下SQL查看某个进程正在运行的SQL
select sql_text from v$sql where address =(select a1.sql_address from v$session a1,v$process a2 where a1.paddr=a2.addr and a2.spid=&pid);
也可以使用TOAD或OEM工具,对某个SESSION进行查看,可以看到目前SESSION正在运行的SQL语句。
可以使用OEM工具中的TOP SQL,查看系统中对性能影响比较大的SQL语句,具体使用为:选择工具-》Diagnostic Pack-》Top SQL.