当前位置:首页 > 问答 > 正文

ORA-00820报错sga_max_size设置太小了,得调大点才能启动数据库远程帮你解决

开始)

用户遇到了一个Oracle数据库启动不了的问题,屏幕上弹出了一个错误代码叫ORA-00820,这个错误信息的大致意思就是说,当前在数据库的初始化参数文件里,给SGA_MAX_SIZE这个参数设定的数值太小了,小到连数据库最基本的需求都满足不了,所以数据库服务根本启动不起来,用户想让我远程帮忙解决这个问题,核心思路就是得把这个参数的值给调大了才行。

ORA-00820报错sga_max_size设置太小了,得调大点才能启动数据库远程帮你解决

要解决这个问题,首先得搞清楚SGA_MAX_SIZE是个什么东西,根据Oracle官方文档的解释,SGA是System Global Area的缩写,可以理解成是数据库在服务器内存里划出来的一块非常重要的“工作区”,数据库在运行的时候,会把很多关键的数据和信息放在这里面,比如正在执行的SQL语句、用户连接的信息、还有从数据文件里读出来的数据块副本等等,这样做的目的是为了加快数据的访问速度,因为从内存里读数据可比从硬盘上读要快成千上万倍,而SGA_MAX_SIZE这个参数,顾名思义,就是给这个“工作区”设定了一个最大不能超过的尺寸上限,它就像是一个容器的最大容量,你往里面放的东西总量不能超过这个限制。

为什么这个参数设置太小了,数据库就启动不了呢?这得从数据库的启动过程说起,根据Oracle数据库的启动机制文档描述,当启动命令发出后,数据库实例会首先进入到“NOMOUNT”阶段,在这个阶段,数据库会去读取初始化参数文件(就是那个包含了很多配置信息的文件,比如我们正在说的这个SGA_MAX_SIZE就在里面),然后根据文件里的设置,去向操作系统申请分配相应大小的内存空间,来创建我们前面说的那个SGA“工作区”,如果这个时候,参数文件里设定的SGA_MAX_SIZE的值,比数据库正常启动所需要的最小内存需求还要小,那么操作系统就无法成功分配出足够的内存空间,这就好比你想用一个只有杯子盖那么小的盒子去装一个篮球,肯定是装不下的,内存分配失败了,数据库实例的创建也就跟着失败了,启动过程就会中断,并且抛出这个ORA-00820的错误,明确告诉你问题出在SGA_MAX_SIZE的大小上。

ORA-00820报错sga_max_size设置太小了,得调大点才能启动数据库远程帮你解决

既然找到了问题的根源,解决办法听起来就很直接了:去修改参数文件,把SGA_MAX_SIZE的值调大一点不就行了?话是这么说,但具体操作起来,有几个关键点必须要注意,否则可能解决不了问题,甚至引发新的麻烦。

我们得找到并修改正确的参数文件,Oracle数据库有两种主要的参数文件:一种是古老的PFILE(文本文件),另一种是较新的SPFILE(二进制服务器参数文件),根据Oracle管理手册的说明,现在更推荐使用SPFILE,因为它更安全,支持动态修改,当数据库完全无法启动时,我们可能无法直接修改SPFILE,这时候,一个常用的方法是先创建一个PFILE出来进行修改,可以使用类似“CREATE PFILE FROM SPFILE;”这样的命令(这个命令需要在数据库至少能处于某种特定状态时才能执行,如果完全启动不了,可能需要找找之前有没有备份的PFILE,或者系统默认的PFILE),找到或创建出PFILE这个文本文件后,用记事本之类的文本编辑器打开它,找到写着“SGA_MAX_SIZE”的那一行,如果找不到这一行,也没关系,可能是因为数据库使用了自动内存管理,但既然报了这个错,我们最好还是显式地加上这一行。

ORA-00820报错sga_max_size设置太小了,得调大点才能启动数据库远程帮你解决

接下来是最关键的一步:设置一个多大的新值?这个值不是随便填的,根据服务器硬件配置指南,这个新值绝对不能超过服务器当前可用的物理内存大小,而且要考虑到操作系统本身和其他应用程序也需要占用内存,不能把内存全部给数据库占了,否则整个服务器都可能变得不稳定,一个比较稳妥的做法是,先查看一下服务器总共有多少物理内存,然后留出足够给操作系统(比如20%左右)和其他必要程序的空间,剩下的部分再分一部分给SGA,这个值的大小通常是以MB或者GB为单位的,在参数文件里要写清楚单位,8G”或者“8192M”。

修改完PFILE中的SGA_MAX_SIZE参数后,保存文件,如果之前是从SPFILE创建PFILE的,现在还需要把修改好的PFILE重新创建回SPFILE,可以使用“CREATE SPFILE FROM PFILE;”命令,再次尝试启动数据库,正常情况下,如果新设置的值足够大,数据库就应该能够顺利通过NOMOUNT阶段,继续后续的启动了。

有时候可能还会遇到一些关联性的问题,SGA里面还包含好几个重要的子部分,比如数据库缓冲区缓存(Buffer Cache)、共享池(Shared Pool)等等,在有些配置下,如果这些子部分的大小之和已经设定得很大,甚至超过了SGA_MAX_SIZE的限制,那也会引发冲突,在调大SGA_MAX_SIZE的同时,最好也检查一下其他相关的内存参数设置是否合理,确保它们之间没有矛盾。

解决ORA-00820错误的流程就是:定位问题(SGA_MAX_SIZE太小) -> 找到并编辑参数文件(PFILE) -> 合理设置一个更大的SGA_MAX_SIZE值(考虑服务器总内存) -> 必要时重建SPFILE -> 重新启动数据库,这个过程虽然原理不复杂,但每一步都需要谨慎操作,因为涉及到数据库最核心的配置,如果对服务器环境不熟悉,或者不确定如何计算合适的内存大小,最好还是在有经验的人员指导下进行,或者查阅更详细的官方文档。 结束)