oracle 11g自动内存管理概述

56次阅读
没有评论

共计 7199 个字符,预计需要花费 18 分钟才能阅读完成。

本篇内容介绍了“oracle 11g 自动内存管理概述”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让丸趣 TV 小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!

一:Oracle 11g 自动内存管理概述

oracle11g 中的新的内存管理特性自动化内存管理 (automatic memory management)。在该新特性之下 SGA 与 PGA 将会根据需要自动的扩展与收缩。你只需要设置两个内存管理相关的参数 memory_target 与 memory_max_target.

1)memory_target: 该参数设置整个 oracle 数据库实例可以使用的内存量,oralce 数据库实例在运行过程中会根据需求自动的调节 SGA 与 PGA 的大小。可以使用相应的 alter system 命令动态的修改 memory_target 的值。该参数是动态初始化参数。

2)memory_max_target: 该参数设置 oracle 实例可以使用的最大内存量。在调整 memory_target 的值时必须保持以下的约束关系 memory_target =memory_max_target. 该参数是静态初始化参数, 修改需要重启才能生效。

在创建数据库的时候,你可以通过设置 memory_target,memory_max_target 初始化参数来开启自动化内存管理特性。在数据库创建以后也可以通过设置 memory_target,memory_max_target 初始化参数来开启自动化内存管理,但是不会立即生效,需要重启实例。

使用动态内存管理时,SGA_TARGET 和 PGA_AGGREGATE_TARGET 代表它们各自内存区域的最小设置,要让 Oracle 完全控制内存管理,这两个参数应该设置为 0。

关于设置 memory_target 的值的原则:如果服务器只有数据库,可以分配全部内存的 2 /3 到 3/4 给 oracle 的 memory_target;

查看 memory_target 以及 SGA_TARGET 和 PGA_AGGREGATE_TARGET 的设置的值,需要注意设置的值不会变化的,如下:

SQL show parameter target

NAME                                 TYPE        VALUE

———————————— ———– ——————————

archive_lag_target                   integer     0

db_flashback_retention_target        integer     1440

fast_start_io_target                 integer     0

fast_start_mttr_target               integer     0

memory_max_target                    big integer 62848M

memory_target                        big integer 62848M

parallel_servers_target              integer     512

pga_aggregate_target                 big integer 4G

sga_target                           big integer 8G

二:如何 Oracle 运行的某个时刻的各个内存的分配大小呢?

可以通过 create pfile from spfile, 查看:

[oracle@JoinSpider dbs]$ cat initora11g.ora

ora11g.__db_cache_size=2281701376

ora11g.__java_pool_size=939524096

ora11g.__large_pool_size=805306368

ora11g.__oracle_base= /files/oracle #ORACLE_BASE set from environment

ora11g.__pga_aggregate_target=57310969856     ## 这是当前实际的分配 pga 的值,

ora11g.__sga_target=5637144576                           ## 这是当前实际的分配 sga 的值

ora11g.__shared_io_pool_size=0

ora11g.__shared_pool_size=3758096384

ora11g.__streams_pool_size=0

*.audit_file_dest= /files/oracle/admin/ora11g/adump

*.audit_trail= db

*.compatible= 11.2.0.4.0

*.control_files= /files/oracle/oradata/ora11g/control01.ctl , /files/oracle/fast_recovery_area/ora11g/control02.ctl

*.db_block_size=8192

*.db_domain=

*.db_name= ora11g

*.db_recovery_file_dest= /files/oracle/fast_recovery_area

*.db_recovery_file_dest_size=4385144832

*.diagnostic_dest= /files/oracle

*.dispatchers= (PROTOCOL=TCP) (SERVICE=ora11gXDB)

*.memory_max_target=65899345920

*.memory_target=65899345920

*.open_cursors=300

*.pga_aggregate_target=4294967296        ### 这是最小值

*.processes=1500

*.remote_login_passwordfile= EXCLUSIVE

*.sga_target=8589934592                           ### 这是最小值

*.undo_retention=3600

*.undo_tablespace= UNDOTBS1

三:Oracle11g 内存管理如何开启:

1:在数据库创建期间设置自动内存管理:如果是手工建库,那么你只需要设置好如下类似初始化参数即可:

memory_target = 1000m

memory_max_target = 1500m

如果是采用 DBCA 创建数据库,如果是创建新库并且是高级安装,你能选择自动内存管理选项。如果是选择基本安装,那么默认就是自动内存管理。

2:在数据库创建后:你可以在数据库创建后添加 memory_max_target 和 memory_target. 虽然 memory_target 是一个动态参数,但是当数据库运行时,你不能交换到自动内存管理。必须重启数据库将参数应用到实例启动过程才行。

四:Oracle11g 内存管理的相关参数设置的含义和原则:

MEMORY_TARGET 设置为非零值时:

1: 如果设置了 SGA_TARGET 和 PGA_AGGREGATE_TARGET,则会分别将它们当作 SGA 大小和 PGA 大小的最小 值。

2: 如果设置了 SGA_TARGET 但未设置 PGA_AGGREGATE_TARGET,则仍会自动优化这两个参数。PGA_AGGREGATE_TARGET 将初始化为以下值:(MEMORY_TARGET -SGA_TARGET)。

3: 如果设置了 PGA_AGGREGATE_TARGET 但未设置 SGA_TARGET,则仍会自动优化这两个参数。SGA_TARGET 将初始化为值 min(MEMORY_TARGET -PGA_AGGREGATE_TARGET, SGA_MAX_SIZE(如果用户已设置)),系统将自动优化子组件。

4: 如果未设置任何参数,则无需最小值或默认值即可自动优化这两个参数。有这样一个策略:在初始化过程中,将 MEMORY_TARGET 的按固定比率分配给 SGA 和 PGA。具体如下:

sga_target =memory_target *60%

pga_aggregate_target=memory_target *40%

如果未设置 MEMORY_TARGET,或者将其显式设置为 0(11g 中的默认值为 0)则取消了 memory_target 的作用,完全和 10g 在内存管理上一致。:

1. 如果设置了 SGA_TARGET,则系统仅自动优化 SGA 的子组件大小。PGA 的自动优化与 是否显式设置 PGA 无关。但是,不会自动优化整个 SGA (SGA_TARGET) 和 PGA (PGA_AGGREGATE_TARGET),即 SGA 和 PGA 不会自动增长或收缩。

2. 如果既未设置 SGA_TARGET,又未设置 PGA_AGGREGATE_TARGET,则 SGA 中的各组件大小都要明确设定,不能自动调整各组件大小。PGA 不能自动增长和收缩。

3. 如果仅设置了 MEMORY_MAX_TARGET,则使用文本初始化文件进行手动设置时,MEMORY_TARGET 默认为 0。SGA 和 PGA 的自动优化行为默认情况下与 10g R2 中的相同。

4. 如果 SGA_MAX_SIZE 不是用户设置的,则在用户设置了 MEMORY_MAX_TARGET 的情况下,系统会在内部将其设置为 MEMORY_MAX_TARGET(与用户是否设置 SGA_TARGET 无关)

五:若将一个非自动化内存管理的 11g 库系统改成自动化内存管理,该如何确认 MEMORY_TARGET 的值?

1. 在一个系统上启用自动内存管理其实很简单,不需要事先做太多的事情,可以使用下面的计算公式来计算 MEMORY_TARGET:          MEMORY_TARGET=SGA_TARGET+GREATEST(PGA_AGGREGATE_TARGET, maximum      PGA      allocated

下面的查询语句向你展示有关的信息,以及如何计算出需要的 memory_target 值:

1. 方法一:使用 sql 查出 SGA_TARGET、PGA_AGGREGATE_TARGET 以及 maximum      PGA      allocated 的值,之后根据公式 MEMORY_TARGET=SGA_TARGET+GREATEST(PGA_AGGREGATE_TARGET, maximum      PGA  allocated 算出结果,,注意函数 GREATEST 是求两个数值中的最大值:

SELECT name, value/1024/1024

FROM   v$parameter

WHERE  name IN (pga_aggregate_target , sga_target)

UNION

SELECT maximum PGA allocated AS name, TO_CHAR(value)/1024/1024  AS value

FROM   v$pgastat

WHERE  name = maximum PGA allocated

方法二:直接一个 sql 查出 memory_target 的值,单位为 mb;

SELECT  (sga.value + GREATEST(pga.value, max_pga.value))/1024/1024   AS memory_target

FROM

(SELECT TO_NUMBER(value) AS value FROM v$parameter WHERE name = sga_target ) sga,

(SELECT TO_NUMBER(value) AS value FROM v$parameter WHERE name = pga_aggregate_target ) pga,

(SELECT value FROM v$pgastat WHERE name = maximum PGA allocated) max_pga;

我认为 MEMORY_TARGET 应该等于 实际的 sga 的值加上 PGA 最大分配的值,这是最真实的,但是一般就认为 MEMORY_TARGET=SGA_TARGET+GREATEST(PGA_AGGREGATE_TARGET, maximum      PGA  allocated) 即可

如果想更真实的确定 MEMORY_TARGET 的大小,那就要确定实例的 sga_target 的实际使用的大小,当前设置值减去剩余值。然后再利用前边的计算公式

SQL select (

(select sum(value) from v$sga) –

(select current_size from v$sga_dynamic_free_memory)

)/1024/1024/1024 sga_target

from dual;

2. 如果此时实例没有设置 memory_target 或者说 memory_target=0,并且把 SGA_TARGET 设置为 0,即表示禁用 10g 的新特性——自动共享内存(sga) 分配,这样我们需要对各个 sga 内存组件的值进行单独设置, 那么这种情况下该怎么确定 memory_target 的值来开启 Oracle11g 的自动内存管理呢?

SQL  select value/1024/1024 as value from v$pgastat  where name= maximum PGA allocated

VALUE

———-

45.7822266

可见 pga_aggregate_target=46M,确定 oracle 实例启动以来 PGA 的最大容量,可以理解为最大的使用量。

SQL SELECT ((SELECT SUM(value) FROM V$SGA) –

(SELECT CURRENT_SIZE FROM V$SGA_DYNAMIC_FREE_MEMORY) ) SGA_TARGET

FROM DUAL;

SGA_TARGET

———-

313626624

可见 SGA_target 的大小为 300M,

1)如果马上就修改 memory_target=352M 会报

值的范围不合法的提示,

SQL alter system set memory_target=352M;

alter system set memory_target=352M

ERROR at line 1:

ORA-02097: parameter cannot be modified because specified value is invalid

ORA-00838: Specified value of MEMORY_TARGET is too small, needs to be at least

400M

因为要满足 memory_target =pga_aggregate_target+sga_target.

但是 pga_aggregate_target 的值是 100M,而 SGA_target 的值为 300M。

352M 300M+100M 所有出错了。

2)修改 PGA 或者 sga 的值为 0M 也会报错的。因为还没有设置 memory_target 的值,

SQL  alter system set pga_aggregate_target=0;

alter system set pga_aggregate_target=0

ERROR at line 1:

ORA-02097: parameter cannot be modified because specified value is invalid

ORA-00093: pga_aggregate_target must be between 10M and 4096G-1

如果直接修改 pga_aggregate_target 的值会报上面的错误。因为我们还没有设置 momory_target 的值,如果直接是设置 PGA 的大小为 0M 的话,那就等于不给 PGA 分配内存了,所有我们通过上面的一个查询,确定自实例启动以来分配给 PGA 的最大内存大小 46M,先把 PGA 的值调下来。使

memory_target =pga_aggregate_target+sga_target. 即 352M =50M+300M

SQL alter system set pga_aggregate_target=50M;

System altered.

SQL alter system set memory_target=352M;

System altered.

SQL alter system set pga_aggregate_target=0M;

System altered.

这是我们已经启用 oracle 的内存自动化管理,并且设置 SGA_target 与 pga_aggregate_target 参数的值为 0。oracle 这时就不会为 SGA 与 PGA 分配最小内存大小了。oracle 会根据工作负载自动的调整 SGA 与 PGA 的大小。

六:Oracle 11g 设置内存相关参数原则:

1. 如果 Oracle11g 要开启自动内存管理,需要设置 MEMORY_TARGET 的值,如果该服务器只跑 Oracle,那么可以按着下面的原则设置:

MEMORY_TARGET= 物理内存 x 80%

MEMORY_MAX_SIZE= 物理内存 x 80%

2. 如果不打算开启自动内存管理,也就是 MEMORY_TARGET=0:

对于 OLTP 系统:

SGA_TARGET=(物理内存 x 80%) x 80%

SGA_MAX_SIZE=(物理内存 x 80%) x 80%

PGA_AGGREGATE_TARGET=(物理内存 x 80%) x 20%

对于 DSS 系统:

SGA_TARGET=(物理内存 x 80%) x 50%

SGA_MAX_SIZE=(物理内存 x 80%) x 50%

PGA_AGGREGATE_TARGET=(物理内存 x 80%) x 50%

“oracle 11g 自动内存管理概述”的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识可以关注丸趣 TV 网站,丸趣 TV 小编将为大家输出更多高质量的实用文章!

正文完
 
丸趣
版权声明:本站原创文章,由 丸趣 2023-07-28发表,共计7199字。
转载说明:除特殊说明外本站除技术相关以外文章皆由网络搜集发布,转载请注明出处。
评论(没有评论)