核心提示: 以下所有命令行操作,请务务必先切换到 dmdba
用户以获取正确的环境变量:
su - dmdba
备份与恢复的基石是归档模式。 在执行任何备份前,必须确保数据库已开启归档。
方法一:数据库运行时(在线查询)
在 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,则表示归档已开启。
注意: 开启归档需在 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;
全量热备(在线备份)
Disql
或达梦管理工具。-- 语法:BACKUP DATABASE FULL BACKUPSET '备份集绝对路径';
BACKUP DATABASE FULL BACKUPSET '/dmbackup/DB_DAMENG_FULL_20250923_220000';
小贴士: 在规范的生产环境中,此操作通常由达梦代理作业定时自动运行,无需手动执行。
停库还原与恢复(离线恢复)
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'"
完成恢复, 更新数据库魔数
dmrman CTLSTMT="RECOVER DATABASE '/dmdata/DAMENG_NEW/dm.ini' UPDATE DB_MAGIC"
场景描述: 开发人员误操作 TRUNCATE
了 ORDER_MAIN
表, 但其他表(如 CUSTOMER_INFO
)的数据在误操作后仍在正常更新。目标是只恢复 ORDER_MAIN
表, 同时保全其他表的新数据。
前提:
/dmbackup/DB_DAMENG_FULL_20250923_220000
。2025-09-24 10:30:00
。协调业务, 暂停对【受影响表】的写入
ORDER_MAIN
表的DML操作。注意:生产数据库保持在线运行!建立一个临时的“时间机器”实例
dmrman CTLSTMT="RESTORE DATABASE TO '/dmdata/DAMENG_RESTORE' FROM BACKUPSET '/dmbackup/DB_DAMENG_FULL_20250923_220000'"
dmrman CTLSTMT="RECOVER DATABASE '/dmdata/DAMENG_RESTORE/dm.ini' WITH ARCHIVEDIR '/dmarch' UNTIL TIME '2025-09-24 10:30:00'"
dmrman CTLSTMT="RECOVER DATABASE '/dmdata/DAMENG_RESTORE/dm.ini' UPDATE DB_MAGIC"
小贴士: 手册中的
/dmarch
是示例路径。可用以下命令查找您的实际归档目录,并在RECOVER
命令中替换它:
grep ARCH_DEST $(find / -name dmarch.ini 2>/dev/null)
配置并临时启动“时间机器”实例
# 此命令能兼容各种空白字符和原始端口号,非常健壮。
sed -i '/^[[:space:]]*PORT_NUM/c\PORT_NUM = 5237' /dmdata/DAMENG_RESTORE/dm.ini
dmserver /dmdata/DAMENG_RESTORE/dm.ini
进行“跨库”数据迁移
步骤 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
)
ORDER_MAIN
表的健康数据。dexp USERID=SYSDBA/'"Your_P@ssw0rd!"'@localhost:5237 FILE=/dmbackup/ORDER_MAIN.dmp TABLES=SCHEMA_NAME.ORDER_MAIN
dimp
会自动创建新表。dimp USERID=SYSDBA/'"Your_P@ssw0rd!"'@localhost:5236 FILE=/dmbackup/ORDER_MAIN.dmp
DTS
)
如果您偏好图形化界面,也可以使用达梦的DTS(数据迁移)工具来完成此步骤。
- 在DTS中,配置一个数据同步任务。
- 源端: 连接到临时恢复的数据库(
服务器IP:5237
)。- 目标端: 连接到生产数据库(
服务器IP:5236
)。- 选择需要恢复的表(如
ORDER_MAIN
)进行单向同步。DTS会自动在目标端创建新表。
注意: 运行DTS工具的客户端计算机必须能够同时访问服务器的5236和5237两个端口。
验证、清理并恢复业务
ORDER_MAIN
表, 确认数据已成功恢复。Ctrl+C
关闭临时实例。rm -rf /dmdata/DAMENG_RESTORE
rm /dmbackup/ORDER_MAIN.dmp
# 确认无误后,在 disql 中删除备份表
# DROP TABLE SCHEMA_NAME.ORDER_MAIN_BAK_...;
ORDER_MAIN
表的正常读写操作。此场景本身就是在新机器上操作, 因此天然就是安全的“还原到新目录”模式。
新机器准备
dmdba
用户。# -p 参数确保父目录存在,且如果目录已存在也不会报错,非常安全。
mkdir -p /dmbackup /dmarch /dmdata
chown -R dmdba:dinstall /dmbackup /dmarch /dmdata
拷贝备份与归档
# 示例:从 old_host 拷贝文件
scp -r dmdba@old_host:/dmbackup/DB_DAMENG_FULL_20250923_220000 /dmbackup/
scp -r dmdba@old_host:/dmarch /dmarch
执行还原恢复
dmrman CTLSTMT="RESTORE DATABASE TO '/dmdata/DAMENG' FROM BACKUPSET '/dmbackup/DB_DAMENG_FULL_20250923_220000'"
dmrman CTLSTMT="RECOVER DATABASE '/dmdata/DAMENG/dm.ini' WITH ARCHIVEDIR '/dmarch'"
dmrman CTLSTMT="RECOVER DATABASE '/dmdata/DAMENG/dm.ini' UPDATE DB_MAGIC"
小贴士: 拷贝过来的
/dmarch
目录即为归档目录,请在RECOVER
命令中确保路径正确。
注册服务并启动
执行服务注册脚本
/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
查找脚本准确路径。
启动实例
systemctl start DmServiceDMSERVER
文章
阅读量
获赞