签到成功

知道了

CNDBA社区CNDBA社区

DM7 达梦数据库 误删数据文件 恢复方法

2019-08-27 09:59 2240 0 原创 DM 达梦
作者: Dave

在之前的博客里我们看了DM7 表空间的管理,如下:

https://www.cndba.cn/cndba/dave/article/3570

DM7 达梦数据库 表空间 管理 说明
https://www.cndba.cn/dave/article/3569

本篇我们继续看DM 数据库中与数据文件有关的两个重要特性。https://www.cndba.cn/cndba/dave/article/3570

https://www.cndba.cn/cndba/dave/article/3570

1 理论说明

在DM 达梦数据库中,有2个与表空间中数据文件恢复有关的特性:https://www.cndba.cn/cndba/dave/article/3570https://www.cndba.cn/cndba/dave/article/3570https://www.cndba.cn/cndba/dave/article/3570

1)表空间文件失效检查

LINUX 操作系统中,被进程打开的文件仍可以在 OS 系统中被删除。如果数据文件被删除,DM7 系统能够及时检测出来,并立刻停止对其继续使用并通知用户。
在 dm.ini 中参数 FIL_CHECK_INTERVAL 的值指定 DM7 系统检查数据文件是否仍存在的时间间隔。将其设为 0 表示不进行检查。
也可以通过系统过程 SP_FILE_SYS_CHECK()来手动的进行检查。
系统一旦检测出某个表空间内的数据文件被删除,则与该表空间所有的操作都将会失败,并报错该表空间内有数据文件被删除。

2)表空间失效文件恢复

LINUX 系统中被删除的文件,在操作系统没有重启的情况下,文件的句柄都没有关闭,可以在/proc/ /fd 中找到其对应的文件副本。其中 指打开该文件的进程 id。

https://www.cndba.cn/cndba/dave/article/3570
https://www.cndba.cn/cndba/dave/article/3570

利用该方法,结合 OS 命令,在DM7 中可以通过以下方法恢复被删除的数据文件:https://www.cndba.cn/cndba/dave/article/3570

1、 调用系统过程 SP_TABLESPACE_PREPARE_RECOVER(tablespace_name)准备进行恢复;
2、 如果使用过程中 DM 报错表空间数据文件被删除,通过操作系统的 ps 命令找到当前dmserver 的 PID:ps –ef|grep dmserver;
3、 使用操作系统 ls 命令查看被删除文件对应的副本:ls /proc/ /fd -l,会发现被删除的文件后有(deleted)字样; 4、 使用操作系统的 cp 命令将文件复制到原位置cpbak_fildata_file_path_dir;
5、 复制成功后,调用系统过程 SP_TABLESPACE_RECOVER(ts_name)完成表空间失效文件的恢复。

https://www.cndba.cn/cndba/dave/article/3570

注意,要保证数据文件正确修复,需要保证在 SP_TABLESPACE_PREPARE_RECOVER后进行数据文件的复制。

2 操作示例

2.1 准备测试环境

SQL> create tablespace dave datafile '/dm/dmdbms/data/cndba/DAVE01.DBF' size 32, '/dm/dmdbms/data/cndba/DAVE02.DBF' size 32;
操作已执行
已用时间: 54.834(毫秒). 执行号:2177.
SQL> select tablespace_name, file_name, status from dba_data_files order by 1;

行号     TABLESPACE_NAME FILE_NAME                          STATUS   
---------- --------------- ---------------------------------- ---------
1          BOOKSHOP        /dm/dmdbms/data/cndba/BOOKSHOP.DBF AVAILABLE
2          DAVE            /dm/dmdbms/data/cndba/DAVE02.DBF   AVAILABLE
3          DAVE            /dm/dmdbms/data/cndba/DAVE01.DBF   AVAILABLE
4          DMHR            /dm/dmdbms/data/cndba/DMHR.DBF     AVAILABLE
5          MAIN            /dm/dmdbms/data/cndba/MAIN.DBF     AVAILABLE
6          ROLL            /dm/dmdbms/data/cndba/ROLL.DBF     AVAILABLE
7          SYSTEM          /dm/dmdbms/data/cndba/SYSTEM.DBF   AVAILABLE
8          TEMP            /dm/dmdbms/data/cndba/TEMP.DBF     AVAILABLE

8 rows got

已用时间: 7.133(毫秒). 执行号:2178.
SQL> 
SQL> create user dave identified by "www.cndba.cn" default tablespace dave;
操作已执行
已用时间: 4.983(毫秒). 执行号:2179.
SQL> grant dba,resource to dave;
操作已执行
已用时间: 2.897(毫秒). 执行号:2180.
SQL> 

SQL> conn dave/"www.cndba.cn"

服务器[LOCALHOST:5236]:处于普通打开状态
登录使用时间: 10.927(毫秒)
SQL> create table dave as select * from dba_data_files;
操作已执行
已用时间: 21.781(毫秒). 执行号:2181.
SQL> select count(1) from dave;

行号     COUNT(1)            
---------- --------------------
1          8

已用时间: 1.336(毫秒). 执行号:2182.
SQL>

2.2 OS级别删除数据文件

[dave@www.cndba.cn ~]$ cd /dm/dmdbms/data/cndba/
[dave@www.cndba.cn cndba]$ ls
bak           DAVE01.DBF             dmdcr_example.ini         dminst.sys             dmtimer_example.ini    MAIN.DBF            SYSTEM.DBF
BOOKSHOP.DBF  DAVE02.DBF             DMHR.DBF                  dmmal_example.ini      dmwatcher_example.ini  rep_conflict.log    TEMP.DBF
cndba01.log   dmarch_example.ini     dm.ini                    dmmonitor_example.ini  dmwatch_example.ini    ROLL.DBF            trace
cndba02.log   dm.ctl                 dminit20290223224934.log  dmmpp_example.ini      dmwmon_example.ini     sqllog_example.ini
ctl_bak       dmdcr_cfg_example.ini  dminit_example.ini        dm_service.prikey      HMAIN                  sqllog.ini
[dave@www.cndba.cn cndba]$ rm -rf DAVE01.DBF 
[dave@www.cndba.cn cndba]$ ls
bak           DAVE02.DBF             DMHR.DBF                  dmmal_example.ini      dmwatcher_example.ini  rep_conflict.log    TEMP.DBF
BOOKSHOP.DBF  dmarch_example.ini     dm.ini                    dmmonitor_example.ini  dmwatch_example.ini    ROLL.DBF            trace
cndba01.log   dm.ctl                 dminit20290223224934.log  dmmpp_example.ini      dmwmon_example.ini     sqllog_example.ini
cndba02.log   dmdcr_cfg_example.ini  dminit_example.ini        dm_service.prikey      HMAIN                  sqllog.ini
ctl_bak       dmdcr_example.ini      dminst.sys                dmtimer_example.ini    MAIN.DBF               SYSTEM.DBF
[dave@www.cndba.cn cndba]$ 


在此查询之前创建的表:
SQL> select count(1) from dave;

行号     COUNT(1)            
---------- --------------------
1          8

已用时间: 0.697(毫秒). 执行号:2184.

#使用SP_FILE_SYS_CHECK()过程检查后报错:
SQL> select SP_FILE_SYS_CHECK();
select SP_FILE_SYS_CHECK();
第1 行附近出现错误[-4015]:无效的SELECT项.
已用时间: 1.131(毫秒). 执行号:0.
SQL> call SP_FILE_SYS_CHECK();
DMSQL 过程已成功完成
已用时间: 1.253(毫秒). 执行号:2185.
SQL>  select count(1) from dave;
 select count(1) from dave;
[-3430]:表空间[DAVE]中文件[/dm/dmdbms/data/cndba/DAVE01.DBF]已被删除.
已用时间: 1.518(毫秒). 执行号:0.
SQL>

2.3 恢复数据文件

#执行准备恢复过程:
SQL> call sp_tablespace_prepare_recover('DAVE');
DMSQL 过程已成功完成
已用时间: 0.994(毫秒). 执行号:2187.
SQL> 

#查找DM 进程ID:
[dave@www.cndba.cn cndba]$ ps -ef|grep dmserver
dmdba     6857     1  0 Aug26 pts/3    00:00:14 /dm/dmdbms/bin/dmserver /dm/dmdbms/data/cndba/dm.ini -noconsole
dmdba    20041 19947  0 09:28 pts/1    00:00:00 grep dmserver
[dave@www.cndba.cn cndba]$ 

#查找被删除的文件:这里对应的的文件号是51
[dave@www.cndba.cn cndba]$ ls /proc/6857/fd -l
总用量 0
lr-x------ 1 dmdba dinstall 64  2月 24 2029 0 -> /dev/null
l-wx------ 1 dmdba dinstall 64  2月 24 2029 1 -> /dm/dmdbms/log/DmServicedave.log
lrwx------ 1 dmdba dinstall 64  2月 24 2029 10 -> /dm/dmdbms/data/cndba/ROLL.DBF
lrwx------ 1 dmdba dinstall 64  2月 24 2029 11 -> /dm/dmdbms/data/cndba/MAIN.DBF
lrwx------ 1 dmdba dinstall 64  2月 24 2029 46 -> /dm/dmdbms/data/cndba/BOOKSHOP.DBF
lrwx------ 1 dmdba dinstall 64  2月 24 2029 47 -> /dm/dmdbms/data/cndba/DMHR.DBF
......
lrwx------ 1 dmdba dinstall 64  2月 24 2029 51 -> /dm/dmdbms/data/cndba/DAVE01.DBF (deleted)
lrwx------ 1 dmdba dinstall 64  2月 24 2029 52 -> /dm/dmdbms/data/cndba/DAVE02.DBF
lrwx------ 1 dmdba dinstall 64  2月 24 2029 6 -> /dm/dmdbms/data/cndba/SYSTEM.DBF
lrwx------ 1 dmdba dinstall 64  2月 24 2029 7 -> /dm/dmdbms/data/cndba/TEMP.DBF
lrwx------ 1 dmdba dinstall 64  2月 24 2029 8 -> /dm/dmdbms/data/cndba/cndba01.log
lrwx------ 1 dmdba dinstall 64  2月 24 2029 9 -> /dm/dmdbms/data/cndba/cndba02.log
[dave@www.cndba.cn cndba]$ 

#复制文件到原来的位置:
[dave@www.cndba.cn cndba]$ cp /proc/6857/fd/51 /dm/dmdbms/data/cndba/DAVE01.DBF
[dave@www.cndba.cn cndba]$ 

#执行恢复过程:
SQL> call sp_tablespace_recover('DAVE');
DMSQL 过程已成功完成
已用时间: 11.210(毫秒). 执行号:2188.


#验证恢复,正常:
SQL> call SP_FILE_SYS_CHECK();
DMSQL 过程已成功完成
已用时间: 0.980(毫秒). 执行号:2189.
SQL> select count(1) from dave;

行号     COUNT(1)            
---------- --------------------
1          8

已用时间: 0.813(毫秒). 执行号:2190.
SQL> 
SQL>  select tablespace_name, file_name, status from dba_data_files order by 1;

行号     TABLESPACE_NAME FILE_NAME                          STATUS   
---------- --------------- ---------------------------------- ---------
1          BOOKSHOP        /dm/dmdbms/data/cndba/BOOKSHOP.DBF AVAILABLE
2          DAVE            /dm/dmdbms/data/cndba/DAVE02.DBF   AVAILABLE
3          DAVE            /dm/dmdbms/data/cndba/DAVE01.DBF   AVAILABLE
4          DMHR            /dm/dmdbms/data/cndba/DMHR.DBF     AVAILABLE
5          MAIN            /dm/dmdbms/data/cndba/MAIN.DBF     AVAILABLE
6          ROLL            /dm/dmdbms/data/cndba/ROLL.DBF     AVAILABLE
7          SYSTEM          /dm/dmdbms/data/cndba/SYSTEM.DBF   AVAILABLE
8          TEMP            /dm/dmdbms/data/cndba/TEMP.DBF     AVAILABLE

8 rows got

版权声明:本文为博主原创文章,未经博主允许不得转载。

用户评论
* 以下用户言论只代表其个人观点,不代表CNDBA社区的观点或立场
Dave

Dave

关注

人的一生应该是这样度过的:当他回首往事的时候,他不会因为虚度年华而悔恨,也不会因为碌碌无为而羞耻;这样,在临死的时候,他就能够说:“我的整个生命和全部精力,都已经献给世界上最壮丽的事业....."

  • 1835
    原创
  • 2
    翻译
  • 423
    转载
  • 123
    评论
  • 访问:3272568次
  • 积分:2903
  • 等级:核心会员
  • 排名:第1名
精华文章
    最新问题
    查看更多+
    热门文章
      热门用户
      推荐用户
        Copyright © 2016 All Rights Reserved. Powered by ZhiXinTech · 皖ICP备19020168号·

        QQ交流群