记录解决 Oracle 11c 修改最大内存占用数后重启服务无法登录的问题

Published: 2020-07-21

Tags: Oracle

本文总阅读量

问题描述

安装 Oracle 数据库后,因为它是按百分比来占用内存的,我觉得占用的比较多,想要修改小一点儿

于是上网上淘了这样两行命令

SQL> show parameter sga;
NAME                                 TYPE        VALUE
------------------------------------ ----------- ------------------------------
allow_group_access_to_sga            boolean     FALSE
lock_sga                             boolean     FALSE
pre_page_sga                         boolean     TRUE
sga_max_size                         big integer 19584M
sga_min_size                         big integer 0
sga_target                           big integer 19584M
unified_audit_sga_queue_size         integer     1048576
SQL> alter system set sga_max_size=5000m scope=spfile;
System altered

之后到 Windows 系统服务中重启了数据库,接下来使用PL/SQL就无法登录到数据库了。

报错(一)—— ORA-12514

这个报错很常见,网上有很多人提到这个错误。

解决方法是找到 listener.ora 文件,添加监听配置,如果不知道这个文件在哪,可以在 PL/SQL 的“帮助 - 支持信息”进行查看,listener.oratnsnames.ora 都在一个目录。

找到 listener.ora 文件后编辑添加

(SID_DESC =
  (GLOBAL_DBNAME = orcl)
  (ORACLE_HOME = C:\Users\Administrator\Downloads\oracle19c)
  (SID_NAME = orcl)
)

编辑后的内容为

# listener.ora Network Configuration File: C:\Users\Administrator\Downloads\oracle19c\NETWORK\ADMIN\listener.ora
# Generated by Oracle configuration tools.

SID_LIST_LISTENER =
  (SID_LIST =
    (SID_DESC =
      (SID_NAME = CLRExtProc)
      (ORACLE_HOME = C:\Users\Administrator\Downloads\oracle19c)
      (PROGRAM = extproc)
      (ENVS = "EXTPROC_DLLS=ONLY:C:\Users\Administrator\Downloads\oracle19c\bin\oraclr19.dll")
    )
    (SID_DESC =
      (GLOBAL_DBNAME = orcl)
      (ORACLE_HOME = C:\Users\Administrator\Downloads\oracle19c)
      (SID_NAME = orcl)
    )
  )

LISTENER =
  (DESCRIPTION_LIST =
    (DESCRIPTION =
      (ADDRESS = (PROTOCOL = TCP)(HOST = localhost)(PORT = 1521))
      (ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC1521))
    )
  )

注意:ORACLE_HOME 需要根据自己的 Oracle 所在位置进行修改。

重启 Listener 服务,我这个版本的名字叫:OracleOraDB19Home1TNSListener

重启后,重新打开 PL/SQL,登录出现其它报错信息。

报错2—— ORA-01034 和 ORA-27101

这个报错看起来服务没有启动的样子,我在服务面板看到 OracleServiceORCL 正在运行,就也没有多想。

后来检索发现,问题确实是实例没有启动成功,因为修改 sga_max_size 后导致 sga_target 大于它,实例启动失败

解决方法

# 进入 Sqlplus
C:\Users\Administrator> sqlplus /nolog

# 连接数据库
SQL> conn /as sysdba
已连接到空闲例程。

# 生成 PFILE(路径为ORACLE_HOME下的dbs目录)
SQL> create pfile='C:/Users/Administrator/Downloads/oracle19c/dbs/init1.ora' FROM SPFILE;

File created.

编辑 init1.ora文件,找到 sga_target 参数,修改使其小于 sga_max_size,但是要大于 1344M,否则会报错

ORA-00821: Specified value of sga_target 512M is too small, needs to be at least 1344M

orcl.__data_transfer_cache_size=0
orcl.__db_cache_size=17649631232
orcl.__inmemory_ext_roarea=0
orcl.__inmemory_ext_rwarea=0
orcl.__java_pool_size=0
orcl.__large_pool_size=335544320
orcl.__oracle_base='C:\Oracle'#ORACLE_BASE set from environment
orcl.__pga_aggregate_target=6845104128
orcl.__sga_target=20535312384
orcl.__shared_io_pool_size=134217728
orcl.__shared_pool_size=2348810240
orcl.__streams_pool_size=0
orcl.__unified_pga_pool_size=0
*.audit_file_dest='C:\Oracle\admin\orcl\adump'
*.audit_trail='db'
*.compatible='19.0.0'
*.control_files='C:\Oracle\oradata\ORCL\control01.ctl','C:\Oracle\oradata\ORCL\control02.ctl'
*.db_block_size=8192
*.db_name='orcl'
*.diagnostic_dest='C:\Oracle'
*.dispatchers='(PROTOCOL=TCP) (SERVICE=orclXDB)'
*.local_listener='LISTENER_ORCL'
*.nls_language='SIMPLIFIED CHINESE'
*.nls_territory='CHINA'
*.open_cursors=300
*.pga_aggregate_target=6518m
*.processes=3840
*.remote_login_passwordfile='EXCLUSIVE'
*.sga_max_size=5242m
*.sga_target=2000m
*.undo_tablespace='UNDOTBS1'

修改后保存,从 PFILE 启动实例

SQL> startup pfile='C:/Users/Administrator/Downloads/oracle19c/dbs/init1.ora';
ORACLE instance started.

Total System Global Area 5251268080 bytes
Fixed Size                  9039344 bytes
Variable Size            4060086272 bytes
Database Buffers         1157627904 bytes
Redo Buffers               24514560 bytes
数据库装载完毕。
数据库已经打开。

根据 PFILE 生成 SPFILE

SQL> create spfile='C:\Users\Administrator\Downloads\oracle19c\database\spfileorcl.ora' from pfile='C:\Users\Administrator\Downloads\oracle19c\dbs\init1.ora';

关闭数据库

SQL> shutdown immediate;
数据库已经关闭。
已经卸载数据库。
ORACLE 例程已经关闭。

使用 SPFILE 启动实例

SQL> startup
ORACLE 例程已经启动。

Total System Global Area 5251268080 bytes
Fixed Size                  9039344 bytes
Variable Size            4060086272 bytes
Database Buffers         1157627904 bytes
Redo Buffers               24514560 bytes
数据库装载完毕。
数据库已经打开。

修复完成,接下来可以使用 PL/SQL快乐的登录到数据库了。

参考

  1. ORA-00823: Specified value of sga_target greater than sga_max_size

  2. 创建pfile和spfile