关于oracle脏块如何写入的信息

oracle dbwn是按照lruw链来写脏块的,检查点队列中记录的是lrba,那么CKPT发生的时候会调度dbwn来写检查点

1、dbwn会将数据块从buffer cache写入数据文件,对应的块仅仅会从lruw链上摘下去,oracle dbwn是按照lruw链来写脏块的这句话是不对的,dbwn进程是按照ckeckpoint链上的数据块顺序来写数据块。

创新互联公司长期为1000+客户提供的网站建设服务,团队从业经验10年,关注不同地域、不同群体,并针对不同对象提供差异化的产品和服务;打造开放共赢平台,与合作伙伴共同营造健康的互联网生态环境。为威远企业提供专业的网站建设、成都网站建设威远网站改版等技术服务。拥有10年丰富建站经验和众多成功案例,为您定制开发。

2、检查点发生的时候肯定会调度dbwn来写检查点列队(checkpoint链)上的脏数据块,目前检查点又分为增量检查点和完全检查点,完全检查点会在alter system checkpoint和一致性关闭数据库的时候触发,会把checkpoint链上所有脏数据块都写入数据库。而增量检查点做了什么呢?增量检查点会把checkpoint链上第一个块的lrba地址写入控制文件,lrba对应的是checkpoint链上第一个数据块第一次修改的那个操作所对应日志的位置,同时checkpoint链上从链头开始的一部分数据块写入数据文件(checkpoint链上的数据块是严格按照修改时间的顺序来排列的,并且如果对同一个块做了多次修改,checkpoint链上也只有这一个块,可以认为多次修改记录都在这一个数据块上,并不是像你说的检查点队列上挂的只是这个块的第一次被修改时的数据块,这里我也不是太理解你的意思),数据块写入数据文件自然就需要dbwn进程(这里是检查点进程触发了dbwn),而dbwn写脏数据之前lgwr会做什么呢?lgwr会先把对应的日志写入redo.log。也就是dbwn会触发lgwr,oracle就是这样,写数据之前必然先写日志,有日志数据就是安全的。

3、lrba是用来干什么的呢?比如发生增量检查点,记录lrba地址到控制文件,触发dbwn,要从checkpoint链上摘掉5个块,摘掉之前dbwn触发lgwr先把这五个块对应操作的日志写入redo.log,有日志了,但是在这个时候(dbwn还没有将这5个脏数据块写入数据文件时侯)数据库崩溃了,buffer cache中数据都丢了,下次打开数据库的时候。smon进程会检查数据文件的end scn,如果为空就是数据库没有正常关闭(这里你可以看看实例恢复的原理,就不多说了),这个时候就要实例恢复,所以就会定位一个恢复点,lrba地址就是这个恢复的点,需要把刚刚以写日志的5个块重新在buffer cache中构造出来,lrba地址就是这个作用,但是实例恢复的具体情况还分很多,可以看看相关书籍。

希望可以帮助你。

oracle中脏数据以及脏块是怎么来的,有啥区别

一,脏数据:

1,脏数据就是读到database buffer cache做了修改但还没有写到datafile里面的数据,只要没有写入数据文件,不管是否提交,都可以称为脏数据。

2,另外一个表的外键,由于某些原因,这个外键关联失效了,但是这个外键列没有删除,那么这一列数据也可以称为脏数据,就是没有意思的或者冗余的数据都可以叫做脏数据。

二,脏块

存放脏数据的数据块(data block)就可以称为脏块。

oracle中脏数据块是怎么会事儿?

脏数据是相对于原数据而言的,是指被修改过的,与原数据不一样的数据。

在oracle有SGA中,有个数据高速缓冲区(database buffer cache),由许多大小相等的缓存块组成。这些块根据使用情况不同,可分为脏缓冲块、空闲缓存块和命中缓存块三类:

1. 脏缓存块(dirty buffers):它保存的是已经被修改过的数据。当一条SQL语句对某个缓存块中的数据进行修改后,这个缓存块就被标记为脏缓存块。

2. 空闲缓存块(free buffers):不包含任何数据,它们等待后台进程或服务器进程向其中写入数据。当oracle从数据文件中读取数据时,将会寻找空闲缓存块,以便将数据写入其中。

3. 命中缓存块(pinned buffers):是那些正被使用,或者被显式地声明为保留的缓存块。这些缓存块始终保留在数据高速缓冲区中,不会被换出。


名称栏目:关于oracle脏块如何写入的信息
文章出自:http://scyanting.com/article/dscshjd.html