荐 Oracle内存结构
内存结构
-
Oracle内存结构由以下两个内存区组成:
系统全局区 (SGA): 在实例启动时分配,它是Oracle实例最基本的组件之一。
程序全局区(PGA): 当服务进程启动时分配。
系统全局区(SGA)
-
SGA由若干个内存结构组成:
固定区域(fixed size):存储SGA中各种组件的信息,大小不能修改。
可变区域(variable size):包括共享池(sharedpool)、大池(large pool)、Java池(Java pool)、 流池(stream Pool)等。
数据库高速缓冲区(database buffer cache)
重做日志缓冲区(redo log buffer)
--查看SGA的内存分配情况
SHOW SGA
--或者
SELECT * FROM v$sga;
- 从Oracle 9i开始,SGA为动态的,其大小由SGA_MAX_SIZE 参数指定。
- Oracle是利用区组(granules)来管理SGA的。区组是一片连续的虚拟内存区,是Oracle分配和
回收内存区的基本单位。 - 区组的大小取决于所估计的 SGA的大小(即SGA_MAX_SIZE参数)。
--查看SGA_MAX_SIZE的值
SHOW PARAMETER SGA_MAX_SIZE
--查看当前SGA总的内存大小
SELECT SUM(value)/1024/1024 "Total SGA MB" FROM v$sga;
共享池(Shared Pool)
- 共享池用来存储:刚刚执行过的 SQL 语句(statements)、刚刚使用过的数据定义(data definitions)
- 由两个关键的与性能相关的内存结构组成:库高速缓存(Library Cache)、数据字典高速缓存(Data Dictionary Cache)
- 共享池的大小是由参数 SHARED_POOL_SIZE指定。
--修改共享池的大小
ALTER SYSTEM SET SHARED_POOL_SIZE = 250M;
库高速缓存
- 库高速缓存包含共享SQL 区和共享PL/SQL 区两部分
- 库高速缓存的用途:
存储有关最近使用过的SQL和PL/SQL语句
使通用语句的共享成为可能
在Oracle 11g中,库高速缓冲区还可以包括SQL或PL/SQL的执行结果 - 库高速缓存使用LRU (最近最少使用) 的队列或算法进行管理。
- 只能通过设置共享池的大小来间接设置库高速缓存的大小。
数据字典高速缓存
-
数据字典高速缓存的用途:
存储数据库中最近刚刚使用过的数据文件、表、索引、列、用户和其他的数据对象的定义和权限等信息
在编译阶段,服务器进程要查看数据字典的这些信息,以完成对象名字解析和访问权限的校验工作
将数据字典信息装入内存可改进查询语句和DML语句的响应时间 -
其大小通过设置共享池的大小来间接设置。
-
工作原理:
当用户发出SQL语句时,服务器进程将首先在数据库高速缓冲区中搜寻所需的数据,如果找到就直接使用而不进行磁盘操作;如果没有找到就将进行磁盘操作,把数据文件中的数据读入数据库高速缓冲区中。
使用LRU(最近最少使用)的队列或算法对数据库高速缓冲区进行管理 -
有关参数设置:
DB_BLOCK_SIZE:设置Oracle数据块(内存缓冲区)的大小。该参数的值是在创建数据库时设定的,如果要改变此参数的值一般需要重建数据库。
DB_BLOCK_BUFFERS:设置内存缓冲区的个数。该参数的值修改后必须重新启动数据库。 -
数据库高速缓冲区大小 = DB_BLOCK_SIEZ * DB_BLOCK_BUFFERS
-
DB_CACHE_SIZE
在Oracle 9i或以后的版本中引入的
该参数是一个动态参数,可以在数据库运行时动态地修改其值。
--改变数据库高速缓冲区的大小。
ALTER SYSTEM SET DB_CACHE_SIZE = 250M;
- 内存缓冲区顾问(v$db_cache_advice)
它是Oracle 9i或以后的版本中提供的一个工具,用于获得调整数据库高速缓冲区的统计信息。
内存缓冲区顾问共有三种状态:ON、READY和OFF。
通过修改初始化参数DB_CACHE_ADVICE的值,可改变该工具的状态。
--查看内存缓冲区顾问的状态。
SELECT id, name, block_size, advice_status FROM v$db_cache_advice;
--关闭内存缓冲区顾问工具。
ALTER SYSTEM SET DB_CACHE_ADVICE = OFF;
重做日志缓冲区
-
重做日志缓冲区的用途:
引入该缓冲区的主要目的是数据恢复(在Oracle 8i之前也是唯一的用途)
在该缓冲区记录了数据库中数据块的所有变化,包含了重新构造或重做变化所需的信息,这些信息称为重做日志记录(redo entries)。 -
其大小由 参数LOG_BUFFER 所决定。
大池(Large pool)
- 它是一个可选的内存结构。
- 它可以减轻Shared Pool的负担,提高效率。
- 在以下情况下使用:
在多线程(MTS)或共享服务器(Shared Server)连接时,存储内存的会话信息(UGA)
在大规模I/O及备份和恢复操作时可能使用该区 - 其大小可通过动态参数LARGE_POOL_SIZE进行设置。
Java池(Java Pool)
- 它是一个可选的内存结构。
- 引入它的目的是能够编译 Java语言的命令。
- 如果要使用Java语言就必须设置它。
- 其大小可通过动态参数JAVA_POOL_SIZE进行设置。
程序全局区(PGA)
- 它是一个私有的内存区,不能共享,且只属于一个服务器进程。
- 生命周期:
随着服务器进程的创建而被分配
随着服务器进程的终止而被回收 - PGA主要包括以下结构:
排序区(sort area):用于处理SQL语句所需的排序。Cursor状态区(cursor state):用于指示会话当前所使用的SQL语句的处理状态。
会话信息区(session information):包括会话的用户权限和优化统计信息。
堆栈区(stack space):包括其他的会话变量。
进程结构
- User process(用户进程): 在一个数据库用户请求与Oracle服务器连接时启动。
- Server process (服务器进程) : 与Oracleinstance(实例)相连,当一用户创建一会话时启动。
- Background processes(后台进程): 当 Oracle实例启动时启动。
后台进程
- 后台进程用来维护和保证物理(外存)结构和内存结构之间的关系。
- 5个必需的后台进程:数据库写进程 (DBWn)、重做日志写进程 (LGWR)、系统监督进程 (SMON)、进程监督进程 (PMON)、检查点进程(CKPT)
注意:这5个后台进程中任何一个未能启动,则实例都将自动关闭。
--查看后台进程的基本信息。
select spid, pid, username, program, pname,background
from v$process
where background = '1';
数据库写进程(DBWn)
- DBWn负责将高速数据缓冲区中的“脏”数据块写到数据文件中。
- DBWn并不是随时将所有的“脏”数据块都写入数据文件,只有满足一定的条件,才开始批量地“脏”数据块写入数据文件,以达到尽量减少I/O操作,提高服务器性能的目的。
- 当以下情况发生时DBWn写 :
当脏缓冲区的数量超过了所设定的限额时
当所设定的时间间隔已到时
当有进程需要数据库高速缓冲区却找不到空闲的缓冲区时
当检验(检查)点发生时
当某个表被删除(drop)或截断(truncate)时
当某个表空间被设为只读状态(read only)时
当对某个表空间进行联机备份时
当某个表空间被设为脱机状态(offline)或正常状态(normal)时
重做日志写进程(LGWR)
- LGWR负责将重做日志缓冲区的记录顺序地写到重做日志文件中。
- Oracle系统首先将用户所做的修改日志信息写入日志文件,然后再将修改结果写入数据文件。
- 以下情况发生时LGWR写 :
当某个事务被提交时
当重做日志缓冲区中所存的记录已超过缓冲区容量的1/3时在DBWR将数据库高速缓冲区中修改过的数据块写到数据文件之前(如果需要)
每3秒钟
系统监督进程(SMON)
- 系统监督进程(SMON)负责:
实例恢复(实例恢复、打开数据库允许用户访问、回滚没有提交的事务)
回收或合并空闲磁盘空间
释放临时段
进程监督进程(PMON)
- 负责进程崩溃后的清理工作:
回滚用户当前的事务
释放用户所加的所有表一级和行一级锁
释放用户所有的其他资源
检查点进程(CKPT)
- 检查点进程负责:
在检查点时调用DBWn
用检查点信息修改数据文件头
用检查点信息修改控制文件
归档日志进程(ARCn)
- ARCn是一个重要的可选后台进程。
- 当数据库设置为归档(ARCHIVELOG)模式时,ARCn自动执行归档操作,即将联机重做日志文件 复制到归档日志文件中。
- 归档日志文件保留了对数据库所做的所有变化的记录。
本文地址:https://blog.csdn.net/JaneWay_Chen/article/details/107329157
上一篇: 网易严选和拼多多的化学反应 消费升级碰上消费降级?
下一篇: 苹果开发者账号应该如何续费?