达梦数据库linux下误删数据文件恢复

达梦数据库linux下误删数据文件恢复

数据找回分为两种方式,一种是利用数据迁移工具将数据迁移到新的正常的数据库实例上,一种是将删除的数据文件找回进行恢复,前提条件:数据文件是在数据库运行时删除的,有时间限制,而且不能重启服务器和数据库服务器。

一、将误删的数据库文件删除并找回

1、创建测试用的表空间、数据文件、用户、表

创建表空间

SQL> create tablespace TEST_RM datafile 'TEST_RM01.DBF' size 128 autoextend on next 128 CACHE = NORMAL;

 

创建用户

SQL>  create user TEST_RM identified by dameng123 default tablespace TEST_RM;

 

给用户赋权

SQL>  grant "PUBLIC","RESOURCE","SOI","VTI" to TEST_RM;

 

创建表,并插入数据

SQL> create table TEST_RM.T1 as select * from v$sessions;

 

查询表空间名字,路径,状态

SQL> select tablespace_name, file_name, status from dba_data_files;

 

2、删除对应的表空间的数据文件进行模拟

rm -rf  TEST_RM01.DBF

 

查询表空间和表空间状况

SQL>select tablespace_name, file_name, status from dba_data_files;

 

再查询表数据和表空间状况,你会发现数据一样能查询(是由于未做数据文件校验,如果做了数据文件校验将会查询不到数据),但是查看系统视图数据文件路径已经不存在

查询数据正常(这个时间用DTS迁移也是可以的)

SQL> select * from TEST_RM.T1;

 

查询V$DATAFILE看到移走的表空间不存在

SQL> SELECT GROUP_ID,PATH,CLIENT_PATH FROM "V$DATAFILE";

 

进行数据文件检查

SQL> call SP_FILE_SYS_CHECK();

 

再次查询数据,提示数据已经删除

SQL> select * from TEST_RM.T1;

 

3、进行恢复

先执行恢复前的准备工作

SQL> call sp_tablespace_prepare_recover('TEST_RM');

 

将数据文件复制回去

ps -ef|grep dmser*

找到数据库服务的pid 为1288

 

ls /proc/1288/fd -l|grep delete

 

会发现被删除的文件后有(deleted)字样,文件id为11

去文件夹下也可以看到删除的文件

cd /proc/1288/fd

 

把文件复制回去

cp 11 /dmdata/dmdb/TEST_RM01.DBF

SQL> call sp_tablespace_recover('TEST_RM');

 

查询数据已经恢复

SQL> SELECT GROUP_ID,PATH,CLIENT_PATH FROM "V$DATAFILE";

 

SQL>  select tablespace_name, file_name, status from dba_data_files;

 

SQL> select * from TEST_RM.T1;

 

二、通过备份+归档找回

参考文档

https://eco.dameng.com/document/dm/zh-cn/ops/physical-backup-restore.html

 

posted @ 2023-03-13 10:18  xuchuangye  阅读(330)  评论(0编辑  收藏  举报