Oracle Database 11g 调整 SGA_MAX_SIZE 导致 ORA-00851 和 ORA-00844 错误

ORA-00844: Parameter not taking MEMORY_TARGET into account
ORA-00851: SGA_MAX_SIZE 1073741824 cannot be set to more than MEMORY_TARGET 784334848.

简介

SGA

SGA 系统全局区的英文简称,SGA(System Global Area)是 Oracle Instance 的基本组成部分,在实例启动时分配。是一组包含一个 Oracle 实例的数据和控制信息的共享内存结构。
主要是用于存储数据库信息的内存区,该信息为数据库进程所共享(PGA 不能共享的)。
它包含 Oracle 服务器的数据和控制信息,它是在 Oracle 服务器所驻留的计算机的实际内存中得以分配,如果实际内存不够再往虚拟内存中写。

SGA 主要由数据高速缓冲区(Database Buffer Cache)、共享池(Shared Pool)、重做日志缓冲区(Redo Log Buffer)、大型池(Large Pool)、Java 池(Java Pool)、流池(Streams Pool)和其他结构(如固定 SGA、锁管理等)组成。

SGA_MAX_SIZE

即 SGA 的最大大小

问题

一日上班时,同事突然问我,“昨天 Oracle 都还好好的,今天连接就报 ORA-28547:连接服务器失败,可能是Oracle Net管理错误”。“突然就这么了?你没改过配置?”。答曰:“没有”

在尝试 lsnrctl reload 重启监听后,又报出:

1
2
3
4
ORA-01034: ORACLE not available
ORA-27101: shared memory realm does not exist
进程 ID: 0
会话 ID: 0 序列号: 0

由此可知数据库的实例未启动,通过 lsnrctl status 查看,果然监听启动了,实例未启动。
尝试启动

1
2
3
4
5
6
sqlplus /nolog
SQL> conn / as sysdba
已连接空闲例程
SQL> startup
ORA-00844: Parameter not taking MEMORY_TARGET into account
ORA-00851: SGA_MAX_SIZE 1073741824 cannot be set to more than MEMORY_TARGET 784334848.

conn / as sysdba 如提示没有权限,尝试 conn sys/password as sysdba or 修改 \product\11.2.0\dbhome_1\NETWORK\ADMIN\sqlnet.oraSQLNET.AUTHENTICATION_SERVICES=(NTS)

解决方法

由报出的错误能看出是 SGA_MAX_SIZE 的数值超过了 MEMORY_TARGET。导致实例不能启动。

建议备份原文件

  • 直接修改 memory_targetsga_max_size,使前者比后者相同或更大
    找到 PFile 文件 /app/<username>/admin/<DB_Instance_name>/pfile/init.ora.**********,在编辑器中打开,找到 memory_target 修改后 SQL> startup

  • 通过命令导出配置,再写入配置

1
2
SQL> create pfile='<PATH>/pfile20170928' from spfile; 
文件已创建

修改 pfile20170928',找到 memory_targetsga_max_size,使前者比后者相同或更大

1
2
3
4
SQL> create spfile from pfile='<PATH>/pfile20170928';
文件已创建
SQL> startup
ORACLE instance started.

拓展

Pfile 和 SPfile

  • Pfile(Parameter File,参数文件)是基于文本格式的参数文件,含有数据库的配置参数。
  • SPfile(Server Parameter File,服务器参数文件)是基于二进制格式的参数文件,含有数据库及例程的参数和数值,但不能用文本编辑工具打开。(Oracle9i 之后引入的概念)

启动顺序

  • startup(默认)启动的顺序(三个都没有查找到,则报错)
    1. 直接在默认路径下查找 spfileSID.ora –(spfile)
    2. 直接在默认路径下查找 spfile.ora
    3. 直接在默认路径下查找 initSID.ora –(pfile)
  • startup pfile='<PATH>/xxx.ora'
    • 使用 pfile 启动:直接指定.ora即可。
    • 使用 spfile 启动
      1. 需要变通一下如:新建一个包含spfile=<PATH>/spfile.oraxxx.ora文件
      2. 再用startup pfile=<PATH>/xxx.ora启动即可。