设为首页 收藏本站
查看: 538|回复: 0

[经验分享] oracle database buffer cache

[复制链接]

尚未签到

发表于 2015-12-18 09:31:58 | 显示全部楼层 |阅读模式
  
  DB buffer cache
  1.database buffer cache主要用于存放从数据文件中读取出来的数据块,也缓冲系统正在使用或者最近使用完的数据块。所有连接到数据库的用户,都可以共享该内存区域。
  2.database buffer cache主要目的为优化物理I/O和保存常用的块在内存中,不常用的块写入数据文件中。
  优化物理I/ODB buffer cache用于缓存应用修改后的脏块,并在脏块生成前产生redo日志,在oracle中,redo日志的写入和脏块的写入是分开进行的,通过检查点进程(CKPT)来协调,这样可以提高物理I/O的写入效率。
  保存常用块:使用LRU算法实现数据库中热块的长久保存,提高读取效率。
  3.DB buffer cache中的数据块可能存在的状态:
  未使用块:缓冲中从未被使用或者当前未被使用的块。
  干净块:状态与数据文件中的数据块保持一致,不需要被检查点进程写入数据文件,可以被复用。
  脏块:数据块被修改,且未写入磁盘。
  总结:
  oracle DBbuffer中,脏块放入到检查点队列中,等待CKPT进行检查点位置维护并写入数据文件中;干净块放入到LRU链表,使用LRU算法进行管理。
  4.每个缓冲数据块都具有两种访问模式:pinned或者free,用于控制多个会话对同一数据块的访问。
  5.DB buffer cache通过LRU算法来实现缓冲的高效访问。
  6.DB buffer cache中进行数据块读取时,有当前模式读(current mode get,将发生脏读)和一致性读(consistent read get,默认,需要用到UNDO数据)。
  7.DB buffer逻辑读和物理读:
  逻辑读是指从DB buffer中获取数据;
  物理读是指从闪存卡(flash cache)或者从磁盘中获取数据;
  8.DB buffer的写入:
  DBWn定时的把脏数据块和冷数据块放入到磁盘中,触发DBWn写的三种情况:
      1.服务器进程需要进行物理读,但是buff中已经没有干净块可以使用了;
      2.数据库主动触发检查点的时候;
      3.将表空间置成只读表空间或者将表空间置成离线状态;
  9.DB Buffer的读取
  当客户端进程请求一个缓存块,服务器进程的搜索顺序为:
  (逻辑读)搜索整个DB Buffer
  (优化物理读)如果开启闪存卡,则搜索闪存卡内容;
  (物理读)如果上述两步均找不到,则服务器进程从数据文件中读取数据块并放入DB buffer中,再进行一次逻辑读。
  10.缓冲触碰计数(buffer touchcounts
  oracle利用缓冲的触碰计数来实现LRU算法管理缓冲中的数据块。当一个缓冲数据块被pin住,则将数据块的touch count1(为了防止touch count的暴增,oracle3秒内所有的Pin操作,视为一次touch),将touch count值大的认为是热块,向前移动LRU头部,留在缓冲池中,对外提供访问。反之,向后移动LRU尾部,逐渐退出缓冲池中。(注意,缓冲块的移动并不是真正的物理移动,而是LRU链表上指针的位置的移动。)
  11.缓冲和全表扫描关系
  当一个数据块从磁盘中读取进缓冲中,oracle将其放到LRU链表的中间,这样touch count值大的就可以继续留在LRU热端,而当数据库进行一次大表的全表扫描,并且此次全表扫描的记录数量大小已经超出了数据块的大小,这样可能将LRU之前维护的经常访问到的数据块清除出buffer问题。
  oracle解决这个问题的方法为将全表扫描进入buffer中的数据块特殊对待,即全表扫描进入buffer中的数据块会被立刻置成可重用状态。
  12.缓冲池
      1.缓冲池是缓冲块的集合,oracle的整个DB buffercache由多个缓冲池组成。可以通过手工配置缓冲池实现决定数据是留在缓冲中还是数据被使用完后立刻就可以被新的数据覆盖,以此来达到控制数据块的老化。
      2.主要的缓冲池有:
      default pool:普通的数据块缓冲都在该区域,若没有公共配置其他缓冲池,则默认数据库中只存在该缓冲池。
      KEEP pool:该缓冲池放入想要长期存放在内存中以提供访问的数据,只有发生缓冲池空间不足时,才会将里面的数据清除。
      recycle pool:该缓冲池放入不经常使用的数据。
      3.每个数据库都有标准块大小,但oracle也支持创建非标准块大小的表空间,这样,buffer cache就必须支持非标准的块大小。所以,在DB buffer cache中针对不同的块大小有不同的缓冲池大小,在创建非标准块大小的表空间时,需要先修改db_nk_cache_size参数。

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-152798-1-1.html 上篇帖子: Oracle数据库坏块(corruption) 下篇帖子: 附录A Oracle Dataguard 物理Standby跨平台组合支持列表
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表