• 设为首页
  • 收藏本站
  • 积分充值
  • VIP赞助
  • 手机版
  • 微博
  • 微信
    微信公众号 添加方式:
    1:搜索微信号(888888
    2:扫描左侧二维码
  • 快捷导航
    福建二哥 门户 查看主题

    达梦数据库文件故障的恢复方法

    发布者: 404号房间 | 发布时间: 2025-6-20 09:04| 查看数: 114| 评论数: 0|帖子模式

    1、概述


    1.1 概述

    本文介绍了达梦数据库文件损坏或误删除后的恢复方法。这里的数据库文件包括,表空间数据文件、重做日志文件、UNDO文件、TEMP文件、控制文件等。介绍了两种恢复场景,第一种场景是使用备份集恢复,第二种场景是在没有备份集的情况下尝试恢复。

    1.2 环境介绍

    数据库版本:DM Database 64 V8 03134284094-20231108-207962-20067
    操作系统版本:Linux version 4.19.90-24.4.v2101.ky10.x86_64

    2、使用备份集的恢复方法

    本章模拟了几种故障场景及还原、恢复方法,不介绍备份还原理论,学习备份还原理论知识可以参考官方文档《DM8备份与还原》。

    2.1 实验准备

    联机备份
    1. SQL> backup database backupset '/dm8/backup/fullbak_20241126_002' compressed level 1;
    复制代码
    2.2 误删除“用户表空间数据文件”

    1) 制造故障
    表空间数据文件损坏:
    1. rm /dm8/data/DAMENG/MAIN.DBF
    复制代码
    2)还原方法
    数据文件误删除,如果数据库没有关闭,应该优先考虑从操作系统找回,优点是不需要关闭数据库,相关方法我们在第3章介绍。这里介绍的是用备份集还原的方法。
    1. dmrman
    2. RESTORE DATABASE '/dm8/data/DAMENG/dm.ini' TABLESPACE MAIN FROM BACKUPSET '/dm8/backup/fullbak_20241126_002';
    3. RECOVER DATABASE '/dm8/data/DAMENG/dm.ini' TABLESPACE MAIN;
    复制代码
    2.3 误删除SYSTEM.DBF

    系统表空间数据文件故障,不能使用2.2节还原表空间的方法,需要全库还原。
    全库还原有两种方法,方法1是重新初始化一个新库,在这个新库上做还原;方法2是将备份集还原到指定目录。
    1)制造故障,删除SYSTEM.DBF
    1. rm /dm8/data/DAMENG/SYSTEM.DBF
    复制代码
    2)恢复SYSTEM.DBF
    如果磁盘空间充足,可以考虑将数据库目录备份出来
    1. mv /dm8/data/DAMENG /dm8/data/DAMENG_BAK
    复制代码
    方法1:重新初始化一个新库,在这个新库上做还原
    1. dminit path=/dm8/data/
    2. RESTORE DATABASE '/dm8/data/DAMENG/dm.ini' FROM BACKUPSET   '/dm8/backup/fullbak_20241126_002';  
    3. RECOVER DATABASE '/dm8/data/DAMENG/dm.ini' FROM BACKUPSET   '/dm8/backup/fullbak_20241126_002';
    4. RECOVER DATABASE '/dm8/data/DAMENG/dm.ini'  UPDATE DB_MAGIC;
    复制代码
    方法2:数据库还原到指定目录
    1. RESTORE DATABASE TO '/dm8/data/DAMENG/' OVERWRITE FROM BACKUPSET   '/dm8/backup/fullbak_20241126_002';  
    2. RECOVER DATABASE '/dm8/data/DAMENG/dm.ini' FROM BACKUPSET   '/dm8/backup/fullbak_20241126_002';
    3. RECOVER DATABASE '/dm8/data/DAMENG/dm.ini'  UPDATE DB_MAGIC;
    复制代码
    2.4 误删除ROLL.DBF

    1)制造故障,删除ROLL.DBF
    1. rm /dm8/data/DAMENG/ROLL.DBF
    复制代码
    2)使用备份集还原
    1. dmrman
    2. RESTORE DATABASE '/dm8/data/DAMENG/dm.ini' TABLESPACE ROLL FROM BACKUPSET '/dm8/backup/fullbak_20241126_002';
    3. RECOVER DATABASE '/dm8/data/DAMENG/dm.ini' TABLESPACE ROLL;
    复制代码
    2.5 误删除REDO日志文件

    REDO文件损坏,需要使用备份集全库还原,可以参考2.3节SYSTEM.DBF恢复方法。

    3、无备份集的恢复方法


    3.1 误删除“表空间数据文件”

    LINUX 系统中被删除的文件,只要其句柄没有被关闭,可以在/proc/<pid>/fd 中找到其对应的文件副本。其中<pid>指打开该文件的进程 id。
    利用该方法,结合 OS 命令,DM 提供失效文件的恢复方案如下:
    1、 调用系统过程 SP_TABLESPACE_PREPARE_RECOVER(表空间名称)准备进行恢复;
    2、 如果使用过程中 DM 报错表空间数据文件被删除,通过操作系统的 ps 命令找到当前 dmserver 的 PID:ps -ef|grep dmserver;
    3、 使用操作系统 ll 命令查看被删除文件对应的副本:ll /proc/<ID>/fd,会发现被删除的文件后有(deleted)字样;
    4、 使用操作系统的 cp 命令将文件复制到原位置:cp 源路径 目的路径;
    5、 复制成功后,调用系统过程 SP_TABLESPACE_RECOVER(表空间名称)完成表空间失效文件的恢复。注意,要保证数据文件正确修复,需要保证在 SP_TABLESPACE_PREPARE_RECOVER后进行数据文件的复制。
    故障模拟:
    一、制造故障
    1、查看表空间对应的数据文件
    1. select t.name,d.path from SYS.V$TABLESPACE t
    2.         left join SYS.V$DATAFILE d on(d.GROUP_ID=T.ID);
    复制代码

    2、模拟误删除数据文件
    1. rm /dm8/data/DAMENG/DMHR.DBF
    复制代码
    二、恢复方法
    1、 表空间失效文件恢复准备
    1. SP_TABLESPACE_PREPARE_RECOVER('DMHR');
    复制代码
    2、 查找dmserver 进程号
    1. ps -ef|grep dmserver

    2. dmdba       1798       1  0 09:14 ?        00:00:05 /dm8/dmdbms/bin/dmserver path=/dm8/data/DAMENG/dm.ini -noconsole
    复制代码
    3、 查看进程目录下的文件
    1. ll /proc/1798/fd
    复制代码

    4、 还原文件
    1. cp -p /proc/1798/fd/17 /dm8/data/DAMENG/DMHR.DBF
    复制代码
    5、 修复表空间文件
    1. SP_TABLESPACE_RECOVER('DMHR');
    复制代码
    6、验证
    1. SELECT count(*) FROM DMHR.EMPLOYEE;
    复制代码


    恢复成功!

    3.2 误删除控制文件

    控制文件恢复方法:
    到ctl_bak目录,找到时间最近的备份,名称改为dm.ctl即可。

    3.3 误删除ROLL.DBF

    1)制造故障,删除ROLL.DBF
    1. rm /dm8/data/DAMENG/ROLL.DBF
    复制代码
    2)使用其他数据库的ROLL文件冒充误删除的文件
    使用其他数据库的ROLL文件冒充误删除的文件。
    修改 dm.ini 参数 PSEG_RECV 为 0,可以选择跳过 ROLL.DBF 启动数据库临时启动数据库(危险操作,可能破坏事务的原子性)。
    PSEG_RECV 参数释意: 系统故障重启时,对活动事务和已提交事务的处理方式。 0:跳过回滚活动事务和 PURGE 已经提交事务的步骤。 1:回滚活动事务并 PURGE 已经提交事务; 2:延迟 PURGE 已提交事务,延迟回滚活动事务; 3:回滚活动事务,延迟 PURGE 已提交事务。
    1. vi dm.ini

    2. PSEG_RECV =0
    复制代码
    拷贝其他数据库ROLL.DBF冒充误删除的文件
    1. cp /dm8/data/PROD/ROLL.DBF /dm8/data/DAMENG/ #拷贝其他库的ROLL.DBF
    复制代码
    启动数据库
    1. dmserver ./dm.ini
    复制代码

    数据库启动,恢复成功!

    3.4 误删除REDO日志文件

    重做日志文件损坏,推荐使用备份集恢复。
    在没有备份的情况下,可以尝试使用没损坏的redo文件或使用新建相同配置数据库的redo文件冒充损坏的redo文件。通常要用dmmdf工具修改db_magic、pemnt_magic。不过这么做是有问题的,首先如果成功了,存在数据不一致的风险;其次,不一定能成功,至少在本文涉及的版本上,博主没有恢复成功。

    3.5 误删除TEMP.DBF

    1)制造故障,删除TEMP.DBF
    1. rm /dm8/data/DAMENG/TEMP.DBF
    复制代码
    2)临时表空间数据文件误删除后不用还原,重启数据库后会重新生成TEMP.DBF文件


    数据库启动后重新创建了TEMP.DBF。
    以上就是达梦数据库文件故障的恢复方法的详细内容,更多关于达梦数据库文件故障的资料请关注脚本之家其它相关文章!

    来源:https://www.jb51.net/database/331813ae4.htm
    免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!

    本帖子中包含更多资源

    您需要 登录 才可以下载或查看,没有账号?立即注册

    ×

    最新评论

    浏览过的版块

    QQ Archiver 手机版 小黑屋 福建二哥 ( 闽ICP备2022004717号|闽公网安备35052402000345号 )

    Powered by Discuz! X3.5 © 2001-2023

    快速回复 返回顶部 返回列表