日志缓冲区日志缓冲区是一块比较小的内存区域 , 它是用来短期存储将写入到磁盘中的重做日志文件中的变更向量的 。
日志缓冲区存在的意义依然是为了减少磁盘IO , 减少用户的等待时间 , 试想下 , 如果每一次用户DML操作都要进行等待重做记录被写入到磁盘中去 , 体验会有多差劲 。
日志写入器(LGWR)顾名思义 , 日志写入器(LGWR)就是把日志缓冲区内的内容写入到磁盘的重做日志文件中去 , 相比数据库写入器(DBWn) , 日志写入器就勤快多了 。
以下三种情况LGWR会执行写入:
a.commit时写入
前面提过 , DBWn的写入和commit没有任何关系 , 如果commit时数据库没有任何记录 , 那数据就真的丢失了 , Oracle 的重做日志就是为了保证数据安全而存在的 , commit时 , 会话会先挂起 , 等待LGWR将这些记录写入到磁盘上的重做日志文件中 , 才会通知用户提交完成 。所以 , LGWR在commit时执行写入 , 是为了确保事务永不丢失 。
b.日志缓冲区的占用率达到1/3 。
c.DBWn要写入脏缓冲区前
这个写入是为了数据回滚考虑的 。DBWn完全可能写入还没提交的事务(参照上面提到的写入时机) , 那如何保证事务回滚呢?
首先要知道 , DBWn除了写入实际的数据 , 还会写入撤销数据(不了解的同学可参考我的另一篇博文中对于撤销段的描述 Oracle闪回技术详解 。)简单说 , 事务回滚需要撤销数据 , 在写入撤销数据前 , 会先写入针对撤销数据的日志记录(有点绕) , 若用户要进行事务回滚 , 就可以应用这些日志记录来构造撤销数据 , 然后进行回滚 。
我们对这两块最重要的内存区域和对应的后台进程做个总结:
数据库缓冲区缓存和日志缓冲区都是为了提高性能 , 避免频繁IO而存在的 。日志缓冲区相比数据库缓冲区缓存要小的多 , 并且不能进行自动管理 , 对于日志缓冲区的修改需要重启实例 , 数据库缓冲区缓存可进行自动管理 。作用在数据库缓冲区缓存上的DBWn进程 , 为了避免频繁的磁盘IO导致系统性能下降 , 会尽可能少地执行写入 , 且DBWn的写入和commit操作没有任何关系;
而作用在日志缓冲区上的LGWR进程 , 则会非常积极地进行写入 , 一般情况下 , 它几乎是实时地将重做日志记录转储到磁盘中去 。LGWR是Oracle体系结构中最大的瓶颈之一 。DML的速度不可能超过LGWR将变更向量写入磁盘的速度 。
我们在来看下其他的内存区域和后台进程
共享池共享池是最复杂的SGA结构 , 它有许多子结构 , 我们来看看常见的几个共享池组件:
1.库缓存:库缓存这块内存区域会按已分析的格式缓存最近执行的代码 , 这样 , 同样的sql代码多次执行的时候 , 就不用重复地去进行代码分析 , 可以很大程度上提高系统性能 。
2.数据字典缓存:存储oracle中的对象定义(表 , 视图 , 同义词 , 索引等数据库对象) , 这样在分析sql代码的时候 , 就不用频繁去磁盘上读取数据字典中的数据了
3.PL/SQL区:缓存存储过程、函数、触发器等数据库对象 , 这些对象都存储在数据字典中 , 通过将其缓存到内存中 , 可以在重复调用的时候提高性能 。
大池:大池是个可选的内存区域 , 前面我们提到专有服务器连接和共享服务器连接 , 如果数据库采用了共享服务器连接模式 , 则要使用到大池;RMAN(Oracle的高级备份恢复工具)备份数据也需要大池 。
JAVA池Oracle 的很多选项使用java写的 , Java池用作实例化Java对象所需的堆空间
流池
从重做日志中提取变更记录的进程 和 应用变更记录的进程会用到流池(如实例不正常关闭 , 譬如断电导致实例关闭 , 在重启时 , Oracle会自动执行实例恢复过程 , 在此过程需要提取重做日志记录和应用重做日志两个动作)
以上列举了Oracle常见的内存结构 , 要注意的是 , 上面列举的内存区域 , 除了日志缓冲区是固定的 , 不能动态调整也不能进行自动管理外 , 其他内存区域都可以进行动态调整 , 也可以进行自动管理 。
推荐阅读
- Ngrok:超简单的内网穿透,了解一下?
- 这些iframe跨域解决方案你需要了解一下,以后不应该再是你的盲区
- 如何得知太极拳练的好不好 流汗了解太极水平
- 三种太极步的练法 你都了解了吗
- 分分钟了解跨域的几种处理方法
- 解释什么是图灵测试 谈谈你了解的图灵测试,是谁第一个通过的这个测试
- 社保小知识,关于社保,这8个问题你也许想了解!
- 从 MySQL 迁移数据到 Oracle 中的全过程
- 解决64位操作系统为Oracle服务器配置ODBC的问题
- 负载均衡的5种算法,你了解几种?