为了提升数据访问的性能,达梦数据库在内存中开辟了一个系统缓冲区,修改过的数据都放在缓冲区中,并没有立即写入磁盘。为了保持事务的数据持久性,系统维护了一个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的剩余大小
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
日志,此时,
系统会检查当前可用日志空间是否安全,如果不安全,将设置标记。日志刷盘线程如果发现此标记,则主动触发检查点。
检查点执行线程在执行完一个检查点后,
在返回前,会主动检查当前日志空间是否安全,如果不安全,就再次触发一个新的检查点。
RLOG_FLUSH_THREAD 该参数若为512,表示用的REDO到达512MB,就会触发检查点。控制是否启动日志空间安全性检查。0:不启动;有效值1~16384:如果系统有效日志量达到设定的值,则启动日志空间预留机制,触发检查点,单位为MB。
检查点触发后,每次刷多少日志到DATA中,由下述参数控制
CKPT_FLUSH_RATE=5
CKPT_FLUSH_PAGES=1000
CKPT_WAIT_PAGES=128
检查点刷盘比例,有效值范围(0~100.00)。
检查点每次触发,刷入5%比例的redo日志,指已生成但未刷盘的redo日志的5%,而非整个redo日志空间大小。
检查点刷盘的最小页数。有效值范围(1000~100000)
CKPT_FLUSH_PAGES表示每次检查点至少写入的脏页数,即使按CKPT_FLUSH_RATE计算出来的值小于CKPT_FLUSH_PAGES,
也按CKPT_FLUSH_PAGES写。
即每次最少刷入多少页的redo日志。每次刷盘,刷5%比例,当这5%的比例不足1000页时,就刷1000页,超过1000页时,就以5%为准。
指刷盘过程中,一次写入128页,串行写入,写完后,更新下系统当前的LSN,再继续写入。
文章
阅读量
获赞