注册
达梦如何恢复误删数据
培训园地/ 文章详情 /

达梦如何恢复误删数据

up 2025/07/14 245 1 0

1.linux服务器上误删数据如何恢复

在我们日常运维工作时,有可能误操作将数据库的数据文件(实例目录下的dbf文件)误删,对于此类数据误删,操作系统在没有重启的情况下(千万不要一出问题就重启操作系统),linux可以通过以下方法恢复数据库的文件。

1.1创建用户表空间及测试数据

SQL> create tablespace "TEST" datafile '/dmdata/DAMENG/test.dbf' size 128 autoextend on maxsize 67108863 CACHE = NORMAL;
操作已执行
已用时间: 25.811(毫秒). 执行号:701.
SQL> create user test identified by "Test@dameng123" default tablespace "TEST";
操作已执行
已用时间: 24.359(毫秒). 执行号:702.
SQL> create table test.test(id int);
操作已执行
已用时间: 30.445(毫秒). 执行号:703.
SQL> insert into test.test(id) values(1);
影响行数 1

已用时间: 4.262(毫秒). 执行号:704.
SQL> commit;
操作已执行
已用时间: 3.881(毫秒). 执行号:705.
SQL> select * from test.test;

行号     id
---------- -----------
1          1

已用时间: 4.033(毫秒). 执行号:706.

1.2删除test.dbf数据文件

[root@localhost DAMENG]# ll test.dbf
-rw-r--r-- 1 dmdba dinstall 134217728 7月   2 09:44 test.dbf
[root@localhost DAMENG]# rm -rf test.dbf

执行完数据文件校验后再查询表test,会报错,此时注意数据库服务及操作系统不能重启。

SQL> call sp_file_sys_check();
DMSQL 过程已成功完成
已用时间: 5.566(毫秒). 执行号:707.
SQL> select * from test.test;
select * from test.test;
[-3469]:表空间文件已被删除或已损坏.
已用时间: 0.131(毫秒). 执行号:0.

1.3通过操作系统临时存放文件下恢复数据文件

[root@localhost DAMENG]# ps -ef |grep dms
dmdba      1287      1  0 09:28 ?        00:00:02 /home/dmdba/dmdbms/bin/dmserver path=/dmdata/DAMENG/dm.ini -noconsole mount
root       3270   3103  0 09:52 pts/1    00:00:00 grep --color=auto dms
[root@localhost DAMENG]# ll /proc/1287/fd
总用量 0
lr-x------ 1 dmdba dinstall 64 7月   2 09:28 0 -> /dev/null
l-wx------ 1 dmdba dinstall 64 7月   2 09:28 1 -> /dev/null
lr-x------ 1 dmdba dinstall 64 7月   2 09:28 10 -> pipe:[31865]
l-wx------ 1 dmdba dinstall 64 7月   2 09:28 11 -> pipe:[31865]
lr-x------ 1 dmdba dinstall 64 7月   2 09:28 12 -> pipe:[31866]
l-wx------ 1 dmdba dinstall 64 7月   2 09:28 13 -> pipe:[31866]
lr-x------ 1 dmdba dinstall 64 7月   2 09:28 14 -> pipe:[31867]
l-wx------ 1 dmdba dinstall 64 7月   2 09:28 15 -> pipe:[31867]
lrwx------ 1 dmdba dinstall 64 7月   2 09:28 16 -> socket:[51252]
lrwx------ 1 dmdba dinstall 64 7月   2 09:30 17 -> /dmdata/DAMENG/ROLL.DBF
lrwx------ 1 dmdba dinstall 64 7月   2 09:35 18 -> /dmdata/DAMENG/MAIN.DBF
lrwx------ 1 dmdba dinstall 64 7月   2 09:35 19 -> /dmdata/DAMENG/BENCHMARKSQL1.dbf
l-wx------ 1 dmdba dinstall 64 7月   2 09:28 2 -> /home/dmdba/dmdbms/log/DmServiceGRP1_RT_01_err.log
lrwx------ 1 dmdba dinstall 64 7月   2 09:35 20 -> /dmdata/DAMENG/dem.dbf
lrwx------ 1 dmdba dinstall 64 7月   2 09:35 21 -> /dmdata/DAMENG/test.dbf (deleted)
lrwx------ 1 dmdba dinstall 64 7月   2 09:28 3 -> socket:[30136]
lrwx------ 1 dmdba dinstall 64 7月   2 09:28 4 -> /dmdata/DAMENG/SYSTEM.DBF
lrwx------ 1 dmdba dinstall 64 7月   2 09:28 5 -> /dmdata/DAMENG/TEMP.DBF
lrwx------ 1 dmdba dinstall 64 7月   2 09:28 6 -> /dmdata/DAMENG/DAMENG01.log
lrwx------ 1 dmdba dinstall 64 7月   2 09:28 7 -> /dmdata/DAMENG/DAMENG02.log
lr-x------ 1 dmdba dinstall 64 7月   2 09:28 8 -> pipe:[31864]
l-wx------ 1 dmdba dinstall 64 7月   2 09:28 9 -> pipe:[31864]

将刚刚删除的文件对应的文件号即21号文件,拷贝至实例目录之下

cp /proc/1287/fd/21 /dmdata/DAMENG/test.dbf
chown  -R dmdba:dinstall test.dbf

1.4调用系统过程进行数据文件恢复

SQL>  call sp_tablespace_prepare_recover('TEST');
DMSQL 过程已成功完成
已用时间: 2.899(毫秒). 执行号:805.
SQL> call sp_tablespace_recover('TEST');
DMSQL 过程已成功完成
已用时间: 0.156(毫秒). 执行号:806.
SQL>  select * from test.test;

行号     id
---------- -----------
1          1

已用时间: 0.205(毫秒). 执行号:807.

2.数据库上误删数据如何恢复

除了上述误删数据文件的情况,我们还有可能在数据库操作时误删除表之类的逻辑对象,此时我们可以通过备份文件恢复+还原归档日志的方式恢复到指定时间点,前提是数据库是做了备份以及归档操作。

2.1归档开启

SQL> alter database mount;
操作已执行
已用时间: 5.289(毫秒). 执行号:0.
SQL> alter database add archivelog 'dest=/dmdata/dmarch ,TYPE=local,FILE_SIZE=1024,SPACE_LIMIT=10240';
操作已执行
已用时间: 6.668(毫秒). 执行号:0.
SQL> alter database archivelog;
操作已执行
已用时间: 2.589(毫秒). 执行号:0.
SQL> alter database open;
操作已执行
已用时间: 9.968(毫秒). 执行号:0.
SQL> select name,arch_mode from v$database;

行号     name   arch_mode
---------- ------ ---------
1          DAMENG Y

已用时间: 2.872(毫秒). 执行号:809.

2.2手动做全库备份

SQL> backup database backupset '/dmdata/bakfull';
操作已执行
已用时间: 00:00:24.459. 执行号:810.

2.3插入数据并记录时间点

SQL> insert into test.test values(2);commit;
DMSQL 过程已成功完成
已用时间: 4.022(毫秒). 执行号:811.
SQL>
SQL> select now();

行号     now()
---------- --------------------------
1          2025-07-02 10:28:59.549681

已用时间: 2.996(毫秒). 执行号:812.

2.4删除数据并记录时间点

SQL> delete from test.test where id=2;commit;
DMSQL 过程已成功完成
已用时间: 11.852(毫秒). 执行号:813.
SQL> select now();

行号     now()
---------- --------------------------
1          2025-07-02 10:30:05.321309

已用时间: 0.201(毫秒). 执行号:814.

2.5恢复数据

注意:联机恢复仅支持表级的恢复,全库恢复必须脱机还原,如果是生产环境的恢复,需要初始化一个新实例做为测试环境,将数据恢复到测试环境中(相关备份文件及归档文件拷贝至测试机做还原恢复),再找到删除的数据导入进生产当中。

2.5.1关闭数据库

[dmdba@localhost bin]$ ./DmServiceGRP1_RT_01 stop
Stopping DmServiceGRP1_RT_01:                              [ OK ]

2.5.2使用备份文件还原

[dmdba@localhost bin]$ ./dmrman
dmrman V8
RMAN> RESTORE DATABASE '/dmdata/DAMENG/dm.ini' FROM BACKUPSET '/dmdata/bakfull';
RESTORE DATABASE '/dmdata/DAMENG/dm.ini' FROM BACKUPSET '/dmdata/bakfull';
file dm.key not found, use default license!
[Percent:100.00%][Speed:0.00M/s][Cost:00:00:11][Remaining:00:00:00]
restore successfully.
time used: 00:00:11.684 

2.5.3利用归档恢复到删除数据前的状态

RMAN> RECOVER DATABASE '/dmdata/DAMENG/dm.ini' WITH ARCHIVEDIR'/dmdata/dmarch' UNTIL TIME'2025-07-02 10:29:00';
RECOVER DATABASE '/dmdata/DAMENG/dm.ini' WITH ARCHIVEDIR '/dmdata/dmarch' UNTIL TIME '2025-07-02 10:29:00';
[Percent:100.00%][Speed:0.00PKG/s][Cost:00:00:00][Remaining:00:00:00]
recover successfully!
time used: 00:00:01.220

2.5.4恢复db_magic

RMAN> RECOVER DATABASE '/dmdata/DAMENG/dm.ini' UPDATE DB_MAGIC;
RECOVER DATABASE '/dmdata/DAMENG/dm.ini' UPDATE DB_MAGIC;
recover successfully!
time used: 00:00:01.222

2.6启动数据库校验数据

SQL> select * from test.test;

行号     id
---------- -----------
1          1
2          2

已用时间: 3.670(毫秒). 执行号:1.

评论
后发表回复

作者

文章

阅读量

获赞

扫一扫
联系客服