Chinaunix首页 | 论坛 | 博客
  • 博客访问: 510729
  • 博文数量: 101
  • 博客积分: 1635
  • 博客等级: 上尉
  • 技术积分: 1282
  • 用 户 组: 普通用户
  • 注册时间: 2012-07-05 01:51
文章分类

全部博文(101)

文章存档

2019年(2)

2018年(16)

2013年(14)

2012年(69)

我的朋友

分类: Oracle

2018-10-25 13:45:26

1 那么oracle是如何通过哪几个方面来实现这个持久性的呢?
1) memory 方面,为了实现更好的课伸缩性和高并发,oracle引入了redo buffer。理论上讲,尽可能的实现每次都将commit的block都flush到disk中。
不过,很多时候,如果业务量很大,那么这个可能也是一个硬件拼镜,比如IO。
2)避免介质失败,关于这点,主要是通过进行冗余来实现,比如我们进行存储级别的raid或利用asm failgroup等等。
3)logging记录
通过logging记录操作变更,其实有很大好处,可以记录数据库操作变更的历史信息,而且引入redo buffer后,还可以便面memory挥发性错误
,因为oracle有一个日志写优先的说法,比如我们更改一个block,首先会在redo buffer进行分配,并记录去变更信息,当事务commit后,不必去
flush cache buffer,而只需要将redo buffer中的脏数据写入到redo logfile就行了。我们知道flush buffer cache的代价是很大的。
4)complete 失败
如何整改系统都出现损坏,那么针对这样的场景,oracle本身也提供了解决方案,比如DG


2 redo的写入过程
  在介绍oracle redo 的写入之前,我们了解redo logging的几种方式。
  1) 什么是logging?就是产生redo记录的过程。
--logical:逻辑上是指那些被执行的sql语句会产生redo
 具体指操作都会记录到一个record.如果某个事物失败了,那么涉及的所有相关record apply都会失败。当然每种操作类型是通过opcode来标示的。
----physical 物理上是指有多少byte发生了改变。
 2)oracle中事务的持久性原则
在oracle数据库中,对于一个事务,oracle是如何来保证其持久性的?
---log befor data
---lgwr before dbwn
---flush log on commit
----checkpoint befor(redo log重用)
针对上面4中涉及到的原则,我们进行分别描述:
日志写优先(data):
    简单的讲就是任何数据库块发生改变时,必须先写入redo数据(实际上是redo buffer)。
    其目的是什么?保证任何一个数据库发生改变后,都有对应的redo信息。显然,这样有利于我们在进行实例恢复进行replay apply.
lgwr 优先于dbwn:
在某个时候,如果dbwn进行需要将buffer cache中的脏块写入到disk上,那么这个时候需要进行判断。如果该脏块redo信息还在redo buffer
中(还未被写入到redo log中)时,是不容许dbwr进程去写入的。只有那些在redo buffer中不存在的block才能被dbwr写入到disk中。当然如果在这个时候,dbwr进行必须
进行写操作,那么会触发lgwr进行去flush log buffer的。然后dbwn进程再进行操作(此时dbwn进程会进行等待,直到lgwr进程将log buffer中的数据写入到redo logfile中才会开始操作)

3)通过实验来展示redo的写入过程
大概是如下一个过程:
1. user process (procl)进行操作,例如dml操作某个表;
2. buffer cache中对应的脏块在被dbwN进程写入到disk之前,这些block对应change vector会被copy到redo buffer中。
3. procl进程获得redo copy latch;表明该进程正在copy内容到log buffer中。
4. procl进程获得redo allocation latch;因为进程需要copy内容到log buffer中,那么必然要在log buffer中
  分配相关的空间,所以必须获得该latch;
5. procl进程从pga temporary buffer中copy change vectors到log buffer中。
6. procl进程完成copy以后,释放reod allocation latch;
7. procl进程释放redo copy latch;
8. prod进程post Igwr进程去flush log buffer.另外如果相关的事务已经提交或者达到log buffer写的要求时,Igwr进程会
  自己唤醒然后去把log buffer的内容写到redo logfile。
9.当然,Igwr进程在写log buffer之前会先获得redo writing latch,每次写完以后会释放该latch。


针对上面latch的顺序,简单总结一下,就是一个如下的流程:
server process在pga中产生redo entry;
server process获取redo copy latch;(注意,redo copy latch存在多个)
server process获取redo allocation latch;
在log buffer中分配空间;
释放redo allocation latch;
server process}}redo entry信息写入到log buffer中;
当server process完成操作之后,释放redo copy latch.














阅读(2279) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~