马上注册,结交更多数据大咖,获取更多知识干货,轻松玩转大数据
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
共享池(shared pool)(为 SQL 及 PL/SQL 的执行分配内存),Java 池(java pool)(为 Java 对象及Java 程序的执行分配内存),及数据缓存区(buffer cache)(用于缓存磁盘上的数据块)等。所有 SGA 组件都是以预设的粒度(granule)为单位进行内存的分配与回收的。 Oracle 数据库通过记录每个 SGA 组件使用的粒度单位的数量来掌握整个 SGA 的内存使用情况。 SGA_TARGET 参数极大地简化了 DBA 的工作。管理员只需设定可供实例 SGA 使用的总内存量,而无需考虑内存如何在 SGA 各组件间分配。除非整个系统内存不足,管理员不必再担心内存不足问题。 在 SGA 自动管理模式下,无需向系统中添加额外的资源,也无需增加手工维护的工作量,就能提高系统的负载能力。在 SGA 手工管理模式下,一个已编译的 SQL 语句可能会因为共享池空间不足而被频繁的移出共享池,导致系统性能降低。而使用了 SGA 自动管理后,Oracle 内部的调优算法将监控系统的负载情况,如果发现增大共享池有利于减少重复的 SQL 解析(parse)操作,就会对相关的 SGA 组件进行调整,为共享池分配更多的内存。 数据缓存区的管理方式 数据缓存区(database buffer cache)中的缓冲区(buffer)通过两个列表管理:待写列表(write list)和最近最少使用列表(least recently used(LRU)list)。待写列表中记录的是脏缓冲区(dirty buffer),即其中数据已被修改且尚未写入磁盘的缓冲区。最近最少使用列表中记录的是可用缓冲区(free buffer),锁定缓冲区(pinned buffer),及还没被移入待写列表的脏缓冲区。可用缓冲区内的数据无需继续保留,可以用于存储新数据。而锁定缓冲区是正在被访问的缓冲区。 当 Oracle 的用户进程(user process)首次查询某块数据时,她将首先在数据缓存区内进行搜索。如果用户进程在数据缓存区内找到了所需的数据(称为缓存命中(cache hit)),就可以直接从内存中访问数据。如果用户进程不能在数据缓存区中找到所需的数据(称为缓存失效(cache miss)),则需要从磁盘中的数据文件里将相应的数据块复制到缓存中才能进行访问。缓存命中时的数据访问速度远远大于缓存失效时的速度。 ① 用户进程将数据块读入数据缓存区之前首先要准备好可用缓冲区。用户进程从 LRU 列表的 LRU 端开始对其进行搜索。这个搜索过程将一直持续,直到找到可用缓冲区或达到缓存搜索操作的预设限定值为止。 ② 当用户进程在对 LRU 列表的搜索过程中遇到脏缓冲区时,她会先将此类缓冲区移入待写列表,之后再继续搜索。当用户进程找到了可用缓冲区时,就会将数据块从磁盘写入缓冲区,并将此缓冲区移到 LRU列表的 MRU 端。 ③ 如果 Oracle 用户进程对 LRU 列表的搜索操作达到了预设的限定值而仍旧没有找到可用缓冲区,那么进程将停止搜索并通知 DBW0 后台进程将部分脏缓冲区写入磁盘 重做日志缓冲区 重做日志缓冲区(redo log buffer)是 SGA 内一块被循环使用的缓冲区,用于记录数据库内的数据变化信息。这些信息以重做条目(redo entry)的形式进行存储。Oracle 利用重做条目内的信息就可以重做由INSERT,UPDATE,DELETE,CREATE,ALTER,及 DROP 等操作对数据库进行的修改。重做条目可以被用于进行数据库恢复(database recovery)。 初始化参数 LOG_BUFFER 用于设定重做日志缓冲区的大小(以字节为单位)。一般来说,此参数值越大则重做日志文件的 I/O 性能越高,在事务执行时间将长或事务数量较大的系统中尤为明显。此参数的默认值为 512KB 或 128KB 与 CPU_COUNT 参数乘积这两者间的较大值。 初始化参数 SHARED_POOL_SIZE 用于设定共享池的容量。此参数的默认值在 32 位系统上为 8MB,在 64 位系统上为 64MB。增大此参数值将增大 SGA 内为共享池预留的内存数量。 程序全局区概述 程序全局区(program global area,PGA)是供服务进程(server process)存储数据及控制信息的内存区域。这是一种在服务进程启动时由 Oracle 创建的非共享的内存区。只有服务进程才能访问属于她的 PGA,而对 PGA 的读写操作是由 Oracle 代码实现的。一个 Oracle 实例中为所有服务进程分配的全部 PGA 内存也被称为此实例的合计 PGA(aggregated PGA) PGA的内容:①私有 SQL 区②游标及 SQL 区③会话内存 专用服务模式下的 PGA 内存管理 SQL 工作区(work area)所占的容量可以被统一地且自动地管理。DBA 只需要设定 PGA_AGGREGATE_TARGET初始化参就能设定一个 Oracle 实例使用的全部 PGA 容量。此参数的值(例如,2GB)针对整个实例,Oracle将保证所有数据库服务进程(server process)使用的全部 PGA 内存不超过此参数的限制。 初始化参数 WORKAREA_SIZE_POLICY 是一个作用于会话级和系统级的参数,此参数只接受两个值:MANUAL或 AUTO。DBA 可以先设定好 PGA_AGGREGATE_TARGET 参数,然后通过设定此参数以决定 PGA 的内存管理模式是手动还是自动。 设定了 PGA_AGGREGATE_TARGET 参数后,专用服务模式下创建的全部会话所使用的工作区的容量将被自动地调整,前述的 *_AREA_SIZE 参数对这些会话无效。在任何时刻,Oracle 实例中可供活动工作区(active work area)使用的 PGA 总容量都是由 PGA_AGGREGATE_TARGET 参数决定的。这个容量等于 PGA_AGGREGATE_TARGET减去系统内其他组件占用的 PGA 内存(例如,被会话占用的 PGA 内存)。剩余的 PGA 内存可以根据各个活动工作区的内存需要进行分配。 - V$PROCESS 视图中的以下三列记录了分配给 Oracle 进程使用的 PGA 内存的情况:PGA_USED_MEM 、PGA_ALLOCATED_MEM 、PGA_MAX_MEM
服务进程 Oracle 需要创建服务进程(server process)来处理连接到实例的用户进程(user process)提交的请求。为用户应用程序创建的服务进程(或用户/服务进程合并后的服务进程部分)可以完成以下工作: - 解析、运行应用程序提交的 SQL 语句
- 如果数据在 SGA 中不存在,则将所需的数据块从磁盘上的数据文件读入 SGA 的数据缓存区(shared database buffer)
- 以应用程序能理解的形式返回 SQL 语句的执行结果
进程监控进程(PMON) 当一个用户进程(user process)失败后,进程监控进程(process monitor,PMON)将对其进行恢复。PMON 进程将清除相关的数据缓存区(database buffer cache)并释放被此用户进程使用的资源。例如,PMON 进程将重置活动事务表(active transaction table),释放锁,并从活动进程列表(list of active process)中删除出错进程的 ID。 跟踪文件与告警日志 每个服务进程(server process)和后台进程(background process)都可以向自己的跟踪文件(trace file)写入信息。当一个进程检查到内部错误时,能够将错误信息写入跟踪文件,DBA 可以向 Oracle 支持服务(Oracle Support Services)提交此信息。 每个服务进程(server process)和后台进程(background process)都可以向自己的跟踪文件(trace file)写入信息。当一个进程检查到内部错误时,能够将错误信息写入跟踪文件。 每个数据库中还有一个告警日志(alert log)文件 alert.log。告警日志按时间顺序记录数据库中的消息和错误,主要包括以下内容: - 系统中发生的所有内部错误(internal error,ORA-600),数据块损坏错误(block corruption error,ORA-1578)和数据块死锁错误(deadlock error,ORA-60)
- 管理性操作,例如 CREATE/ALTER/DROP DATABASE/TABLESPACE 等 SQL 语句,及STARTUP,SHUTDOWN,ARCHIVE LOG,和 RECOVER 等企业管理器(Enterprise Manager)或SQL*Plus 命令
- 共享服务进程(shared server process)及调度进程(dispatcher process)运行时产生的消息及错误
- 自动刷新物化视图(materialized view)时产生的错误
|