怎么配置oracle数据库服务器的内存

58次阅读
没有评论

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

这篇文章给大家分享的是有关怎么配置 oracle 数据库服务器的内存的内容。丸趣 TV 小编觉得挺实用的,因此分享给大家做个参考,一起跟随丸趣 TV 小编过来看看吧。

SGA:是用于存储数据库信息的内存区,该信息为数据库进程所共享。它包含 Oracle 服务器的数据和控制信息, 它是在 Oracle 服务器所驻留的计算机的实际内存中得以分配,如果实际内存不够再往虚拟内存中写。
PGA:是一块包含一个服务进程的数据和控制信息的内存区域。它是 Oracle 在一个服务进程启动时创建的,是非共享的。一个 Oracle 进程拥有一个 PGA 内存区。一个 PGA 也只能被拥有它的那个服务进程所访问,只有这个进程中的 Oracle 代码才能读写它。因此,PGA 中的结构是不需要 Latch 保护的。

我们重点就是设置 SGA,理论上 SGA 可占 OS 系统物理内存的 1 /2——1/3
 
 
ORACLE 给的建议是: OLTP 系统   PGA=(Total Memory)*80%*20%。DSS 系统 PGA=(Total Memory)*80%*50%。
ORACLE 建议一个数据库服务器,分 80% 的内存给数据库,20% 的内存给操作系统,那怎么给一个数据库服务器配内存呢?
SQL select * from v$pgastat;
NAME  VALUE UNIT
—————————————————————- ———- ————
aggregate PGA target parameter  104857600 bytes 
—– 这个值等于参数 PGA_AGGREGATE_TARGET 的值,如果此值为 0,表示禁用了 PGA 自动管理。
aggregate PGA auto target  75220992 bytes 
—– 表示 PGA 还能提供多少内存给自动运行模式,通常这个值接近 pga_aggregate_target-total pga inuse.
global memory bound  20971520 bytes
—– 工作区执行的最大值,如果这个值小于 1M,马上增加 PGA 大小
total PGA inuse  30167040 bytes
—– 当前分配 PGA 的总大小,这个值有可能大于 PGA,如果 PGA 设置太小. 这个值接近 select sum(pga_used_mem) from v$process.
total PGA allocated  52124672 bytes
—– 工作区花费的总大小
maximum PGA allocated  67066880 bytes
total freeable PGA memory  0 bytes  – 没有了空闲的 PGA
process count  23  – 当前有 23 个 process
max processes count  25
PGA memory freed back to OS  0 bytes
total PGA used for auto workareas  8891392 bytes
maximum PGA used for auto workareas  22263808 bytes
total PGA used for manual workareas  0 bytes  – 为 0 自动管理
maximum PGA used for manual workareas  0 bytes  – 为 0 自动管理
over allocation count  0 
如果 PGA 设置太小,导致 PGA 有时大于 PGA_AGGREGATE_TARGET 的值,此处为 0,说明 PGA 没有扩展大于 TARGET 的值,如果此值出现过,那么增加 PGA 大小。
bytes processed  124434432 bytes
extra bytes read/written  0 bytes
cache hit percentage  100 percent  — 命中率为 100%,如果太小增加 PGA
recompute count (total)  6651
19 rows selected
SQL select max(pga_used_mem)/1024/1024 M from v$process;  —- 当前一个 process 消耗最大的内存
  M
———-
9.12815189
SQL select min(pga_used_mem)/1024/1024 M from v$process where pga_used_mem —process 消耗最少内存
  M
———-
0.19186878
SQL select max(pga_used_mem)/1024/1024 M from v$process ;  —-process 曾经消耗的最大内存
  M
———-
9.12815189
SQL select sum(pga_used_mem)/1024/1024 from v$process;  —- 当前 process 一共消耗的 PGA
SUM(PGA_USED_MEM)/1024/1024
—————————
  28.8192501068115
如何设置 PGA 呢?我们可以在压力测试阶段,模拟一下系统的运行,然后运行
select (select sum(pga_used_mem)/1024/1024 from v$process) /(select count(*) from v$process) from dual; 得到一个 process 大约占用了多少的内存,然后估算系统一共会有多少连接,比如一共有 500 个连接,
那么 Sessions=1.1*process +5=500,那么 processes=450, 再乘以一个 process 需要消耗的内存,就能大约估算出 PGA 需要设置多大。
最好将 PGA 设置的值比计算出的值大一点,PGA 值设定好后,就可以根据系统的性质, 如果系统为 OLTOP,那么总的内存可以设置为 PGA/0.16, 最后也能估算出 SGA 的大小,建议还是多配点内存,反正便宜。
下面摘抄 eygle 的关于一个 process 能够分配的最大内存(串行操作) 的规则:
10gR1 之前,对于串行操作 (非并行) 一个 process 能够分配的最大的内存为 min(5%pga_aggregate_target,100m)
10gR2 之后,对于串行操作 (非并行) 一个 process 能够分配的最大内存有如下规则:
如果 pga_aggregate_target =500m, 那么最大的内存为 20%*pga_aggregate_target.
如果 500m
如果 1000m 如果 pga_aggregate_target 2.5G, 那么最大内存为 2.5G.
SQL SELECT x.ksppinm NAME, y.ksppstvl VALUE, x.ksppdesc describ
  2  FROM SYS.x$ksppi x, SYS.x$ksppcv y
  3  WHERE x.inst_id = USERENV (Instance)
  4  AND y.inst_id = USERENV (Instance)
  5  AND x.indx = y.indx
  6  AND x.ksppinm LIKE % par%
  7  /
NAME  VALUE  DESCRIB
——————————————————————————– ——————————————————————————– ——————————————————————————–
_smm_max_size  20480  maximum work area size in auto mode (serial)
SQL show parameter pga
NAME  TYPE  VALUE
———————————— ———– ——————————
pga_aggregate_target  big integer 100M
此处我的一个 process 能够分配的最大内存为 20M,因为我的 PGA=100M,符合上面的规则。
隐含参数_smm_max_size 表示一个 process 能够分配最大的 memory.
 
 

买了 piner 的《oracle 高可用环境》一书,正好趁这段时间学习一下。
把看到的东西总结一下发表于此,今天先发第一章关于 SGA 与 PGA 的内容。
 
以后会陆续将总结在此发表,与大家共享。
 
SGA 与 PGA 的结构如下图:

SGA:
查看 SGA:
Sqlp show sga
或 select * from v$sga;
Total System Global Area  289406976 bytes
Fixed Size  1248600 bytes
Variable Size  176161448 bytes
Database Buffers  109051904 bytes
Redo Buffers  2945024 bytes
 
Fixed Size:包括了数据库与实例的控制信息、状态信息、字典信息等,启动时就被固定在 SGA 中,不会改变。
Variable Size:包括了 shard pool、large pool、java pool、stream pool、游标区和其他结构
Database Buffers:数据库中数据块缓冲的地方,是 SGA 中最大的地方,决定数据库性能
Redo Buffers:提供 REDO 缓冲的地方,在 OLAP 中不需要太大
 
V$sgastat 记录了 SGA 的一些统计信息
V$sga_dynamic_components 保存 SGA 中可以手动调整的区域的一些调整记录
 
Shard pool:
Shard_pool_size 决定其大小,10g 以后自动管理
Shard_pool 中数据字典和控制区结构用户无法直接控制,与用户有关的只有 sql 缓冲区(library cache)。
将经常访问的过程或包用 DBMS_SHARED_POOL.KEEP 存储过程将该包 pin 在共享池中。
手工清除共享池的内容:alter system flush shard_pool;
 
共享池相关的几个常用的视图:
V$sqlarea 记录了所有 sql 的统计信息,包括执行次数、物理读、逻辑读、耗费时间等
V$sqltext_with_newline 完全显示 sql 语句,通过 hash_value 来标示语句,piece 排序
V$sql_plan 保存了 sql 的执行计划,通过工具查看
V$shared_pool_advice 对共享池的预测,可以做调整 SGA 的参考
 
Data buffer:
 
在 OLTP 系统中要求 data buffer 的命中率在 95% 以上
select sum(pins) execution ,sum(pinhits) hits ,
((sum(pinhits)/sum(pins))*100) pinhitration ,
sum(reloads) misses ,((sum(pins)/(sum(pins)
+sum(reloads)))*100) relhitratio
from V$librarycache
 
PINS NUMBER Number of times a PIN was requested for objects of this namespace
PINHITS NUMBER Number of times all of the metadata pieces of the library object were found in memory
RELOADS NUMBER Any PIN of an object that is not the first PIN performed since the object handle was created, and which requires loading the object from disk

Oracle 把从 data buffer 中获得的数据库叫 cache hit,把从磁盘获得的脚 cache miss
数据缓冲区中的数据块通过脏列表(dirty list)和 LRU 列表(LRU list)来管理。
 
Data buffer 可细分为:default pool、keep pool、recycle pool 对应的参数为 db_cache_size、db_keep_cache_size、db_recycle_size 分别表示缓冲区大小
 
从 9i 开始 oracle 支持不同块大小的表空间,相应的可以为不同块大小的表空间指定不同块大小的数据缓冲区,不同块大小的数据缓冲区可以用相应的 db_nk_cache_size 来指定,其中 n 可以是 2、4、6、16 或 32
 
V$db_cache_advice 对数据缓冲区的预测,可以做调整 data buffer 的参考
 
V$bh、x$bh 记录了数据块在 data buffer 中缓冲的情况,通过这个视图可以找系统中的热点块。通过下面语句找系统中 top 10 热点快所在的热点对象:
 
Select /*+ rule*/ owner,object_name from dba_objects
Where data_object_id in
  (select obj from
  (select obj from x$bh order by tch desc)
  Where rownum
 
PGA:
用来保存于用户进程相关的内存段。
从 9i 开始使用 PGA 自动管理,pga_aggregate_target 参数指定 session 一共使用的最大 PGA 内存的上限。Workarea_size_policy 参数用于开关 PGA 内存自动管理功能,auto/manual
 
在 OLTP 环境中,自动 PGA 管理只要设置到一定的值,如 2G 左右就能满足系统的要求。
 
自动内存管理:
从 9i 开始,sga_max_size 参数设置 SGA 的内存大小,不能动态修改
 
从 10g 开始,指定了 sga_target 参数后,所有的 SGA 组件如:shared pool、data buffer、large pool 都不用手工指定了,Oracle 会自动管理。这一特性就是自动共享内存管理 ASMM。如果设置了 sga_target=0, 就自动关闭自动共享内存管理功能。Sga_target 大小不能超过 sga_max_size 的大小。
手动管理 SGA:
Alter system set sga_target=2000m;
Alter system set db_cache_size=1000m;
Alter system set shared_pool=200m;
Alter system set sga_target=0——— 关闭自动共享内存管理 ASMM
 
11G 以后 sga+pga 整个内存可以自动管理 AMM,相关参数 memory_max_target  memory_target. 设置好这两个参数后就不用关心 SGA 和 PGA 了
11g 手动内存管理:
Alter system set memory_target=3000m;
Alter system set sga_target=2000m;
Alter system set pga_aggregate_target=1000m;
Alter system set memory_target=0;——— 关闭自动内存管理 AMM
 
SGA+PGA 最好不要超过总内存的 70%

补充:总原则:OS 使用内存 +SGA+ 并发执行进程数 *(sort_area_size+hash_ara_size+2M) 0.7* 总内存
  简单说就是:SGA+PGA+OS 使用内存 总物理 RAM

关于 SGA、PGA 与系统内存三者间的关联,目前有一个相对通用的计算规则可供参考:
对于 OLTP 数据库,SGA= 系统内存 *70%*80%,PGA=SGA*(10%~20%)。SGA= 系统内存 *0.56 PGA= 系统内存 *(0.05~0.1)
对于 OLAP 数据库,SGA= 系统内存 *80%*60%,PGA=SGA*(45%~65%)。SGA= 系统内存 *0.48 PGA= 系统内存 *(0.22~0.31)
(对于 32bit 平台,默认情况下 SGA 最大可用内存有 1.7GB 的限制)

实例配置时需要考虑的因素

一:物理内存多大

二:操作系统估计需要使用多少内存

三:数据库是使用文件系统还是裸设备

四:有多少并发连接

五:应用是 OLTP 类型还是 OLAP 类型

感谢各位的阅读!关于“怎么配置 oracle 数据库服务器的内存”这篇文章就分享到这里了,希望以上内容可以对大家有一定的帮助,让大家可以学到更多知识,如果觉得文章不错,可以把它分享出去让更多的人看到吧!

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