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

达梦数据库(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快照确保起点一致"+"重做日志追踪确保增量完整"+"页级管理实现高效复制"** 的技术组合,在不中断业务的前提下,实现了物理文件级的可靠备份,兼顾了备份效率、数据完整性和业务连续性。

相关推荐
SPC的存折20 小时前
openEuler 24.03 MariaDB Galera 集群部署指南(cz)
linux·运维·服务器·数据库·mysql
仲芒20 小时前
[24年单独笔记] MySQL 常用的 DML 命令
数据库·笔记·mysql
SPC的存折20 小时前
MySQL 8.0 分库分表
linux·运维·服务器·数据库·mysql
蓦然乍醒20 小时前
使用 DBeaver 还原 PostgreSQL 备份文件 (.bak) 技术文档
数据库·postgresql
XDHCOM20 小时前
Redis节点故障自动恢复机制详解,如何快速抢救故障节点,确保数据不丢失?
java·数据库·redis
QCzblack20 小时前
BugKu BUUCTF ——Reverse
java·前端·数据库
cyber_两只龙宝20 小时前
【Oracle】Oracle之DQL中WHERE限制条件查询
linux·运维·数据库·云原生·oracle
luis的妙妙屋20 小时前
主流数据库数据类型对比分析
数据库
XDHCOM21 小时前
ORA-00054资源忙故障修复,远程处理Oracle报错解决方案,数据库锁超时NOWAIT指定问题排查
数据库·oracle
q210306337221 小时前
初学Access(具体示例)
数据库