- 最后登录
- 2017-9-4
- 在线时间
- 46 小时
- 威望
- 205
- 金钱
- 2311
- 注册时间
- 2011-10-13
- 阅读权限
- 150
- 帖子
- 88
- 精华
- 0
- 积分
- 205
- UID
- 26
|
发表于 2017-8-3 16:09:51
本帖最后由 biotwang 于 2017-8-3 16:10 编辑
这里你将checkpoint的概念和commit的概念搞混了。
你的case说明commit的时候,数据还未写入磁盘。
什么是检查点?
所谓检查点(checkpoint)是一种对被修改更新的数据块从缓存中清出至磁盘的动作。通常,当你要对某数据块进行更改时,数据块首先会被拷贝至内存中,然后再被你更改,因此你的改动在内存中。当你commit这个块,它还没有写到数据文件中,但它已经在REDO LOG中进行了记录,因此我们可以在数据库实例发生事故失败后“replay”这些变更事务。最终,系统会将你修改的块checkpoint到你的磁盘数据文件中。
检查点号即当时所有脏的buffer块被写入磁盘时的SCN号。检查点可以是 对象/表空间/数据文件/数据库 级别的。
一个成功的检查点保证了所有数据库变更到了检查点SCN,且已经都记录在数据文件中。那么如果需要实例恢复,那也仅是对其检查点之后的变更进行前滚应用。
检查点的目标是将脏buffer块从SGA安全写入到磁盘。
哪些事件会触发checkpoint:
● 当需要DBWR将Oracle SGA中的所有脏缓冲块写入数据文件
● 当redo log发生切换时
● 当到LOG_CHECKPOINT_TIMEOUT时间时
● 当发出'alter system switch logfile'或'alter system checkpoint'命令时
当触发检查点时,checkpoint process会对控制文件进行更新。请记住检查点操作会将所有变更的(脏)块写入磁盘。通过在控制文件中记录下实际情况,Oracle知道在实例失败后,哪些redo日志需要被应用。进行实例恢复时,Oracle需要应用所有在最后记录的检查点之后生成的redo。
DBWR会将脏块从内存缓冲写入磁盘,但这个操作的发生和你是否"commit"没有关系。commit时调用到的是LOGR。
当log buffer达到1M,满1/3,或每3秒,或每次commit时,都会触发redo写。
DBWR <---> checkpoint
LGWR <---> commit
注意:
● Log switch会发生checkpoint,但checkpoint不会引起log switch.
● 当checkpoint完成,redo日志中那些checkpoint之前的记录数据在实例恢复时就不再需要了。 |
|