LSN理解

LSN介绍

LSN(Log Sequence Number)是数据库中用于标识事务日志(重做日志)顺序的一种递增的序列号。LSN 在数据库中扮演着非常重要的角色,用于管理事务的提交和回滚、故障恢复以及数据一致性等方面。

LSN 的作用:

标识事务日志的顺序:每当一个事务进行数据修改时,相关的重做日志(Redo Log)记录会被生成,并分配一个唯一的 LSN 号。这样,数据库系统就可以通过 LSN 来确定事务日志的顺序,从而保证修改的顺序与事务的执行顺序一致。

事务的提交和回滚:数据库系统使用 LSN 来跟踪和管理事务的提交和回滚。当一个事务提交时,其对应的 LSN 会被记录在持久化存储中,以确保在故障恢复时,可以正确地重新执行已提交的事务。而在事务回滚时,数据库可以利用 LSN 来撤销事务所做的修改。

故障恢复:在数据库系统发生崩溃或异常停机时,通过 LSN 可以确定在故障发生前已经提交的事务,以及还未提交的事务。通过重做日志和 LSN,数据库可以重新执行已提交的事务,确保数据的持久性和一致性。

数据一致性:在数据库的恢复过程中,LSN 可以确保已提交事务的修改在崩溃后重新执行,从而维护数据的一致性。

总结: LSN(Log Sequence Number)是数据库中用于标识事务日志顺序的递增序列号。通过 LSN,数据库系统可以管理事务的提交和回滚,实现故障恢复,并保证数据的一致性。LSN 在数据库的可靠性和恢复方面起着重要的作用。

1. DM数据库中的LSN

DM数据库中与LSN相关的信息,可以通过查询v$rlogV$RAPPLY_PARALLEL_INFO表来获取。DM主要包括以下几种类型的LSN:

CUR_LSN 是系统已经分配的最大LSN值。物理事务提交时,系统会为其分配一个唯一的LSN值,大小等于CUR_LSN + 1,然后再修改CUR_LSN=CUR_LSN+1。

FLUSH_LSN 是已经发起日志刷盘请求,但还没有真正写入联机Redo日志文件的最大LSN值。

FILE_LSN   是已经写入联机Redo日志文件的最大LSN值。每次将Redo日志包RLOG_PKG写入联机Redo日志文件后,都要修改FILE_LSN值。

CKPT_LSN 是检查点LSN,所有LSN <= CKPT_LSN的物理事务修改的数据页,都已经从Buffer缓冲区写入磁盘,CKPT_LSN由检查点线程负责调整。

数据库故障重启时,CKPT_LSN之前的REDO日志不需要重做,只需要从CKPT_LSN+1开始重做REDO日志,就可以将系统恢复到故障前状态。并且,在联机重做日志文件中,LSN值<=CKPT_LSN的REDO日志都可以被覆盖。

APPLY_LSN 是数据库还原恢复后已经写入联机Redo日志文件的日志包的原始最大LSN值,APPLY_LSN取自源库的原始日志包中的最大LSN值。DSC集群的每一个节点独立维护APPLY_LSN。

RPKG_LSN 是数据库还原恢复后已经重演日志的最大LSN。DSC集群的每一个节点独立维护RPKG_LSN。

2. 包序号介绍

每个RLOG_PKG都有对应的序号属性,称之为包序号(PKG SEQNO),日志包生成时按照序号连续递增。包序号包括本地包序号(LSEQ)和全局包序号(GSEQ),本地包序号是节点内唯一、连续递增的值,用于校验联机日志连续性;全局包序号由数据守护集群的主备库共同维护,具有全局唯一、连续、递增的特性,用于校验归档日志的连续性。

DM数据库中与全局包序号相关的信息,可以通过查询v$rlog和V$RAPPLY_PARALLEL_INFO表来获取。数据库端主要包括以下几种类型的全局包序号:

CUR_SEQ 是系统已经分配的最大全局包序号。RLOG_PKG写入联机日志文件前,系统会为其分配一个唯一的全局包序号。

FILE_SEQ 是已经写入联机Redo日志文件的最大全局包序号。每次将Redo日志包RLOG_PKG写入联机Redo日志文件后,都要修改FILE_SEQ值。

APPLY_SEQ 是数据库还原恢复后已经写入联机Redo日志文件的原始最大全局包序号,APPLY_SEQ取自源库的原始日志包的包序号。DSC集群的每一个节点独立维护APPLY_SEQ。

RPKG_SEQ 是数据库还原恢复后已经重演日志的最大全局包序号。DSC集群的每一个节点独立维护RPKG_SEQ。

3. 检查点

DM数据库运行过程中,用户的所有操作都在内存中进行。每修改一条记录都必须先把记录所在的数据页加载到BUFFER缓冲区中,然后进行修改。事务运行时,会把生成的REDO日志保留在Redo日志包RLOG_PKG中,每条日志记录对应一个LSN,当事务提交或Redo日志包满或执行检查点时会进行日志刷盘。

检查点(checkpoint)是一个数据库事件,它的功能是按照数据页的修改顺序,依次将BUFFER缓冲区中的脏页写入磁盘,并在这个过程中动态调整CKPT_LSN值,释放日志空间。

DM的检查点分为两种:完全检查点和部分检查点:

完全检查点:会将内存缓冲区中的所有脏页写入磁盘,并调整CKPT_LSN,在数据库正常关闭时会产生一个完全检查点。

部分检查点:根据dm.ini配置文件中的参数CKPT_FLUSH_RATE和CKPT_FLUSH_PAGES,确定每次检查点刷脏页的数量。执行部分检查点的过程中,DDL/DML操作都可以正常执行,DM系统中绝大多数情况下触发的都是部分检查点。

数据库运行过程中产生的待写入日志首先写入Redo日志包RLOG_PKG,当日志刷盘时一起写入联机日志文件中。在联机日志文件中,可以覆盖写入REDO日志的文件长度为可用日志空间;不能被覆盖的REDO日志,系统故障重启需要重做的REDO日志为有效日志,有效日志的LSN取值范围是(CKPT_LSN,FILE_LSN]。

下图说明了联机日志文件、Redo日志包RLOG_PKG以及相关各LSN之间的关系。

4. 总结

cur_lsn 是当前数据库最大的lsn,即当事务提交时,会自动增加。

file_lsn是写入redolog的最大lsn。

apply_lsn是数据库还原后写入redolog日志文件日志包的最大lsn。

ckpt_lsn是检查点lsn,所有小于ckpt_lsn的日志都已经从redo buffer写入redolog。

若数据库异常宕机,在数据库利用最新备份和归档restore,recover后,当apply_scn等于崩溃前file_lsn时,代表数据库已经恢复至崩溃前状态。

在数据库启动时,要保证cur_lsn>=file_lsn才可正常启动,也表示当前的归档日志已经完全应用完成。

达梦社区地址:https://eco.dameng.com

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值