OCP-10:体系结构

Oracle 的体系结构也是复杂啊

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_targetpga_aggregate_target 的值来设置 ASMM 的 sga_targetpga_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

发表评论

您的邮箱地址不会被公开。 必填项已用 * 标注

这个站点使用 Akismet 来减少垃圾评论。了解你的评论数据如何被处理

滚动至顶部