oracle内存管理
关于内存管理
必须管理的内存结构是系统全局区(SGA)和实例程序全局区(instance PGA)。Oracle 数据库支持各种内存管理方法,这些方法由初始化参数设置选择。
自动内存管理
Oracle 数据库可以完全自动管理 SGA 内存和实例 PGA 内存。您只需指定实例使用的总内存大小,Oracle 数据库会根据需要在 SGA 和实例 PGA 之间动态交换内存以满足处理需求。这种能力称为自动内存管理。使用这种内存管理方法,数据库还可以动态调整各个 SGA 组件的大小和各个 PGA 的大小。Oracle 建议对 SGA 和 PGA 内存的总大小小于或等于 4 GB 的数据库进行自动内存管理。
手动内存管理
如果您希望更直接地控制单个内存组件的大小,您可以禁用自动内存管理并将数据库配置为手动内存管理。有几种不同的方法可用于手动内存管理。其中一些方法保留了一定程度的自动化。因此,这些方法在 DBA 所需的工作量和知识方面有所不同。这些方法是:
-
自动共享内存管理 - 用于 SGA
-
手动共享内存管理 - 用于 SGA
-
自动 PGA 内存管理 - 用于实例 PGA
-
手动 PGA 内存管理 - 用于实例 PGA
本章稍后将介绍这些内存管理方法。
如果您使用数据库配置助手 (DBCA) 创建数据库并选择基本安装选项,则会在系统内存小于或等于 4 GB 时启用自动内存管理。当系统内存大于 4 GB 时,禁用自动内存管理,启用自动共享内存管理。如果您选择高级安装,那么 DBCA 允许您选择自动内存管理或自动共享内存管理。
当 SGA 和 PGA 内存的总大小为 4 GB 或更大时,Oracle 建议自动进行共享内存管理。
笔记:
管理内存的最简单方法是使用 Oracle Enterprise Manager Database Express (EM Express) 或 Oracle Enterprise Manager Cloud Control (Cloud Control) 的图形用户界面。
内存架构概述
与 Oracle 数据库相关的基本内存结构包括:
-
系统全局区域 (SGA)
SGA 是一组共享内存结构,称为SGA 组件,其中包含一个 Oracle 数据库实例的数据和控制信息。SGA 由所有服务器和后台进程共享。存储在 SGA 中的数据示例包括缓存数据块和共享 SQL 区域。
-
计划全球区 (PGA)
PGA 是一个内存区域,其中包含服务器进程的数据和控制信息。它是 Oracle 数据库在服务器进程启动时创建的非共享内存。对 PGA 的访问是服务器进程独有的。每个服务器进程都有一个 PGA。后台进程也分配它们自己的 PGA。为连接到 Oracle 数据库实例的所有后台和服务器进程分配的总 PGA 内存称为总实例 PGA 内存,所有单个 PGA 的集合称为总实例 PGA,或仅称为实例 PGA。
Oracle 数据库内存结构
从 Oracle Database 12 c第 1 版 (12.1.0.2) 开始,大表缓存允许串行查询和并行查询使用缓冲区缓存。大表缓存有助于在数据仓库环境中有效缓存大表,即使这些表不完全适合缓冲区缓存。表扫描可以在以下场景中使用大表缓存:
-
并行查询
在单实例和Oracle Real Application Clusters(Oracle RAC)数据库中,当DB_big_table_cache_PERCENT_TARGET初始化参数设置为非零值,并且parallel_DEGREE_POLICY设置为AUTO或ADAPTIVE时,并行查询可以使用大表缓存。
-
串行查询
仅在单实例配置中,当
DB_BIG_TABLE_CACHE_PERCENT_TARGET
初始化参数设置为非零值时,串行查询可以使用大表缓存。
关于自动内存管理
管理实例内存的最简单方法是允许 Oracle 数据库实例为您自动管理和调整它。为此(在大多数平台上),您只需设置目标内存大小初始化参数 ( MEMORY_TARGET
) 和可选的最大内存大小初始化参数 ( MEMORY_MAX_TARGET
)。
基于memory_TARGET的值,实例使用的总内存保持相对恒定,实例自动在系统全局区域(SGA)和实例程序全局区域(PGA)之间分配内存。随着内存需求的变化,实例会在SGA和实例PGA之间动态重新分配内存。
如果未启用自动内存管理,则必须手动调整SGA和实例PGA的大小。
因为MEMORY_TARGET初始化参数是动态的,所以您可以随时更改MEMORY_TARGET,而无需重新启动数据库。MEMORY_MAX_TARGET不是动态的,它是一个上限,以便您不会意外地将MEMORY_TARGET设置得太高,并为数据库实例预留足够的内存,以防将来需要增加总实例内存。由于某些SGA组件无法轻松收缩或必须保持最小大小,因此该实例还可以防止将MEMORY_TARGET设置得太低。
笔记:
-
如果数据库实例的总物理内存大于 4 GB,则在数据库安装和创建过程中不能指定 Automatic Memory Management 选项。Oracle 建议您在此类环境中使用自动共享内存管理。
LOCK_SGA
如果初始化参数为TRUE,则无法启用自动内存管理。
启用自动内存管理
如果您在创建数据库时没有启用自动内存管理(通过在 DBCA 中选择适当的选项或通过为CREATE DATABASE
SQL 语句设置适当的初始化参数),那么您可以在以后启用它。启用自动内存管理涉及关闭和重新启动数据库。
要启用自动内存管理:
-
启动SQL*Plus并使用SYSDBA管理权限连接到Oracle数据库实例。
- 计算最小值
MEMORY_TARGET
如下:
通过输入以下SQL*Plus命令,以MB为单位确定SGA_TARGET和PGA_AGGREGATE_TARGET的当前大小:
SHOW PARAMETER SGA_TARGET NAME TYPE VALUE ------------------------------------ ----------- -------------------------- sga_target big integer 272M SHOW PARAMETER PGA_AGGREGATE_TARGET NAME TYPE VALUE ------------------------------------ ----------- -------------------------- pga_aggregate_target big integer 90M
运行以下查询以确定自数据库启动以来分配的最大实例PGA(MB):
SELECT VALUE/1048576 FROM V$PGASTAT WHERE NAME='maximum PGA allocated';
计算步骤2b的查询结果与PGA_AGGREGATE_TARGET之间的最大值。将SGA_TARGET添加到此值。
MEMORY_TARGET = SGA_TARGET + MAX(PGA_AGGREGATE_TARGET, MAXIMUM PGA ALLOCATED)
例如,如果如上所示,SGA_TARGET为272M,PGA_AGGREGATE_TARGET为90M,并且如果分配的最大PGA确定为120M,则MEMORY_TARGET应至少为392M(272M+120M)。
3、选择要使用的MEMORY_TARGET值。
这可以是您在步骤2中计算的最小值,或者如果有足够的可用物理内存,您可以选择使用更大的值。
4、对于MEMORY_MAX_TARGET初始化参数,决定在可预见的将来要分配给数据库的最大内存量。也就是说,确定SGA和实例PGA大小之和的最大值。此数字可以大于或等于您在上一步中选择的MEMORY_TARGET值。
5、Do one of the following:执行以下操作之一:
如果使用服务器参数文件启动Oracle数据库实例(如果使用数据库配置助手(DBCA)创建数据库,这是默认值),请输入以下命令:
ALTER SYSTEM SET MEMORY_MAX_TARGET = nM SCOPE = SPFILE;
其中n是您在步骤4中计算的值。
SCOPE=SPFILE子句仅在服务器参数文件中设置值,而不是为正在运行的实例设置值。必须包含此SCOPE子句,因为MEMORY_MAX_TARGET不是动态初始化参数。
如果使用文本初始化参数文件启动实例,请手动编辑该文件,使其包含以下语句:
memory_max_target = nM
memory_target = mM
其中n是在步骤4中确定的值,m是在步骤3中确定的数值。
注意:在文本初始化参数文件中,如果省略了MEMORY_MAX_TARGET的行,并包含MEMORY-TARGET的值,则数据库会自动将MEMORY_MAX_TARGET设置为MEMORY _TARGET的值。如果省略MEMORY_TARGET的行,并包含MEMORY_MAX_TARGET的值,则MEMORY-TARGET参数默认为零。启动后,可以将MEMORY_TARGET动态更改为非零值,前提是它不超过MEMORY_MAX_TARGET的值。
6、Shut down and restart the database.
7、如果使用服务器参数文件启动Oracle数据库实例,请输入以下命令:
ALTER SYSTEM SET MEMORY_TARGET = nM; ALTER SYSTEM SET SGA_TARGET = 0; ALTER SYSTEM SET PGA_AGGREGATE_TARGET = 0;
其中n是您在步骤3中确定的值。
监控和调整自动内存管理
动态性能视图V$MEMORY_DYNAMIC_COMPONENTS
显示所有动态调整的内存组件的当前大小,包括 SGA 和实例 PGA 的总大小。
-
查询视图V$MEMORY_TARGET_ADVICE以获取初始化参数 MEMORY_TARGET的调整建议。
例如,运行以下查询:
SQL> select * from v$memory_target_advice order by memory_size; MEMORY_SIZE MEMORY_SIZE_FACTOR ESTD_DB_TIME ESTD_DB_TIME_FACTOR VERSION ----------- ------ ------------ ---- --------------- ---------- 180 .5 458 1.344 0 270 .75 367 1.0761 0 360 1 341 1 0 450 1.25 335 .9817 0 540 1.5 335 .9817 0 630 1.75 335 .9817 0 720 2 335 .9817 0
MEMORY_SIZE_FACTOR为1的行显示内存的当前大小(由MEMORY_TARGET初始化参数设置),以及完成当前工作负载所需的DB时间量。在前面和后面的行中,结果显示了几个可选的MEMORY_TARGET大小。对于每个可选大小,数据库显示大小因子(当前大小的倍数),以及如果将MEMORY_TARGET参数更改为可选大小,则完成当前工作负载所需的估计DB时间。请注意,对于小于当前memory_TARGET大小的总内存大小,估计的DB时间会增加。还要注意,在这个示例中,将总内存大小增加到450MB以上并没有什么好处。但是,如果尚未运行完整的工作负载,这种情况可能会发生变化。
EM Express提供易于使用的图形内存顾问,帮助您选择memory_TARGET的最佳大小。有关详细信息,请参阅Oracle Database 2 Day DBA。
手动配置内存
暂略。。。。。。。。。
内存管理数据字典视图
一组动态性能视图提供有关内存管理的信息。
看法 | 描述 |
---|---|
显示有关系统全局区域 (SGA) 的摘要信息。 |
|
显示 SGA 的大小信息,包括不同 SGA 组件的大小、粒度大小和可用内存。 |
|
显示有关如何在共享池、大型池、Java 池和 Streams 池中分配内存的详细信息。 |
|
显示 PGA 内存使用统计信息以及有关自动 PGA 内存管理器启用时(即 |
|
显示所有自动调整和静态内存组件的当前大小信息,以及每个组件上发生的最后一次操作(例如,增长或收缩)。 |
|
显示所有 SGA 组件的当前大小,以及每个组件的最后操作。 |
|
显示有关可用于未来动态 SGA 调整大小操作的 SGA 内存量的信息。 |
|
显示有关当前正在进行的调整大小操作的信息。调整大小操作是 SGA、实例 PGA 或动态 SGA 组件的放大或缩小。 |
|
显示有关当前正在进行的动态 SGA 组件大小调整操作的信息。 |
|
显示有关最近 800 次已完成的内存组件调整大小操作的信息,包括 和 的自动增长和收缩 |
|
显示有关最近 800 次完成的 SGA 组件调整大小操作的信息。 |
|
|
|
显示有助于调整的信息 |
|
显示有助于调整的信息 |
|
显示有关为 IM 列存储中的所有段分配的存储空间的信息。 注意:此视图从 Oracle Database 12 c第 1 版 (12.1.0.2) 开始可用。 |