公司一个项目,在8个省都有部署,用到的是SUN 490的服务器 oracle 9i数据库,因为数据量小,所有文件都存放在本地硬盘。开发在部署应用的时候,反映经常出现数据库无法登陆的情况,删除表也非常慢,这个问题到我这,我进行了一个简单的处理。
首先查找数据库和监听日志,没看到任何异常。但是的确,业务比较繁忙的时候sqlplus登录,它就停在那,一动不动。
接着检查内存参数,发现sga和pga都用的是安装时的默认设置,随即根据主机物理内存的大小调整了内存参数,问题得到了缓解。
但还是觉得删数据慢,让开发检查了表的索引,并且进行了重建,问题依旧;
这个时候只能够看statspack报告了,在忙时收集了一个报告,发现数据库的等待事件都和IO有关。这才想到,没错,一共2个本地硬盘,还做了镜像,除操作系统外,redo日志、数据文件都放在这两个硬盘上,可以想象,磁盘的IO将会是多么繁忙。
如何才能让磁盘IO降下来呢?
1、调整undo_retenion的值,从默认的10800调到了150,这样undo表空间的压力就小了很多,表空间的物理表现就是数据文件,至少这个数据文件的写就少了不少;
2、redo日志是大头,开始用的是3组50M,每组2个成员的redo日志,业务繁忙的时候,可以看到redo在快速地进行切换,而且查看状态,没有一组是inactive的,这说明redo没有及时地刷到数据文件中。于是将redo调整成5组,每组1个成员,每个成员150M。这样redo向数据文件刷新的压力就小了,且lgwr每次只用写一个文件,还是减少了IO。
这么调整完,开发测试后反映:
之前存在的问题全部消失。
总结:
问题发生,要透过问题的现象看到本质,如何看到本质,就需要理解其内部的运行机制。
阅读(1454) | 评论(0) | 转发(0) |