注册
达梦第二课-DM数据库故障恢复日志学习
专栏/技术分享/ 文章详情 /

达梦第二课-DM数据库故障恢复日志学习

WXY是对称的 2025/06/06 355 0 0
摘要

名词解释

REDO LOG 重做日志
UNDO LOG 回滚日志
PWR (Page Written Record )页写入记录。
LSN (Log Sequence Number)日志序列号
MAL (Multi-threaded Architecture Link) 多进程链路架构?

故障恢复概述

数据库在运行中,可能会遇到一些意外情况,比如磁盘、内存、电源甚至是人为误操作等,在发生故障后,数据库很可能无法运行,甚至导致数据丢失,因此故障恢复是数据库系统不可缺少的部分,必须保证即使数据库发生故障,也要保证数据的完整性和一致性。
当前对数据库故障恢复的主要技术就是对日志的处理。数据库的日志有多种,主要用于数据库数据变更记录保存的有REDO日志和UNDO日志,REDO日志是重做日志,数据库的所有DDL和DML操作都会被REDO日志记录,UNDO日志则是记录变更前的数据信息。数据库系统可以通过REDO日志和UNDO日志将数据库恢复到任意时间点。

REDO日志

数据库的数据恢复中,联机REDO日志是最重要的,联机REDO日志中存储了数据库的物理变更信息,达梦数据库就是通过REDO日志来保证数据库的完整性和一致性。
达梦数据库的REDO日志用于存储被 DML或DDL操作后数据的新值,包括事务对数据文件和回滚段的修改。REDO日志每次被修改后,都会自动生成一个新的日志序列值 LSN (Log Sequence Number)。 LSN 取值范围 0~正无穷大,新建的库LSN为0,以后日志每被写入一次,LSN 值增加1。
REDO 日志里包含有一种特殊的记录,叫 PWR(Page Written Record)日志。PWR包括(ts_id, fil_id, page_no, page_lsn)信息。每个数据页刷盘时,都会生成一条对应的 PWR 日志。PWR 日志的 lsn 与上一个日志的 lsn 相同。
在以下情况下可以利用 PWR 日志:

  1. DSC故障恢复时:利用PWR日志减少加载磁盘数据页的次数;
    2.故障恢复时:利用PWR日志提升redo速度;
    3.增量备份时:利用PWR日志提升备份速度。
    日志文件由日志表空间(RLOG)管理。 DM支持增加日志文件和扩展日志文件大小 。
    例1增加大小为 80M 的日志文件 dameng_003.log
    ALTER DATABASE ADD LOGFILE ‘dameng_003.log’ size 80;

例2将日志文件 dameng_003.log 大小更改为 100M
ALTER DATABASE RESIZE LOGFILE ‘dameng_003.log’ to 100;

在MOUNT 状态下,支持对日志文件的重命名操作。
例3将日志文件 dameng_003.log 重命名为 dameng_004.log
ALTER DATABASE RENAME LOGFILE ‘dameng_003.log’ to ‘dameng_004.log’;

重做日志归档

DM数据库可以运行在归档和非归档两种模式下,在归档模式下,会产生归档日志,非归档模式下,REDO日志覆盖使用,不产生归档日志,归档日志有以下六种:

本地归档

本地归档就是将REDO日志写入到本地归档文件,本地归档在REDO写入联机日志文件后触发,由归档线程完成本地归档操作,最多可以设置8个本地归档。
REDO日志是循环覆盖使用的,而归档则不能被覆盖,每一个归档文件均会被保留,直到用户删除或者达到系统设置后自动删除。
如果在配置了归档的状态下,磁盘空间不足,则会导致数据库挂起,如果设置了多路径归档保存,那么首先会基于第一路径归档进行空间校验,空间不足则数据库挂起,其他路径空间不足是否挂起通过参数(DW_)ARCH_HANG_FLAG来进行控制。

实时归档

实时归档的执行流程为:主库在写入REDO日志到联机日志文件之前,通过MAL系统
发送REDO日志到备库,备库收到REDO日志后,不需要等待REDO日志重演完成,马上响应主库,返回确认消息。主库收到确认消息后,执行后续操作,将REDO日志写入联机日志文件;若发送REDO日志失败,或从备库返回的数据库模式不是 STANDBY ,将数据库切换为 SUSPEND 状态,阻塞所有REDO日志的写入操作。 一个主库可以配置1~8个实时备库。
根据备库重演REDO日志和响应主库时机的不同,实时归档可以分为两种模式:事务一致模式和高性能模式。实时归档默认采用高性能模式。

即时归档

即时归档在主库将REDO日志写入联机日志文件后,再通过MAL系统将REDO日志发送到备库,在默认模式下备库会在收到REDO日志并重演完成后,再响应主库。即时归档与实时归档的主要区别是发送REDO日志的时机不同 ,即时归档在主库REDO日志写入联机日志文件之后发送,实时归档在主库REDO日志写入联机日志文件之前发送。即时归档是读写分离集群的实现基础。一个主库可以配置 1~8 个即时备库。
根据备库重演REDO日志和响应主库时机的不同,即时归档也可以分为两种模式:事务一致模式和高性能模式。即时归档默认采用事务一致模式。

异步归档

异步归档由在主库、备库上配置的定时器触发,在设定的时间或者基于设置的间隔时间,启动归档REDO日志发送。设置异步归档必须要有本地归档存在,根据异步归档的KEEP LSN信息,扫描本地归档目录获取REDO日志,并通过MAL系统将REDO日志发送到异步备库,备库收到REDO日之后,将其加入日志重演任务系统,并马上相应主库,不需要等到REDO日志重演完成再相应主库。最多可以设置8个异步归档。

同步归档

主库在归档日志刷盘后,通过MAL系统将REDO日志发送到备库,备库收到REDO日志后,将其加入日志重演任务并马上相应主库,不需要等待日志重演结束后再相应主库。同步归档和异步归档的区别在于,同步归档不需要定时器,主库归档日志刷盘后立即将归档日志发送到备库。一个主库可以配置 1~8 个同步备库。

远程归档

远程归档专门用于DMDSC环境中,是将当前节点的远程归档目录配置为另外一个节点的本地归档目录,以此来共享本地归档日志文件。DMDSC 集群配置远程归档后,集群中任意实例都可以像访问本地归档一样,访问所有实例产生的归档日志。

检查点

创建数据库时,会直接创建几个固定大小的联机日志文件,初始化状态联机日志为空,后续运行中逐步被填充,为了达到循环利用日志系统空间的目的,必须在所有日志文件空间被沾满时,系统能够自动清空一部分日志,以便后续日志空间的重新使用,为了保证清理掉的数据已经被实际落入磁盘,所以引入了一个关键的数据库概念-检查点。当系统产生检查点的时候,数据库会将系统缓冲区中被修改的数据进行数据落盘,用以保证当前日志状态所记录的数据页都安全的写入磁盘,然后日志文件就可以进行覆盖重用了。
当数据库服务启动和关闭的时候,系统都会产生检查点,在运行过程中,系统会自动判断当前是否需要执行检查点;如果空闲日志空间不足的时候,系统也会自动产生检查点,另外也系统调度线程会定期产生检查点,或者通过调用系统函数checkpoint也可以产生检查点。
系统调度线程可以通过以下几个参数进行控制:
CKPT_INTERVAL = 1800 #每间隔 1800 秒,产生检查点间隔
CKPT_FLUSH_RATE = 5 #检查点的刷盘比例为5%,将系统中所有脏页的 5% 写入磁盘
CKPT_FLUS H_PAGES = 1000 #一个检查点最少写入 1000 个脏页
通过系统函数进行检查点操作的话,命令为
Select checkpoint(FLUSH_RATE) ;
FLUSH_RATE的值是integer或者double类型,指的是刷盘比例,操作这个命令时,会同时修改CKPT_FLUSH_RATE 参数。

回滚段和回滚记录

DM SERVER采用回滚段机制来处理UNDO日志。回滚段由一定数量的回滚页组成,回滚页存放的是一批回滚记录。回滚记录存放被修改数据的旧值,并有专属的格式,与物理记录格式不同。回滚段的管理同一般数据文件一样,其回滚数据页的分配、淘汰和释放也交由数据缓冲区完成。回滚文件属于回滚表空间。回滚段的数据并不会永久保留 , 事务结束后,由系统的PURGE模块释放回滚页。
REDO日志记录了所有对数据库数据进行修改的数据,当然也包括回滚段的修改数据。因此, REDO 日志同样也会保护回滚数据。当使用重做日志恢复数据库时,系统将重做回滚段中修改了的数据,并将这些修改写回到回滚段中,从而形成回滚记录。回滚记录与重做记录类似,只不过回滚记录记录被修改数据的旧值,以达到数据回滚到原来状态的目的。
另外,回滚表空间不允许修改和删除操作。

系统故障恢复

系统故障通常指的是系统崩溃,产生的原因可能是服务器硬件、操作系统或者数据库软件等原因,当发生系统故障时,整个系统停止运行,内存中的数据会丢失,此时就只有磁盘中的持久化数据是可用的了。
当发生系统故障时,系统管理员可以通过查看系统日志了解系统故障发生的原因或故障发生之前系统的运行状况。多数情况下,系统在故障发生之前会自动记录产生故障的原因,但也不全是这样,如系统掉电时,发生故障的原因可能来不及记录。总之,在处理系统故障之前,系统管理员需要完全了解系统故障发生的原因,并采取相应的措施,如更换硬件,升级操作系统或数据库软件等,如果是数据库软件因此导致的,可以联系达梦公司的技术支持工程师,以获得必要的支持。
系统故障恢复的最后一步则是重新启动 DM 服务器。此时,系统将从最近一个检查点处开始扫描联机日志,并重做日志记录的内容,这样系统即恢复到了故障发生前的某个很近的时刻,然后将系统中仍然活动的事务再依次利用回滚段进行回滚。由此可以看出,系统故障恢复可以保证事务的原子性和持久性,即系统故障发生时,仍然活动的事务可以被安全回滚,而已经提交的事务则保证其所修改数据的持久性。

介质故障恢复

介质故障主要指的是因为各种原因导致存储在磁盘上的数据被损坏,当发生介质损坏时,系统无法启动,数据也无法复原,此时要先确定故障原因,然后采取相应措施,如磁盘损坏则更换磁盘等。由于系统的数据已经全部或部分丢失,此时只能依赖以前建立的备份和系统产生的归档日志文件进行恢复。
通过数据库的备份和归档文件,可以使数据库恢复到故障前的任意一个时间点。

学习总结:

REDO与归档

DM数据库在故障恢复方面,主要通过REDO日志和UNDO日志来进行保障,REDO日志记录了所有的DDL、DML等操作,UNDO记录了被修改数据的旧值,当时数据库发生故障时,内存中的数据可能会丢失,因此只能通过磁盘上的数据加上REDO/归档来进行数据重做,达梦数据库为了高可用性,在归档方面设置了多种类型:本地归档、实时归档、即时归档、异步归档、同步归档以及远程归档。这些归档的记录全部和REDO相同,不同之处在于归档线程处理的时机和位置的不同。简单理解:
本地归档:在REDO日志记录到联机日志后,归档线程执行本地归档。需要注意空间。以联机日志为先,完成后通过归档线程执行。

实时归档:在REDO落盘到联机日志之前,通过MAL系统发送REDO日志到备库,备库收到后就向主库返回确认信息,主库收到确认信息后,再进行日志落盘。如果发送REDO日志失败,那么会根据当前备库的模式来确定主库是否挂起。
主备库实时同步,备库不可用或者没有响应前,主库REDO日志不落盘。安全性最高。

即时归档:即时归档会先将REDO写入联机日志文件,然后通过MAL系统发送到备库,默认模式下,备库接收到REDO并重演完成后,再向响应主库。
即时归档先保证主库的数据安全性,完成落盘后,在对备库进行REDO同步。

异步归档:通过定时器触发,在固定的时间点或者一定时间之后进行归档的发送。异步归档必须在有本地归档的情况下进行,在异地备库会有KEEP LSN信息,基于此信息进行归档的信息确认、发送。
异步归档基于定时器发送,对系统压力最小,数据会有一定延迟。

同步归档:主库在归档日志刷盘后,通过MAL系统将REDO日志发送到备库,备库收到后,将日志进行重演的同时,响应主库,不需要等待REDO重演完成。
同步归档相对于即时归档来说,不会等待备库重演完成就响应主库;相对于异步归档,会先将数据落盘,然后发送,但是没有时间等待间隔,有日志就发送。

远程归档:专门用于DMDSC环境,可以将当前节点的远程归档目录设置为另外一个节点的本地归档目录,以此共享本地归档日志文件。远程归档采用双向配置,两个节点都可以配置自己的远程归档到对方,所有实例通过远程归档达到访问所有归档的目的。

检查点:

数据库在运行中,会产生系统日志,为了确保系统日志的安全,所以需要定期、定量的将系统日志保存到磁盘中,然后释放掉相应的空间来维持系统运行。在产生检查点的时候,会将缓存中的当前产生的脏数据进行落盘,而记录这些脏数据改变的日志也就可以被释放重用。
服务的启动和关闭都会产生检查点,在运行中,也会基于一定条件产生检查点:比如日志空间不足时、达到一定时间时,另外还可以通过系统调度现场或者系统函数checkpoint主动生成检查点。

回滚段与回滚段记录

DM数据库用回滚段机制来处理UNDO日志,回滚段由一定数量的回滚页组成,回滚页存放的是回滚记录。回滚记录是使用专属格式记录的被修改的数据的旧值,回滚段的管理由系统自动分配管理,事务结束后,回滚段的数据会被purge模块释放。

评论
后发表回复

作者

文章

阅读量

获赞

扫一扫
联系客服