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 | ORA-01034: ORACLE not available |
由此可知数据库的实例未启动,通过 lsnrctl status
查看,果然监听启动了,实例未启动。
尝试启动
1 | sqlplus /nolog |
conn / as sysdba
如提示没有权限,尝试conn sys/password as sysdba
or 修改\product\11.2.0\dbhome_1\NETWORK\ADMIN\sqlnet.ora
中SQLNET.AUTHENTICATION_SERVICES=(NTS)
解决方法
由报出的错误能看出是 SGA_MAX_SIZE 的数值超过了 MEMORY_TARGET。导致实例不能启动。
建议备份原文件
直接修改
memory_target
或sga_max_size
,使前者比后者相同或更大
找到 PFile 文件/app/<username>/admin/<DB_Instance_name>/pfile/init.ora.**********
,在编辑器中打开,找到memory_target
修改后SQL> startup
通过命令导出配置,再写入配置
1 | SQL> create pfile='<PATH>/pfile20170928' from spfile; |
修改 pfile20170928'
,找到 memory_target
或 sga_max_size
,使前者比后者相同或更大
1 | SQL> create spfile from pfile='<PATH>/pfile20170928'; |
拓展
Pfile 和 SPfile
- Pfile(Parameter File,参数文件)是基于文本格式的参数文件,含有数据库的配置参数。
- SPfile(Server Parameter File,服务器参数文件)是基于二进制格式的参数文件,含有数据库及例程的参数和数值,但不能用文本编辑工具打开。(Oracle9i 之后引入的概念)
启动顺序
- 用
startup
(默认)启动的顺序(三个都没有查找到,则报错)- 直接在默认路径下查找 spfileSID.ora –(spfile)
- 直接在默认路径下查找 spfile.ora
- 直接在默认路径下查找 initSID.ora –(pfile)
- 用
startup pfile='<PATH>/xxx.ora'
- 使用 pfile 启动:直接指定
.ora
即可。 - 使用 spfile 启动
- 需要变通一下如:新建一个包含
spfile=<PATH>/spfile.ora
的xxx.ora
文件 - 再用
startup pfile=<PATH>/xxx.ora
启动即可。
- 需要变通一下如:新建一个包含
- 使用 pfile 启动:直接指定