前言
最近在使用DM8做数据库联机全库备份时报错,-718 归档日志不完整,现在来分析一下这个产生的原因并找到对应的解决办法
注:我使用dm8.1.2.18
达梦8 全库备份相关概念
查看达梦官方的备份与还原手册,达梦的数据库物理备份是把数据文件中的有效数据页备份下来。物理备份包含数据备份和日志备份:
- 数据备份也就是拷贝有效的数据页内容
- 日志备份是拷贝备份过程中产生的redo日志,这部分日志实际上就是达梦的归档日志文件,这也就是为什么达梦的联机备份必须要开归档的原因了吧
- 通过备份数据备份和日志备份,就可以将数据库恢复到执行备份这个时间点了
下面看一下 ckpt_lsn,file_lsn,begin_lsn,end_lsn究竟是什么意思,达梦是这样对lsn做的解释 ,也就是可以将lsn 简单的理解为数据库的操作量的标度,在这个标度上可以简单的衡量数据库的变化
LSN(Log Sequence Number)是由系统自动维护的 Bigint 类型数值,具有自动递增、全局唯一特性,每一个 LSN 值代表着 DM 系统内部产生的一个物理事务。物理事务(Physical Transaction,简称 ptx)是数据库内部一系列修改物理数据页操作的集合,与数据库管理系统中事务(Transaction)概念相对应,具有原子性、有序性、无法撤销等特性.
DM 数 据 库 中 与 LSN 相 关 的 信 息 , 可 以 通 过 查 询 v$RLOG 和 v$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 由检查点线程负责调整。
- begin_lsn、end_lsn:备份开始和结束的lsn值
- ckpt_lsn:检查点lsn,也就是物理备份有效数据页也的内容
- file_lsn:联机日志lsn,操作写入归档日志但是没有刷盘的数据
联机备份
达梦数据库的备份命令是这样的,其中有一个参数“without log”,这个参数就是指定备份过程中是否要进行日志备份,显然默认情况下都不会加这个参数,也就是默认情况下进行备份日志,那如果不做日志备份 还原的时候还要指定归档目录 想必会更加麻烦,还是老老实实备份日志吧。
那么执行联机备份过程中必然要备份日志,在file_lsn与ckpt_lsn中间的归档日志是一定保留在本地不能被刷掉的。如果被刷掉了,很抱歉要重来一次备份
达梦文档中给出提示,如果备份过程中报错归档不完成,执行生成检查点操作后就可以正常备份了
结论
那么为了避免产生这样的问题,也就是file_lsn与ckpt_lsn的差值要尽量的小,这样这些归档日志就可以保留在本地不被刷掉,就不会有-718的报错了
- 增大归档上限,避免在业务高峰期进行备份,增加file_lsn与ckpt_lsn的差值上限
- 提高备份的并行参数和线程数 加快备份速度,缩短备份时间,降低file_lsn与ckpt_lsn的差值下限
- 备份前执行生成检查点的操作,也就是将ckpt_lsn值刷到file_lsn附近,减少日志备份量
以上就是我的个人理解了,那么如果有不同理解的欢迎评论区留言。
更多资讯请上达梦技术社区了解: https://eco.dameng.com