注册
达梦检查点参数介绍
专栏/技术分享/ 文章详情 /

达梦检查点参数介绍

2022/11/19 2872 11 0
摘要

检查点的概念


为了提升数据访问的性能,达梦数据库在内存中开辟了一个系统缓冲区,修改过的数据都放在缓冲区中,并没有立即写入磁盘。为了保持事务的数据持久性,系统维护了一个REDO日志系统。每次事务提交,就把该事务对应的修改过的数据页的REDO写入磁盘,这样万一系统崩溃,只要重做REDO就能修复数据。当数据页真正写入磁盘时,相应的REDO记录就没有用了。这一技术被称为WAL技术,几乎被所有的RDBMS采用。

达梦数据库的在线REDO系统,缺省有两个物理文件,可以手工增加文件,或者扩充容量,但系统不会自己扩展。系统会循环使用日志文件,可以把日志文件想象成一个环,在这个环上有两个位置,一个是写入点HEAD,新的日志都在写入点写入,另一个是有效日志的起点TAIL,在这两点之间的空间为空闲空间,需要确保写入点的位置在空闲空间之内,或者说在写入店的REDO日志记录是可以被覆盖的。如何保证这一点呢?
这就是检查点(checkpoint)的工作。

发生检查点时,系统把系统缓冲区中的部分或者全部脏数据页写入磁盘,这样就可以释放这些脏页对应的REDO日志,从而推进有效日志的起点TAIL。在达梦数据库中,这点也被称为"检查点",这一推进动作称为"推进检查点"。所以检查点的工作就是数据页刷盘,释放日志空间以便重用。

频繁的检查点也有助于缩短系统掉电的恢复时间,因为需要重做的REDO日志比较少。如果很长时间都不作检查点,那么在线日志文件会积累大量的日志,造成掉电启动缓慢,极端情况下可能需要数十分钟甚至数小时。但是检查点过频也会影响系统的性能,毕竟IO的代价比较大。

达梦数据库提供了五个检查点相关的配置参数,分别是: CKPT_RLOG_SIZE,CKPT_DIRTY_PAGES, CKPT_INTERVAL, CKPT_FLUSH_RATE,CKPT_FLUSH_PAGES。

需要注意的是, CKPT_RLOG_SZIE, CKPT_DIRTY_PAGES,CKPT_INTERVAL这三个参数可以同时生效,符合任意一个条件都可以触发检查点。

另外,系统运行时,即使上面三个条件都还没满足,只要发现当前的REDO日志可用空间不足,就也会主动自动产生检查点,以确保数据安全。DBA也可以手工触发检查点。如果系统是以命令行方式启动,则可以在控制台上输入CKPT命令来强制产生检查点,
也可以登录系统,使用CHECKPONT函数。如:

select checkpoint(20) from dual

表示触发一个刷盘比例为20%的检查点。

配置好检查点参数,可以在系统恢复时间和性能之间取得平衡,生产环境和一些极限性能测试环境需要慎重选择相关参数,才能取得比较好的效果。

检查点的触发机制


定时触发

相关参数 CKPT_INTERVAL

后台调度线程(dm_sched_thread)会监控最后一次检查点的时刻,如果和当前时间的差异达到了特定间隔,则触发一个检查点;该间隔由参数CKPT_INTERVAL(秒)确定。CKPT_INTERVAL= 0 则不会定时触发;

比如: CKPT_INTERVAL = 300, 则每隔300秒触发一次检查点;
如果上一个定时触发的检查点已经过去了100秒,其他原因触发了一个检查点,则定时间隔会重新计算,即需要再过300秒才会触发定时检查。

日志量触发

相关参数 CKPT_RLOG_SIZE

后台调度线程定时(每隔1秒),向异步任务系统发送NTSK_CMD_FLUSH任务,
该任务处理过程首先检查当前redo
日志的占用空间,如果大于CKPT_RLOG_SIZE(单位M), 则触发检查点;

如:CKPT_RLOG_SIZE = 300时,系统发现当前的REDO日志达到或者超过300M,
则产生检查点,直到REDO日志小于300M。

如果CKPT_RLOG_SIZE= 0,则不会发生 日志量触发。

系统缓存区脏页触发

相关参数CKPT_DIRTY_PAGES

原理同日志量触发,
如果CKTP_RLOG_SIZE参数引发的检查点触发失败,则继续检查当前系统缓存区的脏页数是否大于CKPT_DIRTY_PAGES,
如果大于,则触发检查点。如果CKPT_DIRTY_PAGES = 0,则不会发生
系统缓存区脏页触发。

redo 日志空间不足触发

检查redo的剩余大小

SELECT CAST(SYSDATE AS VARCHAR(20)) CHECK_TIME,TOTAL_SPACE/1024/1024 TOTAL_SIZE_MB,FREE_SPACE/1024/1024 FREE_SIZE_MB,(TOTAL_SPACE-FREE_SPACE)/1024/1024 USED_SPACE_MB FROM V$RLOG;

在SQL执行 Purge过程中,物理事务提交时, 会向日志系统压入新生成的redo
日志,此时,
系统会检查当前可用日志空间是否安全,如果不安全,将设置标记。日志刷盘线程如果发现此标记,则主动触发检查点。

检查点自主触发

检查点执行线程在执行完一个检查点后,
在返回前,会主动检查当前日志空间是否安全,如果不安全,就再次触发一个新的检查点。

日志空间是否安全的判断

  1. used_space + safe_space (由RLOG_SAFE_SPACE确定)+
    内存中的日志量 > total_space,
    则认为时安全的,否则是不安全的。理解起来比较复杂,简单点,剩余redo可用空间小于RLOG_SAFE_SPACE(该参数最大值为1024M),则是不安全的。
  2. 不安全时, 系统进入redo预留/释放状态,
    每一个非嵌套的物理事务,执行操作前都需要预留2M的日志量,预留失败则等待
  3. 预留等待的线程,由其他线程释放预留量时唤醒,或者由检查点线程在调整时唤醒

日志空间预留机制触发

RLOG_FLUSH_THREAD 该参数若为512,表示用的REDO到达512MB,就会触发检查点。控制是否启动日志空间安全性检查。0:不启动;有效值1~16384:如果系统有效日志量达到设定的值,则启动日志空间预留机制,触发检查点,单位为MB。

检查点写入量


检查点触发后,每次刷多少日志到DATA中,由下述参数控制

CKPT_FLUSH_RATE=5
CKPT_FLUSH_PAGES=1000
CKPT_WAIT_PAGES=128

CKPT_FLUSH_RATE

检查点刷盘比例,有效值范围(0~100.00)。

检查点每次触发,刷入5%比例的redo日志,指已生成但未刷盘的redo日志的5%,而非整个redo日志空间大小。

CKPT_FLUSH_PAGES

检查点刷盘的最小页数。有效值范围(1000~100000)

CKPT_FLUSH_PAGES表示每次检查点至少写入的脏页数,即使按CKPT_FLUSH_RATE计算出来的值小于CKPT_FLUSH_PAGES,
也按CKPT_FLUSH_PAGES写。

即每次最少刷入多少页的redo日志。每次刷盘,刷5%比例,当这5%的比例不足1000页时,就刷1000页,超过1000页时,就以5%为准。

CKPT_WAIT_PAGES

指刷盘过程中,一次写入128页,串行写入,写完后,更新下系统当前的LSN,再继续写入。

评论
后发表回复

作者

文章

阅读量

获赞

扫一扫
联系客服