此文章我们演示linux系统中误删表空间并恢复找回数据。此方法可以在没有数据库文件没有备份的情况下,恢复误删除的数据文件。
linux系统中被删除的表空间,只要达梦数据库服务没有被关闭,可以在/proc/
– 创建表空间
create tablespace TEST_RM datafile ‘/dm8/data/DAMENG/TEST_RM01.dbf’ size 200 ;
– 创建测试表
create table wstest (id int,name varchar(100)) tablespace TEST_RM;
– 插入测试数据
insert into wstest values (1,‘test’);
– 提交执行,查看数据是否成功插入
commit; select * from wstest;
SQL> select * from wstest; 行号 ID NAME 1 1 test 已用时间: 0.291(毫秒). 执行号:21.
– 模拟数据文件被删除
[dmdba@dameng ~]$ rm /dm8/data/DAMENG/TEST_RM01.dbf [dmdba@dameng ~]$ ll /dm8/data/DAMENG/TEST_RM01.dbf ls: 无法访问/dm8/data/DAMENG/dmtbs.dbf: 没有那个文件或目录 [dmdba@dameng ~]$
– 查看TEST_RM表空间状态
SQL> select tablespace_name from dba_data_files; select tablespace_name from dba_data_files; [-2206]:无效的参数值. 已用时间: 4.373(毫秒). 执行号:0. SQL> 此时已经报[-2206]:无效的参数值.错误
– 再次查看表数据
SQL> select * from wstest; 行号 ID NAME 1 1 test 已用时间: 0.291(毫秒). 执行号:21.
– 查看数据库进程号,找到未释放的文件句柄号和被删除的数据文件(重启之后文件句柄将会消失)
[dmdba@dameng ~]$ ps -ef|grep dmserver dmdba 27663 1 0 16:49 ? 00:00:24 /dm8/bin/dmserver /dm8/data/DAMENG/dm.ini -noconsole dmdba 27664 1 0 16:49 ? 00:00:22 /dm8/bin/dmserver /dm8/data/DM2/dm.ini -noconsole dmdba 28864 28717 0 20:20 pts/2 00:00:00 grep --color=auto dmserver [dmdba@dameng ~]$ cd /proc/9861/fd [dmdba@dameng fd]$ ls -l 总用量 0 lr-x------ 1 dmdba dinstall 64 11月 18 20:03 0 -> /dev/null l-wx------ 1 dmdba dinstall 64 11月 18 20:03 1 -> /dm8/log/DmServiceDMSERVER.log lrwx------ 1 dmdba dinstall 64 11月 18 20:03 10 -> /dm8/data/DAMENG/DAMENG04.log lrwx------ 1 dmdba dinstall 64 11月 18 20:03 11 -> /dm8/data/DAMENG/DMHR.DBF lrwx------ 1 dmdba dinstall 64 11月 18 20:03 12 -> /dm8/data/DAMENG/MAIN.DBF lrwx------ 1 dmdba dinstall 64 11月 18 20:03 13 -> /dm8/data/DAMENG/ROLL.DBF lrwx------ 1 dmdba dinstall 64 11月 18 20:03 14 -> /dm8/data/DAMENG/TEST_RM01.dbf (deleted) lrwx------ 1 dmdba dinstall 64 11月 18 20:03 15 -> /dm8/data/DAMENG/TEST02.DBF lrwx------ 1 dmdba dinstall 64 11月 18 20:03 16 -> /dm8/data/DAMENG/tbs01.dbf lrwx------ 1 dmdba dinstall 64 11月 18 20:03 17 -> /dm8/data/tbs02.dbf lrwx------ 1 dmdba dinstall 64 11月 18 20:03 18 -> /dm8/data/DAMENG/TEST01.DBF lrwx------ 1 dmdba dinstall 64 11月 18 20:03 19 -> /dm8/arch/ARCHIVE_LOCAL1_20201118164931099_0.log l-wx------ 1 dmdba dinstall 64 11月 18 20:03 2 -> /dm8/log/DmServiceDMSERVER.log lr-x------ 1 dmdba dinstall 64 11月 18 20:03 20 -> pipe:[56628] l-wx------ 1 dmdba dinstall 64 11月 18 20:03 21 -> pipe:[56628] lr-x------ 1 dmdba dinstall 64 11月 18 20:03 22 -> pipe:[56629] l-wx------ 1 dmdba dinstall 64 11月 18 20:03 23 -> pipe:[56629] lr-x------ 1 dmdba dinstall 64 11月 18 20:03 24 -> pipe:[56630] l-wx------ 1 dmdba dinstall 64 11月 18 20:03 25 -> pipe:[56630] lr-x------ 1 dmdba dinstall 64 11月 18 20:03 26 -> pipe:[56631] l-wx------ 1 dmdba dinstall 64 11月 18 20:03 27 -> pipe:[56631] lr-x------ 1 dmdba dinstall 64 11月 18 20:03 28 -> pipe:[56632] l-wx------ 1 dmdba dinstall 64 11月 18 20:03 29 -> pipe:[56632] lrwx------ 1 dmdba dinstall 64 11月 18 20:03 3 -> socket:[54677] lr-x------ 1 dmdba dinstall 64 11月 18 20:03 30 -> pipe:[56633] l-wx------ 1 dmdba dinstall 64 11月 18 20:03 31 -> pipe:[56633] lr-x------ 1 dmdba dinstall 64 11月 18 20:03 32 -> pipe:[56634] l-wx------ 1 dmdba dinstall 64 11月 18 20:03 33 -> pipe:[56634] lr-x------ 1 dmdba dinstall 64 11月 18 20:03 34 -> pipe:[56635] l-wx------ 1 dmdba dinstall 64 11月 18 20:03 35 -> pipe:[56635] lr-x------ 1 dmdba dinstall 64 11月 18 20:03 36 -> pipe:[56636] l-wx------ 1 dmdba dinstall 64 11月 18 20:03 37 -> pipe:[56636] lr-x------ 1 dmdba dinstall 64 11月 18 20:03 38 -> pipe:[56637] l-wx------ 1 dmdba dinstall 64 11月 18 20:03 39 -> pipe:[56637] lrwx------ 1 dmdba dinstall 64 11月 18 20:03 4 -> socket:[54678] lr-x------ 1 dmdba dinstall 64 11月 18 20:03 40 -> pipe:[56638] l-wx------ 1 dmdba dinstall 64 11月 18 20:03 41 -> pipe:[56638] lr-x------ 1 dmdba dinstall 64 11月 18 20:03 42 -> pipe:[56639] l-wx------ 1 dmdba dinstall 64 11月 18 20:03 43 -> pipe:[56639] lr-x------ 1 dmdba dinstall 64 11月 18 20:03 44 -> pipe:[56640] l-wx------ 1 dmdba dinstall 64 11月 18 20:03 45 -> pipe:[56640] lr-x------ 1 dmdba dinstall 64 11月 18 20:03 46 -> pipe:[56641] l-wx------ 1 dmdba dinstall 64 11月 18 20:03 47 -> pipe:[56641] lr-x------ 1 dmdba dinstall 64 11月 18 20:03 48 -> pipe:[56642] l-wx------ 1 dmdba dinstall 64 11月 18 20:03 49 -> pipe:[56642] lrwx------ 1 dmdba dinstall 64 11月 18 20:03 5 -> /dm8/data/DAMENG/SYSTEM.DBF lr-x------ 1 dmdba dinstall 64 11月 18 20:03 50 -> pipe:[56643] l-wx------ 1 dmdba dinstall 64 11月 18 20:03 51 -> pipe:[56643] lrwx------ 1 dmdba dinstall 64 11月 18 20:22 53 -> /dm8/data/DAMENG/TEST_RM01.dbf (deleted) lrwx------ 1 dmdba dinstall 64 11月 18 20:03 6 -> /dm8/data/DAMENG/TEMP.DBF lrwx------ 1 dmdba dinstall 64 11月 18 20:03 7 -> /dm8/data/DAMENG/DAMENG01.log lrwx------ 1 dmdba dinstall 64 11月 18 20:03 8 -> /dm8/data/DAMENG/DAMENG02.log lrwx------ 1 dmdba dinstall 64 11月 18 20:03 9 -> /dm8/data/DAMENG/DAMENG03.log
可见TEST_RM01.dbf文件虽然已经被rm删除,但是由于达梦数据库进程还占用着该文件,所以文件只是被标记为deleted状态,说明在数据文件被删除后该表任然在内存当中(存在恢复的可能)。一旦达梦数据库关闭或者重启,就会导致数据库进程释放掉该文件句柄,TEST_RM01.dbf文件也会被彻底删除。
– 将数据文件复制回去 (需要用dmdba的用户复制文件)
[dmdba@dameng fd]$ cp 53 /dm8/data/DAMENG/TEST_RM01.dbf [dmdba@dameng fd]$ ls -l /dm8/data/DAMENG/TEST_RM01.dbf -rw-r–r-- 1 dmdba dinstall 209715200 11月 18 20:24 /dm8/data/DAMENG/TEST_RM01.dbf
– 查询数据和表空间进行数据验证
SQL> select tablespace_name from dba_data_files; 行号 TABLESPACE_NAME 1 SYSTEM 2 TEST_RM 3 MAIN 4 TEMP 5 ROLL 5 rows got 已用时间: 123.109(毫秒). 执行号:34.
至此恢复完成!!
恢复过程中需要注意的点:
1.数据库和操作系统不能重启 ;
2.复制数据文件的时候需要用dmdba用户进行复制,其他账户复制文件需要将文件用户和组权限设置为dmdba和dinstall;
友情提示:做好数据库备份!!!
达梦技术社区地址:https://eco.dameng.com



