ORA-04030 问题解决 与 Oracle 内存架构与管理

最近在impdp导入数据库的时候发生了ORA-04030,后来在数据库查询的时候也出现了ORA-04030。

今天数据库连接失败,发现服务没起来,force启动失败,报的还是ORA-04030。

那就把ORA-04030好好整理一下,做个总结。


引起ORA-04030的原因,是不能分配更多的内存,解决办法有两种,其一是加大内存,其二,则是对Oracle的内存控制参数进行调整,使其内存分配更适合于当前的应用程序。

这里就首先总结下Oracle的内存控制参数。此部分参考Oracle文档:Memory Architecture

Oracle 数据库内存结构

在实例启动的时候,Oracle分配内存区域并启动后台进程。

内存区域存储如下信息:

  • 程序代码
  • 每个Session连接的信息,即使当前已不存活
  • 在程序执行中需要用到的信息,例如,被 fetched 的查询结果集的当前状态
  • 在进程间共享的锁定数据
  • 缓存数据,诸如数据块与redo记录

基础内存结构

Oracle 数据库包含几种内存区域,每种又包含不同的子组件。

基础内存结构包括:

· 系统全局区(SGA)

系统全局区是一组共享的内存结构,也被称为 SGA 模块,包含了一个 Oracle 数据库实例的数据与控制信息。服务器与后台进程共享 SGA 数据。SGA中储存着缓存数据块和共享的 SQL 区域。

· 程序全局区(PGA)

PGA 是不共享的内存区,包含着专用于一个 Oracle 进程的数据与控制信息。Oracle进程启动时创建PGA。

每个服务端进程与后台进程都有一个PGA。个体PGA的集合,即为实例PGA。数据库的初始化参数设置了实例PGA的个数,而不是个体PGA。

· 用户全局区域(UGA)

UGA是一个用户session关联的内存区域。

· 代码区

代码区是一部分用来存储正在被执行或能被执行的代码的内存区域。Oracle 数据库的代码通常不与用户代码放在相同代码区,而是放在独特的受保护区域。

下图展示了这些内存结构的关系

ORA-04030 问题解决 与 Oracle 内存架构与管理

图1 Oracle 数据库内存结构

Oracle 数据库内存管理

内存管理包括在数据库变化中为Oracle 实例内存结构调整到所需的最佳大小。Oracle 数据库内存管理基于对内存相关初始化参数的调整。

内存管理的基本选项如下:

· 自动内存管理

为数据库实例指定目标大小(target size),实例会在 SGA 与实例 PGA 间按需进行分配并自动调整到目标大小。

· 自动共享内存管理

该模式为半自动模式。为 SGA 指定一个目标大小(target size),而后可以为 PGA 设置一个总大小(aggregate target size),或单独指定每个PGA。

· 手动内存管理

不指定总内存大小,而是设置许多初始化参数来分别管理 SGA 组件和 实例PGA。

如果使用DBCA(Database Configuration Assistant)创建数据库,并选择基本安装选择,则默认为自动内存管理。