问题描述

1 、应用连接数据异常缓慢,包括客户端使用 plsql 连接;
2 、数据库主机 cpu 占用率居高不下, IO 写入居高不下。
3 、主机日常维护操作响应慢,如 man w

分析问题

Ø 系统及oracle 应用为什么响应慢<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />

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 <?xml:namespace prefix = st1 ns = "urn:schemas-microsoft-com:office:smarttags" />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