注册
达梦数据库物理备份还原速查手册(极简实操版)
专栏/技术分享/ 文章详情 /

达梦数据库物理备份还原速查手册(极简实操版)

JC 2025/10/11 582 1 0
摘要

核心提示: 以下所有命令行操作,请务务必先切换到 dmdba 用户以获取正确的环境变量:

su - dmdba

第零步:前置检查与准备 (Prerequisite)

备份与恢复的基石是归档模式。 在执行任何备份前,必须确保数据库已开启归档。

1. 确认归档状态

方法一:数据库运行时(在线查询)
在 Disql 或任何 SQL 工具中执行:

SELECT NAME, ARCHIVELOG_MODE FROM V$DATABASE; -- 如果 ARCHIVELOG_MODE 列显示 "Y",则表示归档已开启。

方法二:数据库停止时(离线检查)
查看实例的 dm.ini 配置文件:

# 示例路径:/dmdata/DAMENG/dm.ini grep ARCH_INI /dmdata/DAMENG/dm.ini -- 如果结果为 ARCH_INI = 1,则表示归档已开启。

2. (若未开启)一次性开启归档

注意: 开启归档需在 MOUNT 状态下操作, 此过程会短暂中断服务。

-- 在 Disql 或管理工具中,按顺序执行以下SQL: ALTER DATABASE MOUNT; ALTER DATABASE ARCHIVELOG; ALTER DATABASE ADD ARCHIVELOG 'DEST=/dmarch, TYPE=LOCAL, FILE_SIZE=2048, SPACE_LIMIT=204800'; ALTER DATABASE OPEN;

一、 核心步骤命令速览

  1. 全量热备(在线备份)

    • 前提: 数据库运行中, 且已开启归档。
    • 工具: Disql 或达梦管理工具。
    -- 语法:BACKUP DATABASE FULL BACKUPSET '备份集绝对路径'; BACKUP DATABASE FULL BACKUPSET '/dmbackup/DB_DAMENG_FULL_20250923_220000';

    小贴士: 在规范的生产环境中,此操作通常由达梦代理作业定时自动运行,无需手动执行。

  2. 停库还原与恢复(离线恢复)

    • 前提: 这是一个使用 dmrman 工具的离线操作。
      • 对于**【原地覆盖】恢复 (RESTORE DATABASE '/path/to/dm.ini'):目标实例【必须】处于关闭**状态,以释放对数据文件的锁定。
      • 对于**【还原到新目录】** (RESTORE DATABASE TO ...):由于操作不影响原始实例,原库可以保持运行。但为避免操作混淆和资源争用,**【推荐】**在执行恢复前也停止原始实例。
    • 工具: dmrman 命令行工具。
    # 步骤1: 使用备份集还原数据文件 # 方法A (【生产环境强烈推荐】): 还原到新的、隔离的目录 dmrman CTLSTMT="RESTORE DATABASE TO '/dmdata/DAMENG_NEW' FROM BACKUPSET '/dmbackup/DB_DAMENG_FULL_20250923_220000'" # 方法B (【极高风险操作】): 原地覆盖还原 # 警告:此命令将直接覆盖并销毁 '/dmdata/DAMENG' 目录下的现有数据文件,操作不可逆! # 适用场景与重大风险提示: # 1. 这是“整库恢复”操作, 会将数据库中【所有对象】的状态完全恢复到过去的某个时间点。 # 2. 对于仅误删【部分表】数据的场景, 请【极其谨慎】使用此方法!因为它会同时将其他未受影响的、业务数据已正常更新的表也强制恢复到备份时的旧状态, 从而导致【更大范围的有效数据丢失】。 # dmrman CTLSTMT="RESTORE DATABASE '/dmdata/DAMENG/dm.ini' FROM BACKUPSET '/dmbackup/DB_DAMENG_FULL_20250923_220000'" # 步骤2: 应用归档日志进行恢复(根据目标选择一种) # 场景A: 恢复到指定时间点 (Point-in-Time Recovery) dmrman CTLSTMT="RECOVER DATABASE '/dmdata/DAMENG_NEW/dm.ini' WITH ARCHIVEDIR '/dmarch' UNTIL TIME '2025-09-24 10:30:00'" # 场景B: 恢复到最新状态 (应用所有归档) dmrman CTLSTMT="RECOVER DATABASE '/dmdata/DAMENG_NEW/dm.ini' WITH ARCHIVEDIR '/dmarch'"
  3. 完成恢复, 更新数据库魔数

    • 目的: 使数据库能够被正常启动, 这是恢复流程的最后一步
    dmrman CTLSTMT="RECOVER DATABASE '/dmdata/DAMENG_NEW/dm.ini' UPDATE DB_MAGIC"

二、 常见场景实战

场景 1:误删部分表数据, 进行逻辑恢复

场景描述: 开发人员误操作 TRUNCATEORDER_MAIN 表, 但其他表(如 CUSTOMER_INFO)的数据在误操作后仍在正常更新。目标是只恢复 ORDER_MAIN 表, 同时保全其他表的新数据。

前提:

  • 有2025年9月23日22点的全量备份 /dmbackup/DB_DAMENG_FULL_20250923_220000
  • 归档日志完整, 可以恢复到误操作之前的任一时间点, 例如 2025-09-24 10:30:00
  1. 协调业务, 暂停对【受影响表】的写入

    • 与应用团队沟通, 暂停所有对 ORDER_MAIN 表的DML操作。注意:生产数据库保持在线运行!
  2. 建立一个临时的“时间机器”实例

    • 说明:我们将在同一台服务器上, 将备份恢复到一个新的、隔离的目录, 创建一个包含旧数据的临时数据库。
    1. 还原数据库到新目录
      dmrman CTLSTMT="RESTORE DATABASE TO '/dmdata/DAMENG_RESTORE' FROM BACKUPSET '/dmbackup/DB_DAMENG_FULL_20250923_220000'"
    2. 恢复到指定时间点
      dmrman CTLSTMT="RECOVER DATABASE '/dmdata/DAMENG_RESTORE/dm.ini' WITH ARCHIVEDIR '/dmarch' UNTIL TIME '2025-09-24 10:30:00'"
    3. 更新魔数
      dmrman CTLSTMT="RECOVER DATABASE '/dmdata/DAMENG_RESTORE/dm.ini' UPDATE DB_MAGIC"

    小贴士: 手册中的 /dmarch 是示例路径。可用以下命令查找您的实际归档目录,并在RECOVER命令中替换它:
    grep ARCH_DEST $(find / -name dmarch.ini 2>/dev/null)

  3. 配置并临时启动“时间机器”实例

    • 说明:为避免与正在运行的生产库(端口5236)冲突, 我们必须先修改临时实例的配置文件, 将其端口号改为一个未被占用的端口(如5237), 然后再以前台方式启动。
    1. 修改临时实例端口号
      # 此命令能兼容各种空白字符和原始端口号,非常健壮。 sed -i '/^[[:space:]]*PORT_NUM/c\PORT_NUM = 5237' /dmdata/DAMENG_RESTORE/dm.ini
    2. 前台启动临时实例
      dmserver /dmdata/DAMENG_RESTORE/dm.ini
    • 此命令会占用当前终端, 请打开一个新的SSH窗口进行后续操作。
  4. 进行“跨库”数据迁移

    步骤 4.1:【安全第一】准备生产库:重命名目标表

    • 在执行任何数据导入前,先将生产库中被误操作的表重命名。这相当于创建了一个即时、零成本的“快照”,如果后续导入出现任何问题,只需将表名改回即可实现秒级回退。
    # 注意:为处理密码中的特殊字符,密码部分使用 '"..."' 格式包裹。 disql SYSDBA/'"Your_P@ssw0rd!"'@localhost:5236 <<EOF ALTER TABLE SCHEMA_NAME.ORDER_MAIN RENAME TO ORDER_MAIN_BAK_$(date +%Y%m%d_%H%M); exit; EOF

    步骤 4.2:迁移数据(选择以下一种方法执行)

    • 方法一:使用命令行工具(dexp/dimp
      1. 从临时库(5237)导出 ORDER_MAIN 表的健康数据。
        dexp USERID=SYSDBA/'"Your_P@ssw0rd!"'@localhost:5237 FILE=/dmbackup/ORDER_MAIN.dmp TABLES=SCHEMA_NAME.ORDER_MAIN
      2. 将健康数据导入到生产库(5236)。因为原表已重命名,dimp 会自动创建新表。
        dimp USERID=SYSDBA/'"Your_P@ssw0rd!"'@localhost:5236 FILE=/dmbackup/ORDER_MAIN.dmp
    • 方法二:使用可视化工具(DTS

      如果您偏好图形化界面,也可以使用达梦的DTS(数据迁移)工具来完成此步骤。

      1. 在DTS中,配置一个数据同步任务。
      2. 源端: 连接到临时恢复的数据库(服务器IP:5237)。
      3. 目标端: 连接到生产数据库(服务器IP:5236)。
      4. 选择需要恢复的表(如 ORDER_MAIN)进行单向同步。DTS会自动在目标端创建新表。
        注意: 运行DTS工具的客户端计算机必须能够同时访问服务器的5236和5237两个端口。
  5. 验证、清理并恢复业务

    1. 验证数据:在生产数据库中查询 ORDER_MAIN 表, 确认数据已成功恢复。
    2. 清理环境
      1. 返回第3步中前台启动的终端, 按 Ctrl+C 关闭临时实例。
      2. 删除不再需要的临时文件、目录和备份表。
      rm -rf /dmdata/DAMENG_RESTORE rm /dmbackup/ORDER_MAIN.dmp # 确认无误后,在 disql 中删除备份表 # DROP TABLE SCHEMA_NAME.ORDER_MAIN_BAK_...;
    3. 恢复业务:通知应用团队, 可以恢复对 ORDER_MAIN 表的正常读写操作。

场景 2:异机恢复(原服务器灾难性损坏)

此场景本身就是在新机器上操作, 因此天然就是安全的“还原到新目录”模式。

  1. 新机器准备

    1. 安装同版本的达梦数据库软件, 无需初始化实例
    2. 创建 dmdba 用户。
    3. 创建目录
      # -p 参数确保父目录存在,且如果目录已存在也不会报错,非常安全。 mkdir -p /dmbackup /dmarch /dmdata
    4. 授权目录
      chown -R dmdba:dinstall /dmbackup /dmarch /dmdata
  2. 拷贝备份与归档

    • 将原服务器的备份集和所有归档日志, 通过网络或介质拷贝到新服务器的对应目录下。
    # 示例:从 old_host 拷贝文件 scp -r dmdba@old_host:/dmbackup/DB_DAMENG_FULL_20250923_220000 /dmbackup/ scp -r dmdba@old_host:/dmarch /dmarch
  3. 执行还原恢复

    1. 还原数据库
      dmrman CTLSTMT="RESTORE DATABASE TO '/dmdata/DAMENG' FROM BACKUPSET '/dmbackup/DB_DAMENG_FULL_20250923_220000'"
    2. 恢复到最新状态
      dmrman CTLSTMT="RECOVER DATABASE '/dmdata/DAMENG/dm.ini' WITH ARCHIVEDIR '/dmarch'"
    3. 更新魔数
      dmrman CTLSTMT="RECOVER DATABASE '/dmdata/DAMENG/dm.ini' UPDATE DB_MAGIC"

    小贴士: 拷贝过来的 /dmarch 目录即为归档目录,请在RECOVER命令中确保路径正确。

  4. 注册服务并启动

    1. 执行服务注册脚本

      /opt/dmdbms/script/root/dm_service_installer.sh -t dmserver -p DMSERVER -dm_ini /dmdata/DAMENG/dm.ini

      小贴士: 可用 find / -name dm_service_installer.sh 2>/dev/null 查找脚本准确路径。

    2. 启动实例

      systemctl start DmServiceDMSERVER
评论
后发表回复

作者

文章

阅读量

获赞

扫一扫
联系客服