checkpoint 和LOGWR发生的时机

什么时候发生checkpoint?

LGWR 进程将重做条目写入到被 称为当前联机重做日志组的联机重做日志组之一
[$#8226]
当提交事务时
[$#8226]
当重做日志缓冲区三分之一满时
[$#8226]
当重做日志缓冲区内有超过1 MB 的已更改记录时
[$#8226]
当发生超时时每三秒钟
[$#8226]
DBWn 将数据库缓冲区高速缓存内的修改块写入数据文件之前

[@more@]

关于checkpoint的讨论

http://www.cnoug.org/viewthread.php?tid=21969

贴主: wanghai

checkpoint小议什么是checkpoint?
checkpoint
是一个数据库事件,它将已修改的数据从高速缓存刷新到磁盘,并更新控制文件和数据文件。什么时候发生checkpoint?我们知道了checkpoint会刷新脏数据,但什么时候会发生checkpoint呢?以下几种情况会触发checkpoint
1.
当发生日志组切换的时候
2.
当符合LOG_CHECKPOINT_TIMEOUTLOG_CHECKPOINT_INTERVALfast_start_io_target,fast_start_mttr_target参数设置的时候
3.
当运行ALTER SYSTEM SWITCH LOGFILE的时候
4.
当运行ALTER SYSTEM CHECKPOINT的时候
5.
当运行alter tablespace XXX begin backupend backup的时候
6.
当运行alter tablespace ,datafile offline的时候;增量检查点(incremental checkpoint
oracle8
以后推出了incremental checkpoint的机制,在以前的版本里每次checkpoint时都会做一个full thread checkpoint,这样的话所有脏数据会被写到磁盘,巨大的i/o对系统性能带来很大影响。为了解决这个问题,oracle引入了checkpoint queue机制,每一个脏块会被移到检查点队列里面去,按照low rdb(第一次对此块修改对应的redo block address)来排列,靠近检查点队列尾端的数据块的low rba值是最小的,而且如果这些赃块被再次修改后它在检查点队列里的顺序也不会改变,这样就保证了越早修改的块越早写入磁盘。每隔3秒钟ckpt会去更新控制文件和数据文件,记录checkpoint执行的情况。数据字典完全检查点
select * from X$KCCRT where indx=0;

ADDR INDX INST_ID RTNUM RTSTA RTCKP_SCN RTCKP_TIM RTCKP_THR RTCKP_RBA_SEQ RTCKP_RBA_BNO RTCKP_RBA_BOF RTCKP_ETB RTOTF RTOTB RTNLF RTLFH RTLFT RTCLN RTSEQ RTENB RTETS RTDIS RTDIT RTLHP RTSID RTOTS
-------- ---------- ---------- ---------- ---------- ---------------- -------------------- ---------- ------------- ------------- ------------- ---------------- ---------- ---------- ---------- ---------- ---------- ---------- ---------- ---------------- -------------------- ---------------- -------------------- ---------- ---------------- --------------------
4084B228 0 1 1 15 720368521 06/25/2004 18:49:37 1 949 2 16 0600000000000000 2 0 3 1 3 1 949 1 05/16/2004 13:29:03 0 1389 tbdb2in1 06/12/2004 12:30:50
这里显示了上一次的完全检查点是在06/25/2004 18:49:37发生,所以我们推断06/25/2004 18:49:37发生了一次日志切换,再去操作系统上去看生产的归档,果然1849有一个归档生产。
-rw-r----- 1 oracle oinstall 83532800 Jun 25 18:49 1_948.dbf

增量检查点
SQL> select * from X$KCCCP where indx=0;

ADDR INDX INST_ID CPTNO CPSTA CPFLG CPDRT CPRDB CPLRBA_SEQ CPLRBA_BNO CPLRBA_BOF CPODR_SEQ CPODR_BNO CPODR_BOF CPODS CPODT CPODT_I CPHBT CPRLS CPRLC CPMID CPSDR_SEQ CPSDR_BNO CPSDR_ADB
-------- ---------- ---------- ---------- ---------- ---------- ---------- ---------- ---------- ---------- ---------- ---------- ---------- ---------- ---------------- -------------------- ---------- ---------- ---------------- ---------- ---------- ---------- ---------- ----------
4084B45C 0 1 1 2 0 10762 29753 949 76847 0 949 106814 0 721554970 06/25/2004 21:05:10 529794310 529036227 1 526310932 1413781667 949 1 0
这里显示了low-rba,on-disk rba,checkpoint time等信息。

biti_rainy:

每隔3秒钟ckpt会去更新控制文件和数据文件,记录checkpoint执行的情况。这里应该是只更新控制文件,每3秒不是更新数据文件 记录 checkpoint 的执行情况,这个说法,没错,但不够详细,应该说,由于增量检查点和 checkpoint queue 的原理,ckpt 进程每次只是告诉 dbwr ,写dirty buffer将要一直写到最新这个位置,仅仅是告诉 dbwr 一个 checkpoint queue 中的结束点,而 ckpt 3秒中,在控制文件中报告一下 dbwr 最新写入的位置。 这样使得,比如数据库要做恢复的时候(instance recovery)可以从这个最新位置开始做恢复,而不是从数据文件中的 checkpoint scn 开始做恢复,这样将缩短恢复时间,尤其是 instance crash 的情况下启动更快另外要注意的是,检查点发生的时候,ckpt 去更新数据文件头和控制文件,并不是把当前检查点发生时候的 scn 更新进去,而是把上一次dbwr写入已经完成的检查点发生时候的 scn 更新进去 ,也就是说,更新控制文件和数据文件头 滞后于检查点的发生的,这个从恢复的原理也很容易理解,因为检查点发生的时候 dirty buffer还没有写入,自然不能立即更新成当前的 scn 了。

jerrysun 转:

LGWR 进程将重做条目写入到被 称为当前联机重做日志组的联机重做日志组之一
[$#8226]
当提交事务时
[$#8226]
当重做日志缓冲区三分之一满时
[$#8226]
当重做日志缓冲区内有超过1 MB 的已更改记录时
[$#8226]
当发生超时时每三秒钟
[$#8226]
DBWn 将数据库缓冲区高速缓存内的修改块写入数据文件之前 想問一下﹕這里 重做日志缓冲区三分之一﹑ 当重做日志缓冲区内有超过1 MB

"
重做日志緩沖區" 中所存貯的內容﹖雖說是修改后的內容﹐我想問這個修改后的內容是什么樣的﹖如﹕update emp set sal =100,deptno =30; 就這條語句﹐它會在緩沖區存放什么內容。是僅將 sal deptno 的舊值與新值一起存放﹐還是將 整條 update 語句 將其 rollback機制的語句一起存放 ﹐即與回滾段機制相同。這樣的話几百K 的緩存不一下就被放滿。這還與書寫的 SQL語句 長度有關羅﹑ :D 其二﹑发生超时时每三秒钟 這里的超時 三秒是什么意思﹐是指每三秒種 lgwr 都會讀 log buffer ﹐而不管是否有數據被更新。這樣跑空不是很不划算。 以上謝謝﹑

一个完整的日志条目包含 回滚段头的变化 回滚段的变化 数据块的变化
commit
信息 日志里面存储的不是SQL ,而是 被修改的对象,操作类型,修改数据信息等等

3
秒是空闲达到3

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/620862/viewspace-861439/,如需转载,请注明出处,否则将追究法律责任。

转载于:http://blog.itpub.net/620862/viewspace-861439/

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值