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

news/2024/11/29 15:57:44/

目录

1、概述

1.1 概述

1.2 环境介绍

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

2.1 实验准备

2.2 误删除“用户表空间数据文件”

2.3 误删除SYSTEM.DBF

2.4 误删除ROLL.DBF

2.5 REDO日志文件

3、无备份集的恢复方法

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

3.2误删除控制文件

3.3 误删除ROLL.DBF

3.4 误删除REDO日志文件

3.5 误删除TEMP.DBF


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 实验准备

联机备份

SQL> backup database backupset '/dm8/backup/fullbak_20241126_002' compressed level 1;

2.2 误删除“用户表空间数据文件”

1) 制造故障

表空间数据文件损坏:

rm /dm8/data/DAMENG/MAIN.DBF

2)还原方法

        数据文件误删除,如果数据库没有关闭,应该优先考虑从操作系统找回,优点是不需要关闭数据库,相关方法我们在第3章介绍。这里介绍的是用备份集还原的方法。

dmrman
RESTORE DATABASE '/dm8/data/DAMENG/dm.ini' TABLESPACE MAIN FROM BACKUPSET '/dm8/backup/fullbak_20241126_002';
RECOVER DATABASE '/dm8/data/DAMENG/dm.ini' TABLESPACE MAIN;

2.3 误删除SYSTEM.DBF

系统表空间数据文件故障,不能使用2.2节还原表空间的方法,需要全库还原。

全库还原有两种方法,方法1是重新初始化一个新库,在这个新库上做还原;方法2是将备份集还原到指定目录。

1)制造故障,删除SYSTEM.DBF

rm /dm8/data/DAMENG/SYSTEM.DBF

2)恢复SYSTEM.DBF

如果磁盘空间充足,可以考虑将数据库目录备份出来

mv /dm8/data/DAMENG /dm8/data/DAMENG_BAK

方法1:重新初始化一个新库,在这个新库上做还原

dminit path=/dm8/data/
RESTORE DATABASE '/dm8/data/DAMENG/dm.ini' FROM BACKUPSET   '/dm8/backup/fullbak_20241126_002';  
RECOVER DATABASE '/dm8/data/DAMENG/dm.ini' FROM BACKUPSET   '/dm8/backup/fullbak_20241126_002';
RECOVER DATABASE '/dm8/data/DAMENG/dm.ini'  UPDATE DB_MAGIC;

方法2:数据库还原到指定目录

RESTORE DATABASE TO '/dm8/data/DAMENG/' OVERWRITE FROM BACKUPSET   '/dm8/backup/fullbak_20241126_002';  
RECOVER DATABASE '/dm8/data/DAMENG/dm.ini' FROM BACKUPSET   '/dm8/backup/fullbak_20241126_002';
RECOVER DATABASE '/dm8/data/DAMENG/dm.ini'  UPDATE DB_MAGIC;

2.4 误删除ROLL.DBF

1)制造故障,删除ROLL.DBF

rm /dm8/data/DAMENG/ROLL.DBF

2)使用备份集还原

dmrman
RESTORE DATABASE '/dm8/data/DAMENG/dm.ini' TABLESPACE ROLL FROM BACKUPSET '/dm8/backup/fullbak_20241126_002';
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/<PID>/fd,会发现被删除的文件后有(deleted)字样;

4、 使用操作系统的 cp 命令将文件复制到原位置:cp 源路径 目的路径;

5、 复制成功后,调用系统过程 SP_TABLESPACE_RECOVER(表空间名称)完成表空间失效文件的恢复。注意,要保证数据文件正确修复,需要保证在 SP_TABLESPACE_PREPARE_RECOVER后进行数据文件的复制。

故障模拟:

一、制造故障

1、查看表空间对应的数据文件

select t.name,d.path from SYS.V$TABLESPACE tleft join SYS.V$DATAFILE d on(d.GROUP_ID=T.ID);

2、模拟误删除数据文件

rm /dm8/data/DAMENG/DMHR.DBF

二、恢复方法

1、 表空间失效文件恢复准备

SP_TABLESPACE_PREPARE_RECOVER('DMHR');

2、 查找dmserver 进程号

ps -ef|grep dmserverdmdba       1798       1  0 09:14 ?        00:00:05 /dm8/dmdbms/bin/dmserver path=/dm8/data/DAMENG/dm.ini -noconsole

3、 查看进程目录下的文件

ll /proc/1798/fd

4、 还原文件

cp -p /proc/1798/fd/17  /dm8/data/DAMENG/DMHR.DBF

5、 修复表空间文件

SP_TABLESPACE_RECOVER('DMHR');

6、验证

SELECT count(*) FROM DMHR.EMPLOYEE;

恢复成功!

3.2 误删除控制文件

控制文件恢复方法:

到ctl_bak目录,找到时间最近的备份,名称改为dm.ctl即可。

3.3 误删除ROLL.DBF

1)制造故障,删除ROLL.DBF

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 已提交事务。

vi dm.iniPSEG_RECV =0

拷贝其他数据库ROLL.DBF冒充误删除的文件

cp /dm8/data/PROD/ROLL.DBF  /dm8/data/DAMENG/  #拷贝其他库的ROLL.DBF

启动数据库

dmserver ./dm.ini

数据库启动,恢复成功!

3.4 误删除REDO日志文件

        重做日志文件损坏,推荐使用备份集恢复。

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

3.5 误删除TEMP.DBF

1)制造故障,删除TEMP.DBF

rm /dm8/data/DAMENG/TEMP.DBF

2)临时表空间数据文件误删除后不用还原,重启数据库后会重新生成TEMP.DBF文件

数据库启动后重新创建了TEMP.DBF。

本文结束!

2024.11.28


http://www.ppmy.cn/news/1550935.html

相关文章

verilog实现开方运算/基于迭代法的平方根计算算法/FPGA实现开根号算法

因老师要我们用verilog实现一个算法&#xff0c;涉及到开根号运算&#xff0c;正好学习一下算法&#xff0c;记录一下我的学习记录 主要算法&#xff1a; 要求&#xff1a; 输入信号&#xff1a;input signed [15:0] a&#xff0c; //数据a 输入信号&#xff1a;input s…

mybatis plus如何使用mybatis xml拼接sql

在 MyBatis Plus 中&#xff0c;如果你想使用 MyBatis 的 XML 文件来拼接 SQL&#xff0c;可以结合使用 MyBatis 和 MyBatis Plus 的功能。MyBatis Plus 是一个增强 MyBatis 的工具&#xff0c;它提供了很多便捷的操作&#xff0c;但有时你可能需要使用 XML 文件来定义更复杂的…

【MySQL】数据库的基本认识和使用

为什么要使用数据库呢&#xff1f;我们知道Linux是有文件系统的&#xff0c;为什么不使用文件系统呢&#xff1f; 因为OS只负责把我们交给它的数据存储起来&#xff0c;存到某个文件中&#xff0c;它并不负责管理数据的具体内容&#xff0c;也就是说&#xff0c;我们交给OS什么…

【Ubuntu 24.04】How to Install and Use NVM

参考 下载 curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.39.7/install.sh | bash激活 Activate NVM: Once the installation script completes, you need to either close and reopen the terminal or run the following command to use nvm immediately. exp…

机器学习之DeepMind推出的DreamerV3

开放域任务强化学习(Open-Ended Task Reinforcement Learning)的目标是使智能体能够在多样化且未见过的任务中表现出色,同时能够实现任务间的迁移学习。这类研究的重点在于开发通用的学习算法,能够在没有明确任务定义的情况下,从环境中学习并推广到新任务。DeepMind的Drea…

Mybatis:Mybatis快速入门

Mybatis的官方文档是真的非常好&#xff01;非常好&#xff01; 点一下我呗&#xff1a;Mybatis官方文档 MyBatis 是一款优秀的持久层框架&#xff0c;它支持自定义 SQL、存储过程以及高级映射。MyBatis 免除了几乎所有的 JDBC 代码以及设置参数和获取结果集的工作。MyBatis 可…

基于Python的飞机大战复现

✨✨ 欢迎大家来访Srlua的博文&#xff08;づ&#xffe3;3&#xffe3;&#xff09;づ╭❤&#xff5e;✨✨ &#x1f31f;&#x1f31f; 欢迎各位亲爱的读者&#xff0c;感谢你们抽出宝贵的时间来阅读我的文章。 我是Srlua小谢&#xff0c;在这里我会分享我的知识和经验。&am…

Linux入门系列--用户与权限

一、前言 1.注意&#xff1a; 【】用户是Linux系统工作中重要的一环&#xff0c;用户管理包括 用户 与 组账号 的管理 【】在Linux系统中&#xff0c;不论是由本机或是远程登录(SSH)系统&#xff0c;每个系统都必须拥有一个账号&#xff0c;并且对于不同的系统资源拥有不同的使…