今天早上去一公司合作伙伴那里,协助处理他们某客户的数据库性能问题,那个库是Oracle 10.2.0.1的,前台业务系统是政府某机构查询系统,碰到的问题是首页展示很慢,与之相关的SQL语句查询结果须要跑59s多。而其它页面相关模块的查询都仅仅须要几秒就能够出结果了。

碰到数据库性能问题通常从两个方面着手调整:
1. 内存參数调整
2. SQL语句优化

因此。首先就查看了该库的SGA參数,发现仅仅分配了1.2G。而数据库server的物理内存为8G,显然这个值太小了。拉了一份AWR报告,显示shared pool仅仅分配到了200多M。简直少的令人发指。这个数据库是执行在Windows
2003 Enterprise x64上面的,因此应该不存在SGA不能超过1.7G的限制,于是对SGA參数进行调整,目标是调整到OS物理内存的50%。即SGA=4G。

因为開始并未设置过sga_max_size的值,所以当调整实例sga_target为某个固定的值再重新启动后,假设sga_target的值大于sga_max_size的值。那么sga_max_size的值就会随着sga_target自己主动添加为同样的值,反之,则不会变。此时这2个值都是1200M。虽然sga_target是动态參数。但此时是不同意调大的,当我们须要设置sga_target=4G。就超过了sga_max_size的值,数据库会报错,所以,要调大SGA。还必须先改动sga_max_size,而该參数是静态參数。也就意味着须要停库。中午向客户申请了20分钟的停机时间,然后着手对该參数进行调整。

依次运行下面命令:

SQL> alter system set sga_max_size=4G scope=spfile;

SQL> shutdown immediate

当再次启动数据库的时候。碰到了问题。报了ora-27102: out of memory

SQL> startup
ORA-27102: out of memory
OSD-00022: Message 22 not found;  product=RDBMS; facility=SOSD
O/S-Error: (OS 8) Not enough storage is available to process this command.
SQL>

之后不管是关闭或者启动数据库,哪怕仅仅是启动到mount,都会报ora-27100错误:

SQL> shutdown immediate;
ORA-01034: ORACLE not available
ORA-27101: shared memory realm does not exist
SQL> startup;
ORA-27100: shared memory realm already exists
SQL>

看来是设置sga_max_size=4G,造成了oracle占用OS内存过大,导致数据库无法启动,这里比較纳闷。为何设置SGA为物理内存的50%也会报错呢?Windows又不像Linux/Unix那样,还有个maxshmall的限制

因为是在spfile中改动的sga_max_size的值。如今数据库却无法启动了。因为还未进入到oracle实例。spfile也无法再次改动回来,相当于spfile被人为地损坏了。更糟糕的是,之前改动參数值的时候,忘记先生成一个pfile作为备份了,这可麻烦了。还好測试库上有一个相同10g实例,于是生成一个pfile,然后改动当中的路径及实例名为生产库的值后进行替换,复制到生产库的%ORACLE_HOME/database以下,再用这个pfile来启动数据库

SQL> startup pfile=E:\oracle\app\product\10.2.0\db_1\database\initnt.ora;
ORA-27100: shared memory realm already exists

错误依旧存在,难道数据库就这样无法启动了嘛?当然不会。这但是生产库,停了以后业务就都挂了,眼看20分钟的停机时间就要到了。


事实上,在windows上执行的oracle实例有一点特殊,假设启动数据库实例时。因为sga_max_size设置过大而造成实例启动失败,虽然把实例启动。但此时仍然会有一个错误的实例存在。因而会导致shutdown
immediate及shutdown abort都关闭不了。也无法startup,始终会报ora-27100。这是由于在缺省安装时,oracle实例的服务(oracleSERVICESID)会在windows启动时自己主动启动,且每次启动服务时,都会自己主动用默认的spfile启动实例(假设存在的话)。因此就导致了一直出现ora-27100的内存错误。


知道了这个机制,那么再处理之前的内存错误就非常easy了,先把错误的那个spfile删除掉。然后停止oracle实例对应的服务,再又一次把服务起来,再用pifle启动数据库就可以

SQL> startup pfile=E:\oracle\app\product\10.2.0\db_1\database\initnt.ora;

这次数据库不在报ora-27100了,可是仍然会报ora-27102,这是怎么了。来来回回出现同样的问题,后来通过一次次的尝试,最终发现了一个事实,就是在pfile中设置成2G、3G时。再用之前的方法启动数据库,数据库都能够正常启动,只有设置成4G时,就会出现ora-27102。

仅仅能接受这个现实了。

于是就把sga_max_size设置为3G,sga_target也调整为3G,好歹也是比之前1G要多了2倍了。又一次启动数据库之后,再用pfile又一次创建了一个正确的spfile,调整SGA的任务算是完毕了


SQL> alter system set sga_target=3G scope=both;
SQL> create spfile from pfile;
SQL> shutdown immediate;
SQL> startup    --用spfile再次启动数据库(推荐)

SGA增大之后,因为是採用10g的自己主动内存管理,shared pool的值也得到了对应的添加,对于跑SQL语句而言是有极大优点的

调整完内存參数后。如今就要对对应的SQL语句来调整,因为SQL语句我并没有拿到,仅仅能凭回顾说一下大致的情况。这个首页调用的SQL语句是个视图,视图中另一个由存储过程生成的视图,用了半连接的in进行多表连接,查看了运行计划发现,2个视图中的子查询的多表连接都採用了union的方式。询问了一下,此处并无排序的需求。因此建议改成了union all,能够避免排序操作。另外视图中连接的这些表(共3个),无一例外地都是走了Full Table Scan,即全表扫描。没有一个用到索引,显然这不太合理。通过在一个查询字段”currentstate“上建立索引后,再次查询发现,该条语句单独跑的时候。cost马上从原来的800多减少到了200多。以此类推,我建议了他们在对应的查询列上建立索引,来优化这条SQL语句。优化思路提出来了,详细的优化过程由他们自己完毕。


总结:

再次强调一下,数据库性能问题,先从双方面着手。一是调整数据库參数(查看内存參数设置是否合理等)。二是对SQL语句进行调整(优化)。分析运行计划。查看索引是否被高效地利用起来。另外须要结合AWR报告分析数据库是否负载过高(DB Time过高)。存在性能瓶颈(TOP 5 event),命中率过低(Buffer Hit%、Library Hit%过低)等不利因素。



在Windows上调整SGA大小遭遇ora-27100、ora-27102错误的处理方法的更多相关文章

  1. windows上传ipa到苹果开发者中(app store)的方法

    假如你已经使用过苹果开发者中心上架app,你肯定知道在苹果开发者中心的web界面,无法直接提交ipa文件,而是需要使用第三方工具,将ipa文件上传到构建版本,开发者中心才能在构建版本里选择构建版本上架 ...

  2. windows mysql 中文乱码和中文录入提示太大错误的解决方法

    今天操作mysql的时候很郁闷,因为修改默认字符集搞了半天,终于弄成了(关于如何把windows的默认字符集设置成功,可以参看另一篇博文,最终在mysql中输入show variables like ...

  3. Arduino上“Collect2.exe: error: ld returned 5 exit status”错误的解决方法

    1.运行环境 Windows xp; Arduino1.6.11 IDE. 2.问题 在Arduino编译时,经常出现如下的错误: collect2.exe: error: ld returned 5 ...

  4. ORACLE数据库 memory_target SGA 大小

    修改 memory_target 用oracle用户登录,sqlplus "/as sysdba"SQL> show parameters target;     show ...

  5. 禁用微信 webview 调整字体大小

    原文:http://www.grycheng.com/?p=2411 微信 webview 内置了调整字体大小的功能,对于网页的可用性来说是一个很实用的功能.一些网页的字体设置过小导致用户看不清文字, ...

  6. JavaScript自适应调整文字大小

    JavaScript自适应调整文字大小 今天有个任务,发现页面上的数字由于太长而与其他数字重叠了.这个数字还不能像文字那样只显示一部分,必须全部显示.想了一些办法都不行,最后把超过1000变成1K,大 ...

  7. 如何在 HTML 中调整图像大小?

    了解在 HTML 中调整图像大小的不同技术.何时应避免在浏览器端调整大小,以及在 Web 上操作和提供图像的正确方法. 如果您的图像不适合布局,您可以在 HTML 中调整其大小.在 HTML 中调整图 ...

  8. [ZZ] 在windows上编译Mesa3d opengl32库

    在windows上编译Mesa3d opengl32库 cheungmine http://blog.csdn.net/ubuntu64fan/article/details/8061475 Mesa ...

  9. IT兄弟连 HTML5教程 在移动设备上设置原始大小显示

    在iPhone系列和iPod Touch中使用的是Safari浏览器,它支持前面介绍的媒体查询表达式.例如,使用iPhone 320px×480px的分辨率去访问我们前面的布局示例,却无法得到我们想看 ...

随机推荐

  1. 脚本_实时显示网卡eth0上的数据流量

    #!bin/bash#功能:使用死循环,实时显示网卡eth0发送的数据包流量#作者:liusingbonwhile : do       echo "本地网卡eth0的数据流量信息如下:&q ...

  2. 线段树(segment tree )

    http://www.cnblogs.com/TenosDoIt/p/3453089.html 写的非常好! 很多学校流行一种比较的习惯.老师们很喜欢询问,从某某到某某当中,分数最高的是多少. 这让很 ...

  3. 路飞学城Python-Day14(practise)

    本章总结 练习题 1.logging模块有几个日志级别? 5个,按级别从高到低分别是 CRITICAL(灾难)>ERROR(错误)>WARNING(警示)>INFO(信息)>D ...

  4. yii2.0 利用Excel类做导入导出

    1.在 common 目录下 创建一个 components 将 Classes目录(改名为PHPExcel)和PHPExcel.php 放在新创建的目录下.再在 components 下创建一个Co ...

  5. CodeForces-722C Destroying Array 并查集 离线操作

    题目链接:https://cn.vjudge.net/problem/CodeForces-722C 题意 给个数组,每次删除一个元素,删除的元素作为一个隔断,问每次删除后该元素左右两边最大连续和 思 ...

  6. vue-cli#2.0项目结构分析

    项目结构 build 构建工具相关的目录 config 配置目录 dist 通过工具打包生成的最终需要上线的目录 node_modules 存放本地开发所有的依赖包的目录 src 源码目录 stati ...

  7. 紫书 习题 11-10 UVa 12264 (二分答案+最大流)

    书上写的是UVa 12011, 实际上是 12264 参考了https://blog.csdn.net/xl2015190026/article/details/51902823 这道题就是求出一种最 ...

  8. 紫书 习题8-5 UVa 177 (找规律)

    参考了https://blog.csdn.net/weizhuwyzc000/article/details/47038989 我一开始看了很久, 拿纸折了很久, 还是折不出题目那样..一脸懵逼 后来 ...

  9. poj 2337 Catenyms 【欧拉路径】

    题目链接:http://poj.org/problem?id=2337 题意:给定一些单词,假设一个单词的尾字母与还有一个的首字母同样则能够连接.问能否够每一个单词用一次,将全部单词连接,能够则输出字 ...

  10. (三)ng-app的使用困惑和angularJS框架的自己主动载入

    ng-app是angular的一个指令,代表一个angular应用(也叫模块).使用ng-app或ng-app=""来标记一个DOM结点.让框架会自己主动载入.也就是说,ng-ap ...