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

目录

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 t
	left 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 dmserver

dmdba       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.ini

PSEG_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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/925182.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

JVM:即时编译器,C2 Compiler,堆外内存排查

1&#xff0c;即时编译器 1.1&#xff0c;基本概念 常见的编译型语言如C&#xff0c;通常会把代码直接编译成CPU所能理解的机器码来运行。而Java为了实现“一次编译&#xff0c;处处运行”的特性&#xff0c;把编译的过程分成两部分&#xff0c;首先它会先由javac编译成通用的…

rocylinux9.4安装prometheus监控

一.上传软件包 具体的软件包如下&#xff0c;其中kubernetes-mixin是下载的监控kubernetes的一些监控规则、dashbaordd等。 二.Prometheus配置 1.promethes软件安装 #解压上传后的软件包 [rootlocalhost ] cd /opt [rootlocalhost opt]# tar xf prometheus-2.35.3.linux-amd…

FreeRTOS之链表源码分析

文章目录 前言一、结构体1、链表List_t2、链表项xLIST_ITEM3、头节点xMINI_LIST_ITEM4、链表示意图 二、函数分析1、初始化函数vListInitialise2、初始化链表项vListInitialiseItem3、链表尾部添加节点vListInsertEnd4、按序插入节点vListInsert5、删除节点uxListRemove 总结 前…

预测未来 | MATLAB实现Transformer时间序列预测未来

预测未来 | MATLAB实现Transformer时间序列预测未来 预测效果 基本介绍 1.Matlab实现Transformer时间序列预测未来&#xff1b; 2.运行环境Matlab2023b及以上&#xff0c;data为数据集&#xff0c;单变量时间序列预测&#xff1b; 3.递归预测未来数据&#xff0c;可以控制预…

怎么样才算得上熟悉高并发编程?

提到并发编程很多人就会头疼了&#xff1b;首先就是一些基础概念&#xff1a;并发&#xff0c;并行&#xff0c;同步&#xff0c;异步&#xff0c;临界区&#xff0c;阻塞&#xff0c;非阻塞还有各种锁全都砸你脸上&#xff0c;随之而来的就是要保证程序运行时关键数据在多线程…

最新 Blender 4.2 保姆级安装教程(附安装包)

目录 Blender介绍&#xff1a; Blender下载&#xff1a; Blender改进功能&#xff1a; Blender介绍&#xff1a; Blender是一款开源的跨平台全能三维动画制作软件&#xff0c;提供从建模、渲染、动画、特效、合成到音频处理、视频剪辑等一系列动画短片制作解决方案。它支持…

web安全之信息收集

在信息收集中,最主要是就是收集服务器的配置信息和网站的敏感信息,其中包括域名及子域名信息,目标网站系统,CMS指纹,目标网站真实IP,开放端口等。换句话说,只要是与目标网站相关的信息,我们都应该去尽量搜集。 1.1收集域名信息 知道目标的域名之后,获取域名的注册信…

网络原理(一)—— http

什么是 http http 是一个应用层协议&#xff0c;全称为“超文本传输协议”。 http 自 1991 年诞生&#xff0c;目前已经发展为最主流使用的一种应用层协议。 HTTP 往往基于传输层的 TCP 协议实现的&#xff0c;例如 http1.0&#xff0c;http1.0&#xff0c;http2.0 http3 是…

第四十二篇 EfficientNet:重新思考卷积神经网络的模型缩放

文章目录 摘要1、简介2、相关工作3、复合模型缩放3.1、 问题公式化3.2、扩展维度3.3、复合比例 4、EfficientNet架构5、实验5.1、扩展MobileNets和ResNets5.2、EfficientNet的ImageNet结果5.3、EfficientNet的迁移学习结果 6、讨论7、结论 摘要 卷积神经网络(ConvNets)通常在固…

典型组合逻辑电路设计

目录 行为级描述方式基本运算电路 一、半加器&#xff08;Half Adder&#xff09; 二、全加器&#xff08;Full Adder&#xff09; 1、逻辑门构成加法器 2、集成全加器 3、串行加法器 4、超前进位加法器 三、全减器(Full Deductor) 数值比较电路 一、一位比较器 二、…

【论文阅读】三平面相关与变体

文章目录 1. 【CVPR2023】Tri-Perspective View for Vision-Based 3D Semantic Occupancy Prediction动机可视化方法Pipeline 2. 【2023/08/31】PointOcc: Cylindrical Tri-Perspective View for Point-based 3D Semantic Occupancy Prediction动机&#xff08;针对雷达点云、与…

修改bag的frame_id的工具srv_tools

在使用数据集导航或者建图时&#xff0c;bag中的点云或者其他话题的frame_id没有和需要的对应 1.创建工作空间 2.cd xxxx/src 3.git clone https://github.com/srv/srv_tools.git cd .. catkin_make source ./devel/setup.bash rosrun bag_tools change_frame_id.py -t /要改…

hue 4.11容器化部署,已结合Hive与Hadoop

配合《Hue 部署过程中的报错处理》食用更佳 官方配置说明页面&#xff1a; https://docs.gethue.com/administrator/configuration/connectors/ 官方配置hue.ini页面 https://github.com/cloudera/hue/blob/master/desktop/conf.dist/hue.ini docker部署 注意&#xff1a; …

如何用Excel做数据可视化自动化报表?

作为一个经常需要做数据报表的人&#xff0c;我最常用的工具是Excel&#xff0c;对于我来说用Excel处理繁琐冗杂的数据并不难&#xff0c;但是我发现身边很多人用Excel做的数据报表非常的耗时&#xff0c;而且最后的成品也是难以直视&#xff0c;逻辑和配色等都非常的“灾难”。…

layui table 纵向滚动条导致单元格表头表体错位问题

我用的时layui2.6.8版本 历史项目维护&#xff0c;bug给我让我做了&#xff0c;本来利用前端手段强解决&#xff0c;后来发现很多table 找了解决办法 打开layui-v2.6.8/lay/modules/table.js 如果打开后时压缩的代码 直接搜索 e.find(".layui-table-patch") …

C语言学习笔记:流程控制和数据输入输出

流程控制和数据的输入输出 算法 著名计算机科学家沃思提出了一个公式&#xff1a; 数据结构 算法 程序 数据结构&#xff1a;对数据的描述 算法&#xff1a;对操作步骤的描述 算法定义 广义的说&#xff0c;为解决一个问题而采取的方法和有限的步骤&#xff0c;就称为“…

旋转图像(java)

题目描述&#xff1a; 给定一个 n n 的二维矩阵 matrix 表示一个图像。请你将图像顺时针旋转 90 度。 你必须在 原地 旋转图像&#xff0c;这意味着你需要直接修改输入的二维矩阵。请不要 使用另一个矩阵来旋转图像。 代码思路&#xff1a; class Solution {public void ro…

windows 应用 UI 自动化实战

UI 自动化技术架构选型 UI 自动化是软件测试过程中的重要一环&#xff0c;网络上也有很多 UI 自动化相关的知识或资料&#xff0c;具体到 windows 端的 UI 自动化&#xff0c;我们需要从以下几个方面考虑&#xff1a; 开发语言 毋庸置疑&#xff0c;在 UI 自动化测试领域&am…

【R语言管理】Pycharm配置R语言及使用Anaconda管理R语言虚拟环境

目录 使用Anaconda创建R语言虚拟环境1. 安装Anaconda2. 创建R语言虚拟环境 Pycharm配置R语言1. 安装Pycharm2. R Language for IntelliJ插件 参考 使用Anaconda创建R语言虚拟环境 1. 安装Anaconda Anaconda的安装可参见另一博客-【Python环境管理工具】Anaconda安装及使用教程…

C语言进程编程

getpid函数&#xff1a; 原型&#xff1a;pid_t getpid(void) 特性&#xff1a;返回值是PID值 用途&#xff1a;获取当前进程PID 用法例 #include<stdio.h> #include <sys/types.h> #include<unistd.h> int main() {pid_t pid;pid getpid();printf(&qu…