DBWn和LGWR
用户修改某一数据块,同时会产生redo日志和脏数据,当用户使用commit提交,LGWR进程会把log buffer中的数据提交到磁盘。但DBWn可能还不会写入到磁盘,此时的数据有可能还在cache buffer,等达到某一条件才会写入,如果此时数据库实例宕掉,data buffer被清空,再次启动实例就会从redo中重做用户已提交但未写入磁盘的操作。
DBWn和CKPT
由于cache buffer可能会很大,一次性将内存中的数据写入磁盘,会造成很大的性能问题,这时就需要用到CKPT,通常叫检查点进程。为了在检查点的算法上更加的具有可扩展性,引入了检查点队列,该队列上串起来的都是脏数据块所对应的buffer header。每次DBWn写脏数据块时,也是从检查点队列上扫描数据块,并将这些脏数据块写入数据文件。然后,DBWn会将这些已经写入到数据文件的脏数据块从检查点队列上摘下来,这样即便时在很大的data buffer下工作,CKPT也能快速的确定哪些脏数据块已经被写入到数据文件,哪些还未被写入,显然,只要在检查点队列上的数据库都是还没写入数据文件的脏数据块。
LGWR和CKPT
它们的合作主要在实例恢复期间,恢复过程中一定要有起点和终点,终点就是用户的commit,起点就意味着在这之前的数据都已从内存同步到数据文件中,其后就是脏数据,起点定位时间太长,说明下次恢复时间周期长,周期长安全隐患大,启动定位时间太短,说明DBWn进程频繁的写,IO就比较紧张。为了确定最佳起点位置,LGWR和CKPT相结合,使用CKPT进程来定位起点,加速实例恢复。
DBWn触发写的条件 1.产生检查点 2.脏数据缓冲区达到阀值 默认10% 3.扫描整个data buffer没有空闲 ?data buffer中包含脏的和未脏的 优先写脏数据列表 再写未改的 4.timeout超时 如果DBWR没事做 会被每三秒唤醒一次去巡检 写不写不一定 5.集群环境的ping请求触发多实例的数据写请求 6.表级别的truncate或drop也会触发数据写 7.修改表空间的read only 8.做表空间的off line(离线) 9.热备份 begin backup命令
CKPT目的: 1、减少实例恢复所需要的时间 2、确保数据库规律地把脏数据写入磁盘 3、确保数据库在一致性停库期间把已经提交的数据写入到磁盘
CKPT触发DBWn和LGWR写的条件
注意: CKPT进程不会往数据文件或者日志文件写数据
1、一致性关闭数据库 2、alter system checkpoint语句 3、在线redo日志切换 4、alter database begin backup语句 5、设置表空间read only 6、正常设置表空间offline 7、shrink数据文件 8、执行alter tablespace begin backup语句 手动执行alter system checkpoint完全检查点会将所有脏块写盘(包括未提交的) 关闭数据库时会将为完成的事物回滚.再将脏块写盘 同时,完全检查点会更新控制文件和数据文件头.
LGWR触发写的条件
1.commit 2.redo log buffer 1/3满 3.redo log buffer 日志缓冲区达到1M 4.写日志优先,当DBWR要写脏数据时,要检查脏数据对应的日志是否写盘,如果日志还没写,会优先写日志 5.3秒写一次