14.笔记:监视与管理内存

概述:
ORACLE实例的存储结构:
(1)SYSTEM GLOBAL AREA,简写为SGA:是供后台进程与服务器进程共享使用的;
(2)PROGRAM GLOBAL AREA,简写为PGA:各个会话私有的内存区域
如果启用了SGA和PGA的自动管理,那么应当能够确保所有可用的内存被最佳地使用,同时保证服务器根本不需要交换。

1.系统全局区SGA
从操作系统的观点出发,SGA是共享内存。共享内存的实现根据操作系统的不同而变化。
例如:SOLARIS通过/etc/system文件设置共享内存,并且任何变化都需要在重启后才起作用;
但是在LINUX系统中,我们可以使用sysctl实用程序动态地配置共享内存(或编辑/etc/sysctl.conf)
【名词解释】LINUX共享内存是进程间通信中最简单的方式之一。共享内存允许两个或更多的进程访问同一块内存。
【LINUX共享内存设置】
我们可以修改shmmax内核参数,使SGA存在于一个共享内存段中。
SHMMAX设置不足可能会导致以下问题:ORA-27123:unale to attach to shared memory segment

--手工修改
/proc/sys/kernel/shmmax --修改shmmax文件,系统重启后会复位。
/etc/sysctl.conf --添加kernel.shmmax = 1020232402 (字节),永久修改

--使用sysctl修改内核参数
sysctl -w kernel.shmmax=21242324322 --用sysctl修改/proc/sys/kernel/shmmax文件
echo "kernel.shmmax=21242324322">>/etc/sysctl.conf

--修改生效
sysctl -p

SGA_MAX_SIZE:Initial size of SGA at startup, dependent on the sizes of different pools in the SGA, such as buffer cache, shared pool, large pool, and so on.
SGA_MAX_SIZE参数总是大于或等于SGA的实际大小,SGA_MAX_SIZE参数在操作系统层次上的作用根据平台有所不同。
SGA_TARGET specifies the total size of all SGA components. If SGA_TARGET is specified, then the following memory pools are automatically sized:
Buffer cache (DB_CACHE_SIZE)
Shared pool (SHARED_POOL_SIZE)
Large pool (LARGE_POOL_SIZE)
Java pool (JAVA_POOL_SIZE)

【区组】除了日志缓冲区之外,SGA组件以区组为单位分配大小。一个区组(granule)是一片连续的内存区域。
通常,如果SGA的总大小 小于 1000M,区组大小为4MB,SGA大于1000MB区组大小为16MB(WINDOWS平台为8MB).
SGA组件的大小是区组的倍数。
V$SGAINFO可以查看区组的大小


2.共享池
【提示】spfile参数设置错误导致实例启动不了的解决方法
1.方法1
create pfile='...' from spfile;
修改pfile
create spfile from pfile='..';
2.方法2
编辑init静态参数文件,加两行
spfile='/home/oracle/db/product/10.2.0/db_1/dbs/spfiledb131.ora' #引用spfile,为了使 alter system ...scope=spfile能成功
log_archive_dest_2='location=/home/oracle/db/oradata/archive2/' #修改spfile中的错误,否则启动还会失败
startup pfile=..
alter system ...;--用alter system修改spfile中的错误参数

【共享池组件】
select * from v$sgastat;
(1)library cache:--共享池内存分配算法中最优先的组件
(2)SQL区:与library cache共同组成共享池的最大部分。
(3)数据字典高速缓存
(4)ACTIVE session History,简写为ASH:保存用户最近活动的相关信息。被定时写至SYSAUX表空间中的AWR。
(5)各种PL/SQL区
(6)闪回生成区

【分析共享池】
select shared_pool_size_for_estimate "size",
shared_pool_size_size_factor "factor",
estd_lc_time_saved "saving"
from v$shared_pool_advice;

方法2:使用Database Control的Shared Pool Advisor


3.数据库高速缓存区buffer_cache
通过将数据库高速缓存区分割为若干被称为池(pool)的不同区域并且将不同段的数据块高速缓存入这些不同的池,我们就可以优化数据库高速缓存区的使用。

3.1 LRU列表与检查点队列
数据库高速缓存区中的每个缓冲区都具有3种状态之一:忙缓冲区、脏缓冲区或者空闲缓冲区
忙(pinned)缓冲区:是正在被使用的缓冲区。在这一时刻,某个进程正在处理忙缓冲区中的数据块,只有在处理结束后,其他进程才可以使用这个缓冲区。
脏(dirty)缓冲区:某个数据块的映像与其在磁盘上的映像不相同。这个数据块已被复制到数据库高速缓存区并且已被更新,但是尚未被写回磁盘。
空闲(free)缓冲区:既不是脏缓冲区,也不是忙缓冲区。这意味着空闲缓冲区未被使用或者已被清空。
在已清空的缓冲区中,一个数据块的映像与其在磁盘上的映像相同。
这个数据块可能已被复制到数据库高速缓存区并未发生变化,也可能已在发生变化(“变脏”)后通过DBWn进程写回磁盘而被清空。
【LRU列表】:最近最少使用列表(least recently used)
每个缓冲区都具有一个地址,LRU列表中存在的每个条目都针对一个缓冲区。
因此,刚被访问过的缓冲区将位于LRU列表的最近最多使用端,而未访问时间最长的缓冲区则位于LRU列表的最近最少使用端。
某个服务器进程需要将一个数据块复制至内存时,这个服务器进程会到达LRU列表的最近最少使用端并使用其查找至的第一个空闲缓冲区。
【检查点队列】:检查点队列是一个等待通过DBWn进程写至磁盘的脏缓冲区列表,这个列表由搜索空闲缓冲区的服务器进程进行填充。
服务器进程会从LRU列表的最近最少使用端开始查找空闲缓冲区,只要在查找期间发现一个脏缓冲区,服务器进程就会将这个脏缓冲区的址址移动至检查点队列。
因此,检查点队列是一个由并非最近使用的脏缓冲区组成的列表。
DBWn进程会在两种情况下清空检查点队列。(1)服务器进程查找空闲缓冲区耗费的时间可能过长;(2)检查点队列可能变得过长
DBWn进程每隔3秒钟会跳过"检查点队列",将LRU列表中最近没有使用的前几个脏缓冲区写至磁盘。

以上的操作写入磁盘的只是一部分脏缓冲区,只有在发生数据库检查点进程时,所有脏缓冲区才会通过一个操作被写至磁盘。
检查点进程触发条件:有序关闭、ALTER SYSTEM CHECKPOINT
表空间的检查点:删除表空间、使表空间只读、将表空间置入热备份模式、将表空间脱机

许多人认为日志切换操作会触发检查点进程。这种认识是错误的。

3.2 默认池、保持池与回收池
数据库高速缓存区最多可以被分为3个“池”。池(pool)是数据库高速缓存区中用于高速缓存特定对象的独特区域。任何一个段都只能被高速缓存至一个池。
【默认池】实例参数DB_CACHE_SIZE
默认池是唯一必需的池,并且所有段(无论是表、索引、撤销、LOB类型还是其他任何段类型)都被默认高速缓存至默认池。

【保持池】实例参数DB_KEEP_CACHE_SIZE


可以确保某些段的数据块始终被保留在内存当中。保持池应该足够大,从而能够存储需要高速缓存入的所有对象。
保持池适合保持的对象可以是位于大型事实表上的小维度表或索引。

【回收池】实例参数DB_RECYCLE_CACHE_SIZE
为了确保能尽快地从内存中退出不大可能被重新访问的数据块,可以创建一个回收池。回收池应当较小,因此读入内存的数据块很快会被重写。


【思考】:表的cache属性与 storage buffer_pool keep貌似最终实现的目地是一样的--------数据一直保留在内存中。
区别:keep池中的数据是有可能被清空的----当KEEP池没有足够空间时。
nocache属性与storage buffer_pool recycle应该是有区别的。

【提示】虽然使用保持池与回收池能够改善性能,但是知道数据被访问的方式十分重要。从这个观点出发,ORACLE公司并不支持ORACLE E-BUSINESS SUITE使用保持池与回收池。

3.3 非标准块大小池
提示:ORACLE公司忠告:支持使用多种数据块大小的主要动机是用于传输的表空间,而不是用于性能调整。
--创建非标准块大小的表空间之间,要分区对应的高速缓冲区池
alter system set db_16k_cache_size=4m;
create tablespace ts_16k datafile '/home/oracle/db/ts_16k.dbf' size 400m blocksize 16k;

我们可以将非标准块大小应用于数据表空间和撤销表空间,但是不能将其应用于临时表空间。
只有标准块大小池才可以被分为默认池,保持池与回收池。非标准块大小池只能作为默认池。

3.4 分配数据库高速缓存区的大小
估计数据库高速缓存区大小:
方法1:
select name,size_for_estimate,size_factor,estd_physical_reads
from v$db_cache_advice;
方法2:使用Database control

4. 日志缓冲区
LGWR进程在遇到下列情况时会执行写操作:
(1)用户提交事务时。
(2)日志缓冲区被填满的空间达到三分之一时。
(3)DBWn进程写操作之前
(4)每隔3秒钟

日志缓冲区的大小由静态实例LOG_BUFFER控制。这个参数的默认设置根据平台变化有所不同,并且与CPU的数量有关。例如,在WINDOWS系统中,
如果CPU_COUNT参数被设置为1,那么LOG_BUFFER参数就默认为256KB;如果CPU_COUNT参数被设置为8,那么LOG_BUFFER参数就默认为2MB。

5.其他SGA区
5.1 大池large pool
大池的目地是减轻共享池的压力。
使用大池的进程包括:
共享服务器进程:如果配置了大池,那么会话UGA会被存储大大池中。
并行执行服务器:如果启用了并行查询和DML,那么并行服务器会通过大池进行通信。
I/O从设备进程:如果启用了数据库写入器从设备或磁带I/O从设备,那么这些进程会通过大池进行通信。
RMAN:在备份与还原操作期间,RMAN通道进程使用大池高速缓存缓冲区。

select * from v$sgastat where pool='large pool';
从这个示例中,可以看到某些内存空间已被分配为“CTWR DBA BUFFER"。这部分内存由变化跟踪写入器(Change Tracking Writer,简写为CTWR)进程使用,
从而能够允许RMAN进行快速的增量备份。

如果没有设置LARGE_POOL_SIZE,那么这个参数默认取决于其他参数。例如,如果在数据库内启用了并行,那么就会创建一个大池。

5.2 JAVA池
JAVA池的目的是为JAVA应用程序使用的运行时存储结构提供空间。

5.3 流池
处理重做日志的流能够从重做日志流中抽取出逻辑的变化信息,例如事务对表应用的变化。
这些变化被存储为能够传播其他数据库的逻辑变化记录,因些能够被应用于位于远程站点的表。

6. Automatic Shared Memory Management
Automatic Shared Memory Management启动:设置SGA_TARGET参数
Automatic Shared Memory Management禁止:SGA_TARGET参数设为0
通过设置SGA_TARGET实例参数启用Automatic Shared Memory Management时会启动另一个后台进程:内存管理器(Memory Manager,简写为MMAN)进程。
MMAN进程会查看系统以及工作负荷,从而能够确定理想的内存分配。这个进程每隔5分钟就会进行一次查看操作。


SGA_TARGET 参数值是整个SGA的总大小,不仅包括4个自动管理组件的大小,而且还包括所有手动管理组件的大小。
SGA_TARGET参数值是将要为SGA分配的大小,这个值完全可能小于SGA_MAX_SIZE实例参数值。sga_target是一个动态参数,但是该参数的值不能超过SGA_MAX_SIZE实例参数值。

4种自动调整组件:
DB_CACHE_SIZE
SHARED_POOL_SIZE
LARGE_POOL_SIZE
JAVA_POOL_SIZE
STREAMS_POOL_SIZE(书上说,是手动组件。但是在v$sga_dynamic_components中能查到,应该是动态组件。有可能是写书时,这个参数还不是动态的)
手动设置的组件:
DB_KEEP_CACHE_SIZE
DB_RECYCLE_POOL_SIZE
DB_nK_CACHE_SIZE

LOG_BUFFER



在实例启动时,ORACLE会根据上述参数的设置为SGA结构(包括自动管理组件以及手动管理组件)分配内存,未设置的参数都采用默认值。
如果由此创建的SGA的总大小超过SGA_TARGET参数值,那么就会禁用自动的内存管理。如果SGA的总大小在实例启动时小于目标值,那么ORACLE
会根据需要重新分配4个自动管理组件的大小,直至SGA的大小达到目标值。

SPFILE能够记录调整后的4个自动管理组件的参数设置,并且在下次实例启动时应用这些参数设置。

7.练习使用Automatic Shared Memory Management
7.1清除设置
alter system reset shared_pool_size scope=spfile sid='*';
alter system reset large_pool_size scope=spfile sid='*';
alter system reset java_pool_size scope=spfile sid='*';
alter system reset db_cache_size scope=spfile sid='*';

7.2确定SGA的当前大小
select sum(bytes) from v$sgastat;

7.3
alter system set sga_target=300m scope=spfile sid='*';

7.4 startup force;
7.5 show parameters db_cache_size;
-- "__db_cache_size"是由MMAN进程维护的内部设置:该参数的值为数据库高速缓存区默认池的大小。
select * from v$sga_dynamic_components

7.6 show parameters large_pool_size;
show parameters shared_pool_size;
show parameters java_pool_size;

8.程序全局区PGA
PGA存储用于每个会话的数据与信息,并且只能被服务于本会话的服务器进程所使用。
PGA在会话启动时被创建,其存储的信息包括:绑定信息、会话变量、堆栈空间、指针以及用于排序、连接与聚合记录的排序空间(排序空间可能最为重要)。
使用共享服务器时,PGA的大部分(这部分被称为UGA)进入大池(如果没有配置大池则进入共享池)。

PGA自动管理,需要设置的参数:
WORKAREA_SIZE_POLICY参数。10G中默认为AUTO。
PGA_AGGREATE_TARGET参数。这个参数指定了用于所有会话的PGA的总内存容量,默认为SGA大小的百分之二十。

如果某个会话需要比当前分配容量更多的PGA,分配的PGA总量已经达到目标值,而且没有任何会话具有未用的PGA,那么就存在两种可能性。
1.(例如会话需要堆栈空间的情况)那么ORACLE会分配所需的PGA并超过目标值。
2.ORACLE会拒绝分配更多的内存,此时指定会话将转而使用其临时表空间中的临时空间。

select *
from v$pgastat;
对v$pgastat视图中的记录说明如下:
aggregate pga target parget parameter记录。说明PGA目标被设置为100MB。
aggregate pga auto target记录。说明在100MB中只有74MB可以被自动管理,剩余部分(例如堆栈空间)是不可转让的。
total pga in use记录。正在被使用的PGA
totaol pga allocated记录。已分配的PGA,这个参数可以大于上一个参数,说明某些PGA可以被重新指派。
total freeable pga memory记录。说明在必要时,可以被重新指派,也可以被返回操作系统的PGA。
over allocation count记录。该记录说明Oracle不得不越过目标值的次数,这个值应当始终为零。如果这个值在不断增加,那么就增大目标值。
cache hit percentage记录。这个值应当接近于百分之百。

select pga_target_for_estimate "size",
pga_target_factor "factor",
estd_extra_bytes_rw/1024/1024 "extra Mb r/w",
estd_overalloc_count "over allocations"
from v$pga_target_advice;


--手动管理PGA
WORKAREA_SIZE_POLICY实例参数设置为MANUAL,还需要设置:
SORT_AREA_SIZE
HASH_AREA_SIZE
BITMAPMERGE_AREA_SIZE
CREATE_BITMAP_AREA_SIZE

Oracle公司强烈建议使用自动的PGA管理。








[@more@]

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/7901922/viewspace-1059676/,如需转载,请注明出处,否则将追究法律责任。

转载于:http://blog.itpub.net/7901922/viewspace-1059676/

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值