在linux系统当中,达梦数据库是以数据文件的方式保存在操作系统中,当你删除数据文件,只要是操作系统和数据库未重启,文件的句柄是未释放的。此时当你删除了数据文件的时候,数据库和操作系统未重启,又没有数据备份的时候,我们还有机会将数据文件进行恢复。本文提供两种数据恢复的方式。
一、数据恢复方式一——利用数据迁移工具将数据迁移到新的正常的数据库实例上
数据文件删除之后只要未做数据文件检查,数据文件中对应的表数据还是可以正常访问的,所以我们可以重新初始化一个参数一致的数据库。使用不同的端口,然后启动数据库。然后将应用停掉防止数据再写入,再使用迁移工具将数据完整迁移过来。
*如何使用迁移工具可以参考公司文档https://eco.dameng.com/docs/zh-cn/start/tool-dm-migrate.html,这里不做过多的赘述。
如果数据量不大的情况下数据迁移将很快。但是对于数据量较大,停机迁移时间无法接受的情况下,又没有数据备份的情况可以使用第二种方法。
二、数据恢复方式二——将删除的数据文件找回进行恢复
注:以下操作均在实验测试环境下进行,如果是生产环境需要谨慎操作并向达梦原厂技术支持获取技术指导。
2.1 创建测试用的表空间、数据文件、用户、表。
SQL> create tablespace TEST_RM datafile '/dbdata/dmdata/DAMENG/TEST_RM01.DBF' size 128 ;
SQL> create user TEST_RM identified by Dameng123 default tablespace TEST_RM;
SQL> grant "PUBLIC","RESOURCE","VTI" to TEST_RM;
SQL> create table TEST_RM.T1 as select * from dba_objects;
SQL> select count(*) from TEST_RM.T1;
SQL> create table TEST_RM.test(id int,name varchar(32));
SQL> insert into TEST_RM.test values(1,'HYN');
SQL> commit;
select * from TEST_RM.test;
2.2 删除对应的表空间的数据文件进行模拟
[dmdba@localhost ~]$ cd /dbdata/dmdata/DAMENG/
[dmdba@localhost DAMENG]$ mv TEST_RM01.DBF ../
如果在操作的过程中对应的数据文件持续有写入或修改操作时,恢复同样能够成功:
SQL> insert into TEST_RM.test values(2,'GH');
SQL> update TEST_RM.test set name='HYY' where id=1;
SQL> commit;
2.3 查询表空间和表空间状况
现在查询表数据和表空间状况,你会发现数据一样能查询(是由于未做数据文件校验,如果做了数据文件校验将会查询不到数据),但是查看系统视图数据文件路径已经不存在。
SQL> select count(*) from TEST_RM.T1;
SQL> select * from TEST_RM.test;
SQL> SELECT GROUP_ID,PATH,CLIENT_PATH FROM "V$DATAFILE";
SQL> select * from dba_data_files;
2.4 进行数据文件检查
SQL> call SP_FILE_SYS_CHECK();
SQL> select count(*) from TEST_RM.T1;
SQL> select * from TEST_RM.test;
上面看得到如果未做数据文件检查的话,被删除的数据文件上的表和对象是可以正常访问的,在做了数据文件校验之后将无法正常访问。
2.5 恢复数据文件
2.5.1 先执行恢复前的准备工作
SQL> call sp_tablespace_prepare_recover('TEST_RM');
2.5.2 查看数据库进程号,找到未释放的文件句柄号和被删除的数据文件(重启之后文件句柄将会消失)
[dmdba@localhost DAMENG]$ ps -ef|grep dmserver
[dmdba@localhost DAMENG]$ cd /proc/2469/fd
[dmdba@localhost fd]$ ls -lrth
2.5.3 将数据文件复制回去,(注意需要用dmdba的用户复制文件!!!!)
[dmdba@localhost fd]$ cp 46 /dbdata/dmdata/DAMENG/TEST_RM01.DBF
2.5.4 然后执行数据文件恢复过程
SQL> call sp_tablespace_recover('TEST_RM');
SQL> call SP_FILE_SYS_CHECK();
2.5.5 查询数据和表空间进行数据验证
SQL> select count(*) from TEST_RM.T1;
SQL> select * from TEST_RM.test;
SQL> SELECT GROUP_ID,PATH,CLIENT_PATH FROM "V$DATAFILE";
SQL> select tablespace_name, file_name, status from dba_data_files;
至此恢复完成,恢复完成之后立即做一个整库的备份;如果未做数据定时备份的赶紧做任务。
恢复过程中需要注意的点:1.数据库和操作系统不能重启 ;2.复制数据文件的时候需要用dmdba用户进行复制,其他账户复制文件需要将文件用户和组权限设置为dmdba和dinstall。
总结:以上方法是在数据库未开启归档也未做备份的情况下使用的办法,如果有备份的话可以直接使用备份和归档将数据完整恢复出来,同时恢复的速度和数据的完整性都有保障。所以切记生产环境务必要做备份!!!同时在遇到不熟悉的环境需要做数据软件升级或者关闭重启的时候,最好检查下数据文件的状态。
文章
阅读量
获赞