文章大纲
Oracle 体系结构
Oracle 数据库的整个体系结构是非常复杂的,以下是其体系结构的概览:

Database Instance and Database Files:

Database Instance:

实例由两部分组成:
- 内存结构
- 进程结构
SGA 的组成:共享池、大池、流池、Java 池、重做日志缓冲区、数据告诉缓冲区、in-memory 区。
物理存储数据库组成:
- 数据文件 data file
- 控制文件 control files
- 联机在线重做日志文件 online redo log file
逻辑存储结构数据库:
- 表空间
- 段
- 区
- 块
内存结构
内存中有什么信息?
- 程序代码
- 每个已连接会话的信息
- 程序执行过程中所需的信息
- 进程之间共享和通信的信息
- 缓存数据
Oracle 数据库内存结构包括:
- 系统全局区域(SGA):是一组共享内存结构,包含一个 Oracle 数据库实例的数据和控制信息,也包括缓存的数据块和共享的 SQL、重做记录的数据
- 程序全局区域(PGA):是非共享内存区域,专门供 Oracle 进程使用的数据和控制信息,当 Oracle 启动时,PGA 由 Oracle 数据库创建
- 用户全局区域(UGA):存储的是与用户会话关联的数据信息
- 软件代码区:用于存储正在运行或可以运行的代码
Oracle 数据库内存管理
为满足数据库的需求,通过内存管理来维护 Oracle 实例内存结构的最优大小。
Oracle 数据库基于内存相关的初始化参数设置来管理内存。
自动内存管理(Automatic memory management)指定实例内存的目标大小。数据库实例自动优化到这个目标内存大小,根据需要在 SGA 和 PGA 实例之间重新分配内存。
自动共享内存管理(Automatic shared memory management)是部分自动化的。设置一个 SGA 的目标大小,然后设置 PGA 总目标大小,或单独管理 PGA 的各个工作区。
手工内存管理(Manual memory management)不用设置总的内存大小,但需要设置很多初始化参数,以单独管理 SGA 和 PGA 实例中的各个组件。

Oracle DB 内存参数



查看内存分配情况:
SQL> select COMPONENT,sum(CURRENT_SIZE/1024/1024) mb from v$memory_dynamic_components group by COMPONENT;
COMPONENT MB
---------------------------------------------------------------- ----------
shared pool 384
java pool 16
streams pool 16
DEFAULT 8K buffer cache 0
In Memory RW Extension Area 0
DEFAULT 16K buffer cache 0
unified pga pool 0
Shared IO Pool 48
SGA Target 944
DEFAULT buffer cache 448
DEFAULT 2K buffer cache 0
COMPONENT MB
---------------------------------------------------------------- ----------
Data Transfer Cache 0
PGA Target 640
KEEP buffer cache 0
RECYCLE buffer cache 0
DEFAULT 4K buffer cache 0
In-Memory Area 0
large pool 16
DEFAULT 32K buffer cache 0
In Memory RO Extension Area 0
memoptimize buffer cache 0
ASM Buffer Cache 0
22 rows selected.
监控 SGA 和 PGA:
SQL> select COMPONENT,CURRENT_SIZE/1024/1024 CURRENT_SIZE from v$memory_dynamic_components where COMPONENT in('PGA Target','SGA Target');
COMPONENT CURRENT_SIZE
---------------------------------------------------------------
SGA Target 944
PGA Target 640
Oracle 会根据当前 SGA 内存使用情况自动设置 SGA_TARGET
当 memory_target
设置为 0
,将根据 AMM 所设置的 sga_target
和 pga_aggregate_target
的值来设置 ASMM 的 sga_target
和 pga_aggregate_target
,Oracle 会自动调整 SGA 组件
从 AMM 到 ASMM:
alter system set memory_target=0;
从 ASMM 到 AMM:
alter system set memory_target=896M;
alter system set sga_target=0;
alter system set pga_aggregate_target=0;
从 ASMM 到手动:
alter system set sga_target=0;
然后基于当前值计算 SGA_TARGET 值:
SQL> select ((select sum(value) from v$sga)-(select current_size from
v$sga_dynamic_free_memory)) "sga_target" from dual;
设置 SGA_TARGET :
alter system set sga_target=989853080;
将 SGA 组件初始化参数设置为 0
:
alter system set streams_pool_size=0;
alter system set shared_pool_size=0;
alter system set large_pool_size=0;
alter system set java_pool_size=0;
alter system set db_cache_size=0;
Oracle Database Memory Structures

专用服务器:UGA 位于 PGA
共享服务器:UGA 位于 Large Pool

PGA Contents:

PGA 的组成:
- SQL 工作区
- 会话内存
- 私有 SQL 区
SGA 组件:
- Database Buffer Cache:存储的是从数据文件读取的数据块副本,即数据缓存。数据文件存储在物理磁盘中,Oracle 数据库的数据保存在数据文件中,由服务器进程将数据文件中的数据读入到数据库高速缓存中,利用 LRU 算法
- Redo Log Buffer:存储的是数据库所做的更改的条目信息。包含 DML 或 DDL 操作对数据库所做的给你个给信息,主要用于实现数据库恢复
Redo Log Buffer:

- Shared Pool:缓存各种类型的程序数据。例如,存储已解析的 SQL、PL/SQL 代码,系统参数和数据字典信息
Shared Pool:

- Large Pool:是 SGA 的可选区域,对于备份和恢复以及具有大量排序工作的 SQL 语句等特定的数据库操作需要使用大池
- Java Pool:用于存储 JVM 内所有会话特定的 Java 代码和数据
- Streams Pool:存储的是缓冲队列中的消息和 Oracle 数据流数据
- Fixed SGA:有关数据库和实例状态的常规信息,后台进程需要访问这些信息,进程之间传递的信息
相关内存参数:
memory_max_target
memory_target
sga_max_size
sga_min_size
sga_target
pga_aggregate_targetdb_16k_cache_size
db_2k_cache_size
db_32k_cache_size
db_4k_cache_size
db_8k_cache_size
db_cache_size
db_keep_cache_size
db_recycle_cache_size
log_buffer
java_pool_size
large_pool_size
shared_pool_size
streams_pool_size
bitmap_merge_area_size
hash_area_size
sort_area_size
inmemory_size
inmemory_force
inmemory_clause_default
inmemory_query
inmemory_max_populate_servers
inmemory_trickle_repopulate_servers_percent
optimizer_inmemory_aware
可能会遇到的问题:
ORA-00845: MEMORY_TARGET not supported on this system
On Linux systems, if the operating system /dev/shm mount size is too small for the
Oracle system global area (SGA) and program global area (PGA), it results in the
following error:
ORA-00845: MEMORY_TARGET not supported on this system
Note that Memory Size (SGA and PGA), which sets the initialization parameter
MEMORY_TARGET or MEMORY_MAX_TARGET, cannot be greater than the shared memory file
system (/dev/shm) on your operating system.
The workaround, if you encounter the ORA-00845 error, is to increase the /dev/shm
mountpoint size. For example:mount -t tmpfs shmfs -o size=5g /dev/shm
To make this change persistent across system restarts, add an entry in /etc/fstab
similar to the following:
shmfs /dev/shm tmpfs size=7g 0 0
mount -o remount /dev/shm