达梦数据库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