浅聊达梦数据库物理热备的概念及原理

达梦数据库(DM Database)的物理热备份,核心是在数据库不中断业务(联机) 的前提下,通过对数据库物理文件(如数据文件、控制文件、日志文件等)的增量或全量复制,实现数据备份的技术方案。其原理本质上基于**"一致性快照"+"重做日志(Redo Log)实时追踪"** 两大核心技术,同时结合达梦自研的存储引擎机制,确保备份过程中数据的完整性与业务连续性。

一、核心技术基石:达梦存储引擎的"页级管理"

要理解物理热备份,首先需要明确达梦数据库的底层存储逻辑------其数据以**"数据页(Data Page)"** 为基本单位存储(默认页大小为8KB/16KB/32KB,可配置),所有表、索引等数据最终都映射为磁盘上的物理页文件(.dbf格式)。

物理热备份的本质是对"数据页"的复制,但需解决一个关键问题:备份过程中数据库仍在写入,如何避免复制的"半脏页"(即页数据未完全写入就被备份)?

这就需要"一致性快照"技术来解决。

二、核心原理1:一致性快照(Consistent Snapshot)

达梦物理热备份的第一步,是创建一个数据库的一致性快照,确保备份的所有数据页都对应"同一时间点"的状态,避免数据不一致。其实现逻辑如下:

  1. 触发快照点 :当用户发起热备份命令(如 BACKUP DATABASE)时,数据库首先记录当前的系统全局事务号(SCN,System Change Number) ------SCN是达梦用于标记数据版本的全局唯一序号,每发生一次数据修改,SCN都会递增。
  2. 冻结"脏页刷盘"规则 :达梦的缓冲池(Buffer Pool)中会缓存近期访问的数据页,修改后的数据先存于"脏页"(未刷盘的修改页)。创建快照后,数据库会对"快照点之前的脏页"执行一次强制刷盘(确保快照点前的修改都落地到物理文件),同时对"快照点之后的新脏页"标记为"不参与当前备份"------新修改的页不会被备份,而是通过后续的重做日志补充。
  3. 生成"快照映射表":快照创建后,数据库会生成一个"快照页映射表",记录快照点时所有数据页的物理位置(磁盘地址)。后续备份进程只需根据该映射表,逐一复制对应位置的物理页,即可得到"快照点时刻的一致性数据副本"。

三、核心原理2:重做日志(Redo Log)的实时追踪与补充

一致性快照解决了"备份起点的一致性",但备份过程可能持续数分钟甚至数小时,期间数据库仍在处理业务(产生新的修改)。为了让最终的备份集包含"快照点到备份结束"的所有数据,达梦引入了重做日志实时追踪技术:

  1. 重做日志的作用:达梦数据库会将所有数据修改操作(INSERT/UPDATE/DELETE等)实时写入"重做日志文件"(.log格式,默认双日志文件循环写入),用于崩溃恢复(Crash Recovery)和备份补充。
  2. 备份期间的日志追踪 :在热备份启动后,数据库会启动一个日志追踪进程,实时监控并复制"快照点SCN之后生成的所有重做日志"(包括当前正在写入的日志文件和后续切换的日志文件)。
  3. 备份集的完整性 :最终的物理热备份集包含两部分:
    • 快照点时刻的"一致性数据页副本"(全量或增量,取决于备份类型);
    • 快照点到备份结束期间的"增量重做日志片段"。
      恢复时,只需先恢复数据页副本到快照点状态,再通过重做日志片段"重演"后续修改,即可将数据恢复到"备份结束时刻"的完整状态。

四、关键技术特性:支持"增量热备份"的底层逻辑

达梦物理热备份不仅支持全量(备份所有数据页),还支持增量(仅备份"上一次备份后修改过的数据页"),其实现依赖**"页修改标记(Page Dirty Flag)"** 技术:

  1. 每次数据库启动或完成一次全量/增量备份后,达梦会初始化一个"页修改追踪表";
  2. 当数据页被修改时,数据库会在"页修改追踪表"中标记该页的"修改状态"(如标记页的物理地址和修改时间);
  3. 执行增量热备份时,备份进程只需扫描"页修改追踪表",仅复制"标记为修改过的数据页",同时追踪对应期间的重做日志,大幅减少备份量和时间。

总结:物理热备份的技术核心链路

graph LR A[发起热备份命令] --> B[记录当前SCN,创建一致性快照] B --> C[强制刷盘快照点前的脏页] C --> D[复制快照点的一致性数据页(全量/增量)] D --> E[实时追踪并复制快照点后的重做日志] E --> F[生成包含"数据页+重做日志"的备份集]

本质上,达梦物理热备份是通过**"SCN快照确保起点一致"+"重做日志追踪确保增量完整"+"页级管理实现高效复制"** 的技术组合,在不中断业务的前提下,实现了物理文件级的可靠备份,兼顾了备份效率、数据完整性和业务连续性。

相关推荐
不知更鸟11 小时前
Django 项目是什么
数据库·sqlite
有一个好名字14 小时前
MyBatis-Plus 三种数据库操作方式详解 + 常用方法大全
数据库·mybatis
-Xie-14 小时前
Redis(八)——多线程与单线程
java·数据库·redis
G探险者14 小时前
为什么 VARCHAR(1000) 存不了 1000 个汉字? —— 详解主流数据库“字段长度”的底层差异
数据库·后端·mysql
Albert Tan16 小时前
Oracle EBS R12.2.14 清理FND_LOBS并释放磁盘空间
数据库·oracle
L.EscaRC16 小时前
图数据库Neo4j原理与运用
数据库·oracle·neo4j
知己808016 小时前
docker搭建图数据库neo4j
数据库·docker·neo4j
TDengine (老段)16 小时前
什么是 TDengine IDMP?
大数据·数据库·物联网·时序数据库·tdengine·涛思数据
谅望者16 小时前
数据分析笔记08:Python编程基础-数据类型与变量
数据库·笔记·python·数据分析·概率论
Boilermaker199216 小时前
【MySQL】备份与恢复
数据库·mysql