ORACLE Learning three Buffer cache 如何刷新脏块到磁盘

理解一个数据库的内部操作,如同了解一个应用程序的工作原理,这里面有软件工程师,架构师,以及各种严禁的奇思妙想,理解了工作原理,当数据库出现问题,就能心中有数,到底问题在哪里。

学习不停,活的长久,ON MY WAY.  Oracle 是怎么处理SGA中的脏块,将这些数据有条不紊的刷新到磁盘中的,这有关于ORACLE 数据库性能的一部分和在这部分的设计构想,也包含了一部分算法。可以依靠他的想法来辨别其他的数据库在这方面的设计的优劣。

先的理解几个名词

1 ckpt-Q checkpint process 检查点队列

在ORACLE 中是有这样的进程

2 LGWR   日志写入器

3 DBWR   database write

4 DBWN   database block write  数据写入器

——————————————————————————————

在ORACLE 中数据修改都是SGA中,共享内存中的数据修改,DML操作后,需要将这些数据刷新会磁盘,我们这里将这些在SGA中的BUFFER CACHE中的修改后的数据,叫脏块。 那ORACLE 是如何将这些脏块刷新到磁盘,并且其中有什么精妙。我学习完总结有以下几点。

1  先在内存分析

2  在内存中整理

3  在内存中合并

4  将小操作整合成大操作

5  降低I/O寻道,加速I/O落盘性能

总结的不好。

我们一个一个的来说,

例如我们UPDATE 几个表的数据行,内存中的这几个行的数据已经被更新,ORACLE会将这些脏块放入 checkpoint queue latch中,也就是CKPT-Q,检查点队列。同时修改后的数据,会进入ORACLE 的REDO ,REDO是按照操作的顺序进入的,也就是说REDO 是一个根据操作有序的列表,为什么其中有很多原因,这里解释其中一个原因

图画的很烂,不是UI   没有艺术细胞

例如 数据块1 修改后,数据块2 修改,几秒后数据块1 又再次修改

我们的UPDATE 语句很可能在几秒就修改一次同一行的某个字段的值。

在数据库块中只反映最后一次修改的值,但我们必须要有一个这个数据库修改的记录,也就是流水账,以便反映所有的对这个数据库的操作,那怎么办 

下面的图就是一个很简陋的REDO,里面其实记录了很多信息,这里就简化一下,里面将每次的对内存的操作都记录了,所以如果此时我们的数据还未刷到磁盘,但我们的数据库DOWN了,那就要回滚数据库,此时REDO里的信息就有用了,保证每个数据库的操作都是有序的回滚,不会搞错任何操作的顺序,导致信息的不正确。

其实REDO还有很多用处,这里仅仅是一个很小的点。

那后边我们继续怎么做,DBWR,要将这些真正的脏数据库(内存与磁盘不一样的数据),刷进你的磁盘。

而这时才是体现一个数据库设计精妙的地方,因为我们已经有了REDO LOG,REDO LOG是有序的,如果我们的数据块也有序的刷进磁盘,会怎么样,性能会很低,并且有序会意味着你的操作是单线程的,多线程保证不了有序性。

ORACLE 每秒数以万次的操作,怎么能不使用多线程去将数据刷入到磁盘,说以DBWR,必须是多线程的,并且是要考虑节约磁盘的操作次数。

考虑了这些因素。

首先ORACLE  要做的合并刷盘的操作,对同一个表的数据的修改,将这些内存数据从CKPT-Q的队列取出,然后放入对应每个OBJECT的SGA分配的缓冲区,将这些数据进行顺序的排列,例如,下面的图,用颜色表示每个数据库隶属的 OBJECT ,则如果我们一次将一个表,或者索引的数据进行排列组合后,(根据物理地址),在一次性的刷入到磁盘中,并且尽量将每次刷入的磁盘的 BATCH 变大,(这里有硬件的知识,磁盘寻道花费的时间,一般要比他写入的时间要长,所以一般数据库的写操作如果能节约寻道时间,则通常性能会比较好,但目前SSD 的硬件出现,已经PCI-E硬盘卡的出现,将这个磁盘的缺陷打破,所以就有为什么 MYSQL 提高硬件水平和并不比ORACLE性能差多少的情况出现,如同当今社会,将某种数据库致死的并不是另一种数据库,很可能是一种新的硬件,搞死某个汽车品牌的,并不是另一个汽车品牌,很可能是滴滴或者新的出行方式,所以都是兄弟,竞争是好事,能让自己更强,但新的方式出现,或许都的死,一个不留,路带歪了)

所以因为并行写也是要耗费资源和时间的,所以就引出另一个名词 db_file_parallel_write  WAIT,  SGA 中的数据要写入磁盘通过BATCH 方法里面是要包含很多数据块的,所以在每次BATCH 写入时是要等待此次写入完成后,才能释放这个操作的线程。

总结以上

1 数据块在修改后悔产生 REDO 记录

2 脏块会进入 CKPT-Q 队列

3 DBWR 没三秒检查一次队列,达到阈值出发向磁盘写赃款(还是那个原理越少对I/O的操作,如同公交车如果凑足一车人,和就上一个人就开车,都是一辆车,但最后的效率可是大大的不一样)

4 DBWR 根据检查点队列的顺序写磁盘(但这里面已经整理了数据,并不是完全按照脏块在 CKPT中的粒度的顺序)

END

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值