问题描述
1
、应用连接数据异常缓慢,包括客户端使用
plsql
连接;
2
、数据库主机
cpu
占用率居高不下,
IO
写入居高不下。
3
、主机日常维护操作响应慢,如
man
或
w
;
分析问题
Ø
系统及oracle
应用为什么响应慢
1
、为什么系统连
w
这么简单的操作都会觉得卡呢?
2
、为什么没有任何应用接入的情况下,数据库会有大量的写入操作呢?
Top
//
查看
cpu
使用情况,发现
iowait%
占用了大量的
cpu
时间;
Iostat –mx 2 100
查看
disk
使用情况,发现磁盘利用率长时间处于
100%
状态;将系统响应慢定位在
io
请求过多导致。(关于
iostat
的使用参见
man
)。
Ø
什么导致出现如此之多的IO
请求呢?
在观察后台的进程,发现有
ora_p000...ora_p015.
共
16
个进程在运行。
我机器物理上
2
颗
CPU
,共有
8
个
core
(
Cat /proc/cpuinfo
可以看到机器cpu
信息
)。
运行
Sqlplus “/as sysdba”
进入
sql
命令行查看
rollback
相关参数,
Show parameter rollback
看到
FAST_START_PARALLEL_ROLLBACK = LOW
,此参数为默认设置为
LOW
,表明并行运行的回滚进程有
2*number of cpu
,在我的系统刚好表现为
16
个进程。与我使用
ps –ef | grep ora_p
看到的
ora_p000_*0**
到
ora_p015_***
进程对应。
Ø
为什么会有如此多的回滚进程出现呢?
经过询问项目组相关人员,发现有人在执行
imp
导入时,手动终止了。拿到该同事的
imp
语句一看清楚了,由于导入的数据量较大,又没有逐行提交(
commit=y
),异常终止后产生大量的回滚动作。
Ø
回滚慢操作为什么慢:
View $ORACLE_BASE/admin/$ORACLE_SID/bdump/alter_<ORACLE_SID>.log
查看
oracle alert
日志,发现大量的
Checkpoint not completed
,表明
redo
文件组太少,导致
LGWR
进程在切换到新
redo file
时,等待旧数据写入
(dbwn)
数据文件;
解决办法就是增加
redo file
组;
Alert database add logfile group 4(‘/u01/app/oracle/oradata/oracl/redo04.log’) size 100M;
Alert database add logfile group 5(‘/u01/app/oracle/oradata/oracl/redo05.log’) size 100M;
Alert database add logfile group 6(‘/u01/app/oracle/oradata/oracl/redo06.log’) size 100M;
根据需要可添加更多的
redo
文件组。
Select group#,members,status from v$log;
发现有
inactive
出现就可以了。
Redo
文件处在
active
状态说明
redo
文件还没写入在数据文件中,若此时
LGWR switch
切换到
active
文件,将在
alert
日志中出现
Checkpoint
未完成告警。
需要说明的是:回滚操作由于要写入
redo
文件,其本身就是很消耗系统资源的。
结论
当在
Oracle Database 10g
中回滚长期运行的事务时,无论是并行实例恢复会话还是用户执行的回滚语句。您所需做的一切就是查看视图
V$SESSION_LONGOPS
并评估还需要多少时间。
项目中该数据库每月定期要导入大量数据。通过对导入数据期间
LGWR switch
出现频率的观察,发现
LGWR switch
切换过于频繁,需要对
redo File
进行优化,建议设置
16
个
group
,每个
group member
大小为
200M
。
另外,需要对导入脚本进行优化,
imp dw/cnfj_bts_dw file=call_gaa_551_200906.dmp full=y ignore=y feedback=50000 buffer=10240000 commit=y indexes=n log=’/home/imp200909.log’;
附录:
1
、停止并行回滚,减少IO
请求,快速提升系统响应能力
如果你没时间等待回滚进程完成回滚操作,可根据如下提示进行操作。
最后在
google
上根据
ora_p001, wait for a undo record
的关键字,找到了一些信息,以下信息引起了我的注意:
Oracle
工程师首先怀疑是临时表空间空间不足导致,经检查临时表空间没有空间不足的情况,仔细观察日志发现重做日志文件不断切换,分析应该是有较多的事务没有完成提交或者有较多没有提交的事务完成回滚。现在面临的问题是我们没有很多时间去等待所有的事务去完成回滚或提交。解决问题的思路就是如何尽快结束这些事务的回滚或提交。
1)
查看
spfile
文件中是否有
fast_start_parallel_rollback
参数的设置,检查结果
G
网数据库没有设置该参数。如果没有显式设置,则该参数的默认值为
low
。修改该参数值为
false
2)
将数据库启动到
nomount
状态:
startup nomount
3)
修改改参数值:
alter system set fast_start_parallel_rollback = FALSE scope=spfile
4) shutdown immediate
关闭数据库
5) startup
启动
6)
查看该参数是否生效:
show parameter fast_start_parallel_rollback
7)
等待一段时间
8) shutdown immediate
数据库可以关闭
2
、加快回滚速度
提高并行回滚进程的数量,设置为
HIGH
时回滚进程
=4*cpu
数。在
sql
命令行模式下执行
ALTER SYSTEM SET FAST_START_PARALLEL_ROLLBACK = HIGH
摘自:http://sysadmin.blog.51cto.com/83876/203502