数据库系统繁忙的维护办法
最近mSwitch、IPTV的系统维护中,经常遇到数据库繁忙、各种业务反
应极慢的情况。此时查询数据库CPU占用率,IDLE接近于0。
一(检查操作系统
首先登陆主机,执行top命令,一般会发现CPU资源几乎消耗殆尽,存在很多占用CPU很高的进程,而
内存和I/O都不高,具体如下:
last pid: 26136; load averages: 8.89, 8.91, 8.12
216 processes: 204 sleeping, 8 running, 4 on cpu
CPU states: 0% idle, 97.3% user, 1.8% kernel, 0.8% iowait, 0.0% swap
Memory: 8192M real, 1166M free, 14M swap in use, 8179M swap free
PID USERNAME THR PRI NICE SIZE RES STATE TIME CPU COMMAND
25725 oracle 1 50 0 4550M 4508M cpu2 12:23 11.23% oracle
25774 oracle 1 41 0 4550M 4508M run 14:25 10.66% oracle
26016 oracle 1 31 0 4550M 4508M run 5:41 10.37% oracle
26010 oracle 1 41 0 4550M 4508M run 4:40 9.81% oracle
26014 oracle 1 51 0 4550M 4506M cpu6 4:19 9.76% oracle
25873 oracle 1 41 0 4550M 4508M run 12:10 9.45% oracle
25723 oracle 1 50 0 4550M 4508M run 15:09 9.40% oracle
26121 oracle 1 41 0 4550M 4506M cpu0 1:13 9.28% oracle
二(查看数据库的告警日志ALERT文件
我们的数据库告警日志一般在$ORACLE_BASE/admin/ORCL/bdump下,文件名为:
alert_ORCL.log。查看文件中是否有’ora-‘,’err’,’not complete’等信息。一般来讲,我们的数据库系统比较
健壮,其本身一般不存在问题。
三(查询CPU占用率较高的SQL语句。
(1)比较常见的情况是某些进程占去了大量的CPU。
top命令中CPU占用率最高的几个pid,并执行如下查询: Select a.username,a.osuser,a.program,spid,sid,a.serial#
From v$session a, v$process b Where a.paddr =b.addr
And b.spid='&pid';
(2)可以得到那个程序、那个用户占用了较多的CPU
根据得到的sid,serial#,查询此程序所运行的sql语句
Select b.username, a.sql_text From V$sql a, V$session b Where b.sql_address=a.address And b.sql_hash_value=a.hash_value And b.sid=&sid
And b.serial#='&serial';
四(处理办法:
确认占用较高内存的程序可以杀掉后(不影响业务或系统),将快速KILL掉CPU占用率最高的session以及进程。
ps -ef|grep 15607
oracle 15607 1 5 20:58:57 ? 50:37 oracleORCL (LOCAL=NO)
kill -9 15607
进入数据库系统,
alter system kill session '154,56090' immediate;
154是 上面语句查询到的sid,56090是serial#
需要注意的是:如果在操作系统中没有kill掉cpu占用率较高的进程,仅使用数据库kill session命令的话,系统资源释放将很缓慢。