当前位置:  数据库>oracle

在Windows上调整SGA大小遭遇ORA-27100、ORA-27102错误的处理方法

    来源: 互联网  发布时间:2017-06-11

    本文导语: 今天早上去一公司合作伙伴那里,协助处理他们某客户的数据库性能问题,那个库是Oracle 10.2.0.1的,前台业务系统是政府某机构查询系统,碰到的问题是首页展示非常慢,与之相关的SQL语句查询结果需要跑59s多,而其他页面相关...

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

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

因此,首先就查看了该库的SGA参数,发现只分配了1.2G,而数据库服务器的物理内存为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:oracleappproduct10.2.0db_1databaseinitnt.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的内存错误。

知道了这个机制,那么再处理之前的内存错误就很容易了,先把错误的那个spfile删除掉,然后停止oracle实例相应的服务,再重新把服务起来,再用pifle启动数据库即可

SQL> startup pfile=E:oracleappproduct10.2.0db_1databaseinitnt.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%过低)等不利因素。

在CentOS 6.4下安装Oracle 11gR2(x64)

Oracle 11gR2 在VMWare虚拟机中安装步骤

Debian 下 安装 Oracle 11g XE R2


    
 
 

您可能感兴趣的文章:

  • 怎么样让我的JFrame的大小设置为:显示器屏幕大小减去Windows任务栏后的大小?
  • windows 2000 访问linux下smaba时候 2G以上大小的文件显示出来的大小很奇怪
  • 不知在x windows下怎样修改屏幕大小1024x768
  • windows下 用virtualbox虚拟redhat5 窗口大小问题。
  • 如何查看一个目录的大小?如windows下的dir命令
  • 请问有没有办法可以将10M大小的文件用软盘拷到WINDOWS2000中????
  • X windows中怎样设置不允许改变窗口大小呢?
  • 教你如何在windows与linux系统中设置MySQL数据库名、表名大小写敏感
  • 串口接收程序运行环境由windows改为linux后是否有大小端问题?
  • windows下的代码上传至linux服务器上,解决文件后缀名大小写问题
  • 请问在solaris X86 的安装中,应该如何分区呢?其大小应该如何定呢?可否存在windows和solaris两种系统在一块硬盘上?
  • 修改PHP上传文件大小限制(windows、linux)
  • 写了个小程序,比较windows(xp)和linux(fedora4)和速度和大小,发现linux下运行的程序远没有windows下的快。
  • Linux和Windows中tomcat修改内存大小的方法
  •  
    本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
    本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。












  • 相关文章推荐
  • java命名空间java.awt.event类keyevent的类成员方法: vk_windows定义及介绍
  • 怎么在Linux下改windows系统文件啊,我把windows的BOOT.INI改了,windows启动不了
  • WinDows8最新版文件夹加密
  • x-windows如何安装在linux(rdehat9)上面呢,是不是x-windows也分windows和linux版本的吗?
  • 修改Windows硬盘分区名称
  • linux和windows串口问题!?linux向windows端发送,第一次write正常,继续write,windows接收到的就变成乱码了,这是什么原因??????
  • windows10玩游戏怎么样?唯一支持DirectX 12的windows
  • 装了Linux和Windows,怎样默认进入Windows
  • windows/windows 7/windows 8 下打开查看、修改及保存超大(GB级)文本文件及其它类型文件的工具-PilotEdit
  • Linux与windows共存时,如何将Windows设置为默认启动系统?
  • windows下tinyxml.dll下载安装使用(c++解析XML库)
  • 怎样是编好的java application在windows上像windows应用程序一样直接运行
  • Docker宣布支持Windows 10和Azure Windows Server
  • windows 和linux双系统,重装windows后,无法启动linux?
  • win7/Windows7系统下载地址搜集整理
  • 如何将linux的一台机器加入windows 2000的域?并且通过一windows的机器上网?
  • Windows7自带防火墙设置:启动,关闭及高级设置
  • 为什么在安装了WINDOWS和LINUX的电脑上,重装WINDOWS会破坏MBR?
  • IE11设置IE兼容性视图及提升Windows 8.1中IE11兼容性的相关设置
  • Linux + Windows2000 双启动,Windows2000起不来了,说是文件被破坏,进来看看……
  • Windows优化大师最新版 V7.99 Build 12.604发布
  • Linux和Windows2000双系统(为什么Windows2000中打开我的电脑非常慢?)


  • 站内导航:


    特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

    ©2012-2021,