如何理解Oracle检查点

分类:编程技术 时间:2024-02-20 15:58 浏览:0 评论:0
0
本文主要讲解“如何理解Oracle检查点”。有兴趣的朋友不妨看一下。文章介绍的方法简单、快捷、实用。现在就让小编教你“如何理解Oracle检查点”!

检查点扫盲

什么是检查点

在数据库系统中,写日志和写数据文件是数据库中消耗IO最多的两个操作。这两个操作中,写入数据文件是分散的。写入时,写入日志文件是顺序写入的。因此,为了保证数据库的性能,数据库通常会保证在提交完成之前将日志写入日志文件,并将脏数据块存储在数据缓存中。 (buffercache)然后时不时的批量写入数据文件。也就是说,日志写入和提交操作是同步的,但数据写入是同步的d 提交操作是异步的。有一个问题。当数据库崩溃时,并不能保证缓存中的所有脏数据都会写入数据文件。这样,当实例启动时,必须利用日志文件进行恢复操作,将数据库恢复到崩溃前的状态。状态以保证数据的一致性。检查点是这个过程中的一个重要机制,通过它来确定应该扫描哪些重做日志并将其应用于恢复。

一般来说,检查点是一个数据库事件。检查点事件由检查点进程(LGWR/CKPT进程)发出。当检查点事件发生时,DBWn会将脏块写入磁盘,同时数据文件和控制文件的文件头也会被更新,以记录检查点信息。


检查点的功能

检查点主要有两个功能:

1.到保证数据库的一致性,这意味着将脏数据写入硬盘,保证内存和硬盘上的数据相同;

2.缩短实例恢复时间。通过日志恢复之前没有写入硬盘的脏数据。如果脏块太多,实例恢复时间会很长。检查点的出现可以减少脏块的数量,从而提高实例恢复时间。

通俗地说,检查点就像word的自动保存一样。


检查点分类

·全量检查点(普通检查点)

·增量检查点checkpoint(增量检查点)

checkpoint相关概念术语

在描述之前检查如何checkpoint 的工作原理,我们先来了解一些相关术语。


澳洲联储
(Redo字节地址)、低RBA(LRBA)、高RBA(HRBA)

RBA是重做日志块的地址,相当于数据文件中的ROWID。重做日志块通过该地址定位。 RBA由三部分组成:

1.日志文件序列号(4字节)

2.日志文件块号(4字节)

3、重做日志中记录的日志块起始偏移字节数(2字节)

RBA的常见形式有:

LRBA

LRBA

strong>

生成的重做日志记录在重做日志文件中对应的位置数据缓存(buffer cache)中第一次更新的脏块称为LRBA。

HRBA

数据缓存(缓冲区缓存)中的脏块最后更新时产生的重做日志记录在重做日志文件中对应的职位称为 HRBA。

检查点RBA

当检查点事件发生时,检查点RBApoint进程会记录当时写入的重做日志块的地址,即RBA。时间记录的RBA称为检查点RBA。接下来将把前一个检查点RBA和当前检查点RBA之间的日志保护的缓冲区高速缓存中的脏块写入数据文件。


Buffer checkpoint Queues
(BCQ)

Oracle会将数据中所有被修改过的脏块缓存按照LRBA序列形成检查点队列。这个队列主要记录buffer cache第一次变化的时间顺序。然后DBWn进程根据检查点队列顺序将脏块写入数据文件,从而保证更改首先发生。可以先将缓冲区写入数据文件。引入 BCQ 是为了支持增量检查点。


活动检查点队列
(ACQ)

ACQ包含所有活动检查点请求。埃亚当有新的检查点请求时,会在ACQ中添加一条记录,ACQ记录中包含对应的检查点RBA。 Checkpoint完成后,相应的记录将从队列中删除。


完整检查点(正常检查点)


<完整的Checkpoint工作流程

一个Checkpoint操作可以分为三个不同的阶段:

· 第一个阶段,Checkpoint流程开始一个检查点事件,并且和和和和和和。记录检查点RBA,通常是当前RBA。

· 第二阶段,检查点进程通知DBWn进程将检查点RBA之前的缓冲区高速缓存中的所有脏块写入磁盘。

·   确定所有脏块都已写入磁盘后,进入第三阶段。检查点进程将检查点信息(SCN)写入/更新到数据f中文件和控制文件。

更新SCN的操作是由CKPT进程完成的。 Oracle 8.0之后,默认启用CKPT进程。如果CKPT进程没有启用,则相应的操作将由LGWR进程完成。


正常检查点何时发生

以下操作会触发检查点事件:

· 日志切换,通过ALTER SYSTEM SWITCH LOGFILE。

· DBA通过ALTER SYSTEM发出检查点命令和检查点。

·                                                                                                                                                    还将执行数据文件的检查点 ALTER TABLESPACE TS_NAMEBEGIN BACKUP/END BACKUP。

· 当运行 ALTERTABLESPACE/DATAFILE READ ONLY 时。

· 当发出 SHUTDOWN 命令时。

特别注意:

1.日志切换会导致checkpoint事件发生,但是checkpoint oc当前不会引起日志切换。

2.日志切换触发普通的checkpoint,并不是大家所说的增量checkpoint,但是日志切换checkpoint的优先级很低。当日志切换h检查点发生时,不会立即通知DBWn进程写入数据文件,而是当有其他原因导致检查点或者写入数据文件的RBA超过日志切换检查点的检查点RBA时,此时日志切换检查点将被标记为已完成,并且控制文件和数据文件头将被更新。那么我们可以通过实验来验证这个说法。


检查点
和SCN有什么关系?

在Oracle中,SCN相当于它的时钟。在现实生活中,我们使用时钟来记录和测量我们的时间,而Oracle使用SCN来记录和测量整个Oracle系统的变化。 。

在Oracle中,检查点发生在t中的特定“点”ime”。SCN就是用来衡量这个“时间点”的。因此,当检查点发生时,就会将SCN写入到文件头中,记录这个检查点。


增量检查点


增量测量检查点工作流程

因为每个完整的检查点都需要将buffer cache中的脏块全部写入到数据文件中,这会导致IO消耗较大,频繁的完整检查点操作对系统的性能影响很大,为此, Oracle引入了增量检查点的概念,BufferCache中的脏块会按照BCQ队列的顺序不断写入磁盘,同时,CKPT进程会每3秒检查一次DBWn的写入进度,并记录将对应的RBA信息写入到控制文件中。

有了增量检查点,恢复实例时,哟您不再需要在崩溃之前应用完整检查点的重做日志。只需要从控制文件中记录的RBA开始恢复操作即可。 ,这可以节省恢复时间。


增量检查点发生的先决条件

·                                                 p; Fast_start_io_target/Fast_Start_mttr_target)

· log_checkpoint_interval 参数值

· log_checkpoint_timeout 参数值

最小日志文件大小

·    脏块数缓冲区缓存中


增量检查点的特点

· 增量检查点是持续活动的检查点。

· 没有checkpointRBA,因为这个checkpoint总是在进行中,所以普通checkpoint中不涉及checkpoint RBA的概念。

· 仅在内存中高级检查点

· 由 inc 完成的 RBA 信息剩余检查点记录在控制文件中。

· 增量检查点可以减少实例恢复时间。


增量检查点相关参数设置

log_checkpoint_interval

< p>设置两个检查点之间的重做日志块(重做日志块和系统数据块相同)的数量。当重做日志块的数量达到设定值时Checkpoint就会被触发。

log_checkpoint_timeout

设置两个检查点之间的时间间隔。当达到超时值时,增量检查点将被触发。 Oracle 建议不要控制此参数,因为事务大小随时间分布不均。将此值设置为 0 将禁用此设置。

fast_start_io_target

因为log_checkpoint_interval主要看重做日志块的数量,无法反映dirty的修改因此Oracle引入这个参数是为了当脏数据块数量达到一定数量时触发checkpoint,但这个参数实际上控制的是恢复时需要的IO数量。

fast_start_mttr_target

· 该参数是在 9i 中引入的,用于替代之前的三个参数。它定义了数据块崩溃后需要什么。 Oracle实际上在内部将实例恢复时间解释为两个参数:fast_start_io_target和log_checkpoint_interval。如果这两个参数没有明确指定,则计算值生效。

·                                                                                                 fast_start_mttr_target 可以设置的最大值为3600,也就是一小时。其最小值没有限制,但并不意味着可以设置任意小的值。该值将受到最小值的限制脏缓冲区(最小为1000),并且还会受到初始化时间和文件打开时间的限制。

· 设置该参数时,必须综合考虑系统的IO、容量、CPU等信息,在系统性能和故障恢复时间之间取得平衡。

· 将此参数设置为 0 将禁用快速启动检查点,这可以减少系统负载,但会增加系统恢复时间。

· 如果指定了fast_start_io_target或log_checkpoint_interval,它们将自动覆盖fast_start_mttr_target参数计算出的值。

在10g中,数据库可以根据各种系统参数的设置,自动调整检查点的执行频率,以获得最佳的恢复时间以及对系统正常运行影响最小的情况。通过自动检查点调整,Oracle可以在系统低IO运行时将脏块写入数据文件,因此即使DBA没有设置检查点相关的参数值或者设置了不合理的值,系统仍然可以获得一个非常合理的系统恢复时间。

10g中的增量检查点更能体现其持续活动的特点。在10g中,增量检查点不是在特定条件下触发的,而是由数据库根据系统参数设置自动触发。且在数据文件头中

·增量检查点只会将RBA信息写入控制文件。


查看系统的检查点动作

我们可以通过将LOG_checkpointS_TO_ALERT设置为来开启检查点跟踪TRUE ,以便可以跟踪检查点操作。

ALTER SYSTEM SET LOG_checkpointS_TO_ALERT=TRUE;

此设置后,系统检查点将记录在alert_$SID.log文件中。

V$DATAFILE_HEADER 还存储了一些相关信息一个完整的检查点发生,包括检查点发生时间和对应的SCN被检查的次数。

选择文件# NO、状态、表空间名称、名称、dbms_flashback.get_system_change_number CUR_SCN,
to_char(resetlogs_time, 'YYYY-MM-DD HH24:MI:SS') RST_DT, resetlogs_change# RST_SCN,
to_char(checkpoint_time, 'YYYY-MM-DD HH24:MI:SS') CKPT_DT, checkpoint_change# CKPT_SCN, checkpoint_count CKPT_CNT
from v$datafile_header;

/**< br/> 无状态 TABLESPACE_NAME CUR_SCN RST_DT RST_SCN CKPT_DT CKPT_SCN CKPT_CNT
--- ------- ---------------- -------- ------------------ ------------------------------------------ -- -- ----- ---------
1 在线系统 5335412008-01-12 16:51:53 446075 2008-08-0422:03:58 532354 65
2在线 UNDOTBS1 533541 2008-01-12 16:51:53 446075 2008-08-0422:03:58 532354 28
3 在线 SYSAUX 533541 2008-01-12 16:51:53 446075 2008-0 8-0422: 03:58 532354 65
4 在线用户 533541 2008-01-12 16:51:53 446075 2008-08-04 22:03:58532354 64
5 在线示例 533541 2008-01-12 16:51:53 446075 2008-08-04 22:03:58 532354 24
*/< p >
完整检查点

--我们首先执行
ALTER SYSTEM 检查点;

--以下是警报文件中的数据结果
Mon Aug 4 22:22:08 2008
Beginning global checkpoint up to RBA [0x8.c9d4.10], SCN: 533714
Completed checkpoint up to RBA [0x8.c9d4.10], SCN: 533714
--我们可以看到完整的checkpoint发生在SCN 533714

--我们来比较一下V$中的结果DATAFILE_HEADER
无状态 TABLESPACE_NAME CUR_SCN RST_DT CKPT_SCN CKPT_CNT
--- ------ ------------------ ------- - ------------------ ------ ------------------------- ------ ---------
1 在线系统 533790 2008-01 -12 16:51:53 446075 2008-08-04 22:22:08 533714 66
2 在线 Undotbs1 533790 2008-01-12 16:51:53 446075 2008-08-04 22:22:08 533714 29
3 在线 SYSAUX 533790 2008-01-12 16:51:53 446075 2008- 08-04 22:22:08 533714 66
4 在线用户 533790 2008 -01-12 16:51:53 446075 2008-08-04 22:22:08 533714 65
5 在线示例 533790 2008-01 -12 16:51:53 446075 200 8-08-04 22:22: 08 533714 25

--有没有看到数据文件头中已经记录了检查点时间和检查点SCN。


日志切换时的检查点

--先进行日志切换
ALTER SYSTEM SWITCH LOGFILE;

--然后查看alert中的记录
Mon Aug 4 22:31:39 2008
开始日志切换检查点到RBA [0x9.2.10], SCN: 534450
线程 1 前进到日志序列 9
当前日志# 2 seq# 9 mem# 0:/u/app/oracle/oradata/orcl/ redo02.log
8 月 4 日星期一22:35:58 2008
Completed checkpoint up to RBA [0x9.2.10], SCN: 534450

--我们可以看到该检查点经过了一段时间(这里是4分钟) ),结果

-s 查看V$datafile_header中的结果
No Status Tablespace_name Cur_SCN RST_SCN CKPT_SCN CKPT_CNT --- -------------------------- -------- -------- ----- ------ -------- ---------------------------- --- ----- -
1 在线系统 534770 2008-01-12 16:51:53 446075 2008-08-04 22:31:44 534450 67
2 在线UNDOTBS1 534770 2008-01-12 16:51:53 446075 2008-08-04 22:31:44 534450 30
3在线Sysaux 534770 2008-01-12 16:51:51:53 446075 2008-08-08-08-08-04 22:31:44 534450 534450 677 < br/>4 在线用户 534770 2008-01-12 16:51:53 446075 20 08-08-04 22:31:44 534450 66
5 在线示例 534770 2008-01-12 16:51:53 446075 2008-08-04 22:31:44 534450 26

--这里我们可以发现V$DATAFILE_HEADER中记录的SCN与发生日志切换的检查点的SCN相同< br/>--这证明日志切换会更新数据文件头,同时日志切换的检查点也会更新。t是一个比较底层的操作,
--会不会立即完成,这也是出于性能考虑。

>


增量检查点视图

目前已知只有LOG_checkpoint_TIMEOUT设置为非零值后触发的增量检查点才会在alert文件中存在记录中,其他条件触发的增量检查点不会记录在警报文件中。

-- 以下是 LOG_checkpoint_TIMEOUT 设置为 1800s 时生成的增量检查点记录
Sun Aug 3 19:08:56 2008
增量检查点最多可达 RBA [0x8.5]。 e17.0],当前日志尾部位于 RBA[0x8.1056.0]
Sun Aug 3 19:39:00 2008
增量检查点直至 RBA [0x8.1be0.0],当前日志尾部位于 RBA [0x8.1c6e.0]
2008 年 8 月 3 日星期日 20:09:04
增量检查点直至 RBA [0x8.2af5.0],当前日志尾部位于 RBA[0x8.2b6a.0]< br/>2008 年 8 月 3 日星期日 20:39:07
增量检查点直至 RBA [0x8.3798.0],当前日志尾部位于 RBA[0x8.3851.0]
2008 年 8 月 3 日星期日 21:09:10
增量检查点直至 RBA [0x8.47b9.0],当前日志尾部位于 RBA[0x8.48bb.0]
2008 年 8 月 3 日星期日 21:39:14
增量检查点直至 RBA [0x8.548d.0],当前日志尾部位于 RBA[0x8.5522.0]
2008 年 8 月 4 日星期一 21:05:18


查看 fast_start_mttr_target

通过查看 V$INSTANCE_RECOVERY 动态性能View可以查看一些MTTR相关信息。

SELECTTARGET_MTTR,ESTIMATED_MTTR,CKPT_BLOCK_WRITES,CKPT_BLOCK_WRITES FROMV$INSTANCE_RECOVERY

TARGET_MTTR

用户设置的参数FAST_START_MTTR_TARGET的值。

ESTIMATED_MTTR

根据当前脏块数和日志块数评估恢复所需时间。

CKPT_BLOCK_WRITES

检查点写入的块数。

CKPT_BLOCK_WRITES

由以下原因引起的额外数据库写入检查点(由于生成不必要的检查点,设置很小的系统恢复时间会对性能产生负面影响。为了帮助管理员监控该参数设置为较小值时对数据库的影响,该视图显示此列)


相关视图


V$
查看

V$DATAFILE_HEADER

查看数据文件完整的检查点信息。

V$INSTANCE_RECOVERY

查看 fast_start_mttr_target 设置和系统 MTTR 相关信息。


X$
查看

X$BH

< p > LRBA和HRBA用于查看脏块(还有一个rrecovery RBA,用于记录PMON部分块恢复的进度)。

X$TARGETRBA

查看增量检查点 RBA、目标 RBA 和磁盘 RBA。

X$KCCCP

还有增量检查点RBA和目标RBA信息。

X$KCCRT

Full checkpoint(全线程检查点)RBA信息。


补充说明

写完这篇文章后,我阅读了itpub上写的讨论。更新您的观点。 (http://www.itpub.net/viewthread.php?tid=1053847)

关于增量检查点和完整检查点之间的区别有很多争论,特别是对于日志切换。关于增量还是完整的争论更是真实,但事实上,我翻遍了Oracle的文档,并没有发现任何提及增量检查点(incremental checkpoint)或者完整检查点(full checkpoint)的概念。

我的观点是不需要区分增量和完整。真正需要了解的是检查点在不同的情况下会有什么样的行为,然后根据这些行为来配置数据库。 ,设置相应的para米,并制定相应的备份/恢复策略,就是这样。
以下是常见的检查点写入行为列表:

1.与alter systemcheckpoint等语句类似,先记录当前scn,然后推送DBWn进程写入脏数据。当记录的scn被写入时检查点结束,然后ckpt进程将记录的scn写入控制文件和数据文件头。

2.它是在设置参数log_checkpoint_timeout后生成的。当达到超时值时,ckpt进程记录当时DBWn写入脏数据的进度,即写入scn。此时,检查点信息仅记录在控制文件中。同时,如果设置了 LOG_checkpointS_TO_ALERT,我们将在警报中得到这样的信息:

Sun Aug 3 19:08:56 2008
增量检查点直至 RBA [0x8.e17.0 ],当前日志尾部位于 RBA[0x8.1056.0]

3。​ ckpt 进程记录progr唤醒时每 3 秒将检查点写入控制文件。这种情况和上面类似,只不过在alert中看不到,而且控制文件并不是每次唤醒都会写入,而是记录是否存在。 ,如果没有,就把它拉下来。

4.与alter system switchlogfile生成的类似,首先记录发出命令时的scn。 ckpt进程不会推送DBWn去写脏数据,而是会让DBWn根据自己的状态来写脏数据。 ,当写入记录的scn时,chpt进程更新控制文件和数据文件头。这种情况下还可以看到alert中的信息:

Mon ​​Aug 4 22:31:39 2008
Beginning log switch checkpoint up to RBA [0x9.2.10], SCN: 534450
线程 1 高级到日志序列 9
当前日志# 2 seq# 9 mem# 0: /u/app/oracle/oradata/orcl/redo02.log
8 月 4 日 22 日星期一: 2008 年 35:58
已完成 RBA [0x9.2.10] 的检查点,SCN:534450

至此,相信你对“如何理解Oracle检查点”有了更深入的了解了,不妨在实践中去做吧!这是网站。更多相关内容,您可以进入相关渠道进行查询。关注我们并继续学习!

1. 本站所有资源来源于用户上传或网络,仅作为参考研究使用,如有侵权请邮件联系站长!
2. 本站积分货币获取途径以及用途的解读,想在本站混的好,请务必认真阅读!
3. 本站强烈打击盗版/破解等有损他人权益和违法作为,请各位会员支持正版!
4. 编程技术 > 如何理解Oracle检查点

用户评论