暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

《张烈Oracle入门》学习笔记--Checkpoint (CKPT)检查点进程

董小姐 2024-11-15
136

Checkpoint (CKPT)检查点进程

存盘点

触发 dbwn,写脏数据块

更新数据文件头,更新控制文件

Ckpt 进程会下降数据库性能,但是提高数据库崩溃的时候,自我恢复的性能!可以理

解为阶段性的保存数据,一定的条件满足就触发,就存盘!

检查点有增量检查和完全检查两种:

  • 完全检查

1.一致性shutdown数据库的时候。

2.alter system checkpoint;

结果为:

所有的脏数据块都写入数据文件

改写文件的头

  • 增量检查

除了完全检查点以外的所有其它检查点都是增量检查点,增量检查是查找检查点列表,将某

一个时间点做标记,该时间点前的脏块写入到数据文件,增量检查不一定马上执行,根据脏

的块多少来决定,这就出现了检查点滞后的情况。

参数log_checkpoints_to_alert决定是否将检查点的信息写入报警日志。默认为假,不写

日志。 可以将这个参数改为真,可以看到检查点的信息。


Fri Jul 06 12:30:52 2007 
ALTER SYSTEM SET log_checkpoints_to_alert=TRUE SCOPE=BOTH; 
Fri Jul 06 12:31:15 2007 
Beginning log switch checkpoint up to RBA [0xb9.2.10], SCN: 3334816 
Thread 1 advanced to log sequence 185 
  Current log# 2 seq# 185 mem# 0: D:\ORACLE\ORADATA\ORA10\REDO02.LOG 
Beginning log switch checkpoint up to RBA [0xba。2.10], SCN: 3334818 
Thread 1 advanced to log sequence 186 

system change number(scn),数据库的更改号码,如果不懂SCN就绝对不懂数据库,这

句话一点都不夸张,因为数据库中的一切运转都离开不了SCN,SCN的地位在数据库中就向

生活中的时间一样,觉察不到,但又处处离不开。SCN存在于数据块的块头,文件头,

也可以建立特殊的表,使SCN存在于表的行头,SCN存在内存中,它是维护数据库的运行基

本保证。备份和恢复更是根据SCN来决定要重做那些操作和交易。SCN的发生机制在不

同版本会不同,也不用去关心,可以理解为数据库的一切进程操作都要有一个时间

的标志,这就是SCN。Select ,update,delete,insert数据库的一切操作都有SCN。

数据库内的任何操作都产生scn。SCN小的就是先操作的,SCN大的就是后操作的,数据库

使用SCN来维护因果关系。可以将SCN理解为数据库的内部时间。


数据文件头会保存一个特殊的SCN

Stop scn记录在数据文件头上。当数据库处在打开状态时,stop scn被设成最大值0xffff

ffffffff。在数据库正常关闭过程中,stop scn被设置成当前系统的最大scn值。在数据库打

开过程中,Oracle会比较各文件的stop scn和checkpoint scn,如果值不一致,表明数据

库先前没有正常关闭,需要做恢复。

--查看数据库当前scn 
select current_scn from V$database;(10g才有) 
select dbms_flashback.get_system_change_number() from dual;(9i以后才有) 

检查点的scn,检查点是一个特殊的SCN,小于该号码的块都已经存盘了,数据库的恢复只

需要恢复该SCN号码以后的操作就可以了。

--SCN号码和物理的时间有对照表 SMON_SCN_TIME 
select * from SMON_SCN_TIME;


select name,checkpoint_change# from v$datafile; 

日志记录的范围

select GROUP#,sequence#,STATUS,FIRST_CHANGE#, 
to_char(FIRST_TIME,'yyyy/mm/dd:hh24:mi:ss') time from V$log;

GROUP#  SEQUENCE# STATUS	       FIRST_CHANGE# TIME
---------- ---------- ---------------- ------------- -------------------
	 1	   13       CURRENT		   1176883 2024/11/14:08:47:32
	 2	   11       INACTIVE		 1115265 2024/11/12:08:40:01
	 3	   12       INACTIVE		 1153044 2024/11/14:05:13:48

11号日志记录了1115265到1153044之间的数据库变化。 
12号日志记录了1153044到1176883之间的数据库变化。 
13号日志记录了1176883到最后的SCN之间的数据库变化。   


select current_scn,CHECKPOINT_CHANGE#, 
    current_scn-CHECKPOINT_CHANGE# need_reover_change  from v$database;

CURRENT_SCN CHECKPOINT_CHANGE# NEED_REOVER_CHANGE
----------- ------------------ ------------------
    1193823	       1191394		     2429    

可以看到,数据库的存盘点为 1191394,这个号码以后的变化都不保证正确的存储在

数据库中。这个号码到当前的 1193823 之间存在着 2429 个 SCN 的改变,当然这里含了所

有的 SCN 改变,有的操作产生了 SCN 但并没有改变数据库,如 SELECT 操作,要有 SCN 标记,但

不记录在日志文件中。

select GROUP#,SEQUENCE#,STATUS,FIRST_CHANGE# from v$log;

    GROUP#  SEQUENCE# STATUS	       FIRST_CHANGE#
---------- ---------- ---------------- -------------
	 1	        13      CURRENT		       1176883
	 2	        11      INACTIVE		     1115265
	 3	        12      INACTIVE		     1153044

上面的2429 个变化都存储在第1组中,日志号码为 13 号。也就是说如果现在数据库崩溃了,

使用 13号日志就可以完成数据库的恢复。

「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论