达梦数据库LINUX下误删数据文件恢复

在linux系统当中,达梦数据库是以数据文件的方式保存在操作系统中,当你删除数据文件,只要是操作系统和数据库未重启,文件的句柄是未释放的。此时当你删除了数据文件的时候,数据库和操作系统未重启,又没有数据备份的时候,我们还有机会将数据文件进行恢复。

1.利用数据迁移工具将数据迁移到新的正常的数据库实例上

数据文件删除之后只要未做数据文件检查,数据文件中对应的表数据还是可以正常访问的,所以我们可以重新初始化一个参数一致的数据库。使用不同的端口,然后启动数据库。然后将应用停掉防止数据再写入,再使用迁移工具将数据完整迁移过来。

如果数据量不大的情况下数据迁移将很快。但是对于数据量较大,停机迁移时间无法接受的情况下,又没有数据备份的情况可以使用第二种方法。

2.将删除的数据文件找回进行恢复

2.1 创建测试用的表空间、数据文件、用户、表。

SQL> create tablespace TEST_RM datafile 'TEST_RM01.DBF' size 128 autoextend on next 128 CACHE = NORMAL;
操作已执行
已用时间: 13.499(毫秒). 执行号:53300.
SQL>  create user TEST_RM identified by 123456789 default tablespace TEST_RM;
操作已执行
已用时间: 5.172(毫秒). 执行号:53301.
SQL>  grant "PUBLIC","RESOURCE","SOI","VTI" to TEST_RM;
操作已执行
已用时间: 3.186(毫秒). 执行号:53302.
SQL> create table TEST_RM.T1 as select * from v$sessions;
操作已执行
已用时间: 10.411(毫秒). 执行号:53303.
SQL> select tablespace_name, file_name, status from dba_data_files;
 
行号     TABLESPACE_NAME FILE_NAME                                STATUS   
---------- --------------- ---------------------------------------- ---------
1          SYSTEM          /home/dmdba/TEST_RM/DAMENG/SYSTEM.DBF    AVAILABLE
2          TEST_RM         /home/dmdba/TEST_RM/DAMENG/TEST_RM01.DBF AVAILABLE
3          MAIN            /home/dmdba/TEST_RM/DAMENG/MAIN.DBF      AVAILABLE
4          TEMP            /home/dmdba/TEST_RM/DAMENG/TEMP.DBF      AVAILABLE
5          ROLL            /home/dmdba/TEST_RM/DAMENG/ROLL.DBF      AVAILABLE
 
已用时间: 7.356(毫秒). 执行号:53304.
SQL> select * from TEST_RM.T1;
 
行号     SESS_ID              SESS_SEQ    SQL_TEXT                                             STATE  N_STMT      N_USED_STMT SEQ_NO      CURR_SCH USER_NAME TRX_ID               CREATE_TIME                CLNT_TYPE TIME_ZONE CHK_CONS CHK_IDENT RDONLY INS_NULL
---------- -------------------- ----------- ---------------------------------------------------- ------ ----------- ----------- ----------- -------- --------- -------------------- -------------------------- --------- --------- -------- --------- ------ --------
          COMPILE_FLAG AUTO_CMT DDL_AUTOCMT RS_FOR_QRY CHK_NET ISO_LEVEL   CLNT_HOST APPNAME CLNT_IP OSNAME CONN_TYPE    VPOOLADDR            RUN_STATUS MSG_STATUS LAST_RECV_TIME             LAST_SEND_TIME             DCP_FLAG THRD_ID     CONNECTED   PORT_TYPE  
          ------------ -------- ----------- ---------- ------- ----------- --------- ------- ------- ------ ------------ -------------------- ---------- ---------- -------------------------- -------------------------- -------- ----------- ----------- -----------
          SRC_SITE    MAL_ID               CONCURRENT_FLAG CUR_LINENO  CUR_MTDNAME CUR_SQLSTR CLNT_VER
          ----------- -------------------- --------------- ----------- ----------- ---------- --------
1          140217730275320      549         create table TEST_RM.T1 as select * from v$sessions; ACTIVE 64          1           8           SYSDBA   SYSDBA    3561                 2021-10-28 15:55:31.000000 SQL3      +08:00    N        N         N      Y
          N            N        Y           N          N       1           RH6       disql   ::1     Linux   HOMOGENEOUS 140217730207664      RUNNING    RECIEVE    2021-10-28 15:56:00.000000 2021-10-28 15:55:55.000000 N        27149       1           0
          65535       NULL                 0               55          NULL        NULL       7.1.8.46
 
 
已用时间: 1.607(毫秒). 执行号:53305.
SQL>

2.2 删除对应的表空间的数据文件进行模拟

[dmdba@RH6 bin]$ cd /home/dmdba/TEST_RM/DAMENG/
[dmdba@RH6 DAMENG]$ ls
bak  ctl_bak  DAMENG01.log  DAMENG02.log  dm.ctl  dm.ini  dminit20211028155433.log  dm_service.prikey  HMAIN  MAIN.DBF  rep_conflict.log  ROLL.DBF  sqllog.ini  SYSTEM.DBF  TEMP.DBF  TEST_RM01.DBF  trace
[dmdba@RH6 DAMENG]$ ls -ltr
total 1187948
drwxr-xr-x 2 dmdba dinstall      4096 Oct 28 15:54 bak
-rw-r--r-- 1 dmdba dinstall       481 Oct 28 15:54 sqllog.ini
-rw-r--r-- 1 dmdba dinstall     52092 Oct 28 15:54 dm.ini
-rw-r--r-- 1 dmdba dinstall       633 Oct 28 15:54 dm_service.prikey
-rw-r--r-- 1 dmdba dinstall 134217728 Oct 28 15:54 MAIN.DBF
drwxr-xr-x 2 dmdba dinstall      4096 Oct 28 15:54 HMAIN
-rw-r--r-- 1 dmdba dinstall      1000 Oct 28 15:54 dminit20211028155433.log
-rw-r--r-- 1 dmdba dinstall  77594624 Oct 28 15:55 TEMP.DBF
-rw-r--r-- 1 dmdba dinstall 268435456 Oct 28 15:55 DAMENG02.log
drwxr-xr-x 2 dmdba dinstall      4096 Oct 28 15:55 trace
-rw-r--r-- 1 dmdba dinstall        12 Oct 28 15:55 rep_conflict.log
-rw-r--r-- 1 dmdba dinstall      5632 Oct 28 15:55 dm.ctl
drwxr-xr-x 2 dmdba dinstall      4096 Oct 28 15:55 ctl_bak
-rw-r--r-- 1 dmdba dinstall 268435456 Oct 28 15:56 DAMENG01.log
-rw-r--r-- 1 dmdba dinstall 161480704 Oct 28 15:56 ROLL.DBF
-rw-r--r-- 1 dmdba dinstall 134217728 Oct 28 15:56 TEST_RM01.DBF
-rw-r--r-- 1 dmdba dinstall 171966464 Oct 28 15:56 SYSTEM.DBF
[dmdba@RH6 DAMENG]$
[dmdba@RH6 DAMENG]$ mv TEST_RM01.DBF /tmp

2.3 查询表空间和表空间状况

再查询表数据和表空间状况,你会发现数据一样能查询(是由于未做数据文件校验,如果做了数据文件校验将会查询不到数据),但是查看系统视图数据文件路径已经不存在。

SQL> select * from TEST_RM.T1;
 
行号     SESS_ID              SESS_SEQ    SQL_TEXT                                              STATE  N_STMT      N_USED_STMT SEQ_NO      CURR_SCH USER_NAME TRX_ID               CREATE_TIME                CLNT_TYPE TIME_ZONE CHK_CONS CHK_IDENT RDONLY INS_NULL
---------- -------------------- ----------- ----------------------------------------------------- ------ ----------- ----------- ----------- -------- --------- -------------------- -------------------------- --------- --------- -------- --------- ------ --------
           COMPILE_FLAG AUTO_CMT DDL_AUTOCMT RS_FOR_QRY CHK_NET ISO_LEVEL   CLNT_HOST APPNAME CLNT_IP OSNAME CONN_TYPE    VPOOLADDR            RUN_STATUS MSG_STATUS LAST_RECV_TIME             LAST_SEND_TIME             DCP_FLAG THRD_ID     CONNECTED   PORT_TYPE  
           ------------ -------- ----------- ---------- ------- ----------- --------- ------- ------- ------ ------------ -------------------- ---------- ---------- -------------------------- -------------------------- -------- ----------- ----------- -----------
           SRC_SITE    MAL_ID               CONCURRENT_FLAG CUR_LINENO  CUR_MTDNAME CUR_SQLSTR CLNT_VER
           ----------- -------------------- --------------- ----------- ----------- ---------- --------
1          140611457980408      549          create table TEST_RM.T1 as select * from v$sessions; ACTIVE 64          1           8           SYSDBA   SYSDBA    3561                 2021-10-28 16:02:53.000000 SQL3      +08:00    N        N         N      Y
           N            N        Y           N          N       1           RH6       disql   ::1     Linux   HOMOGENEOUS 140611457912752      RUNNING    RECIEVE    2021-10-28 16:03:10.000000 2021-10-28 16:03:05.000000 N        27377       1           0
           65535       NULL                 0               55          NULL        NULL       7.1.8.46
已用时间: 0.714(毫秒). 执行号:53306.
SQL>
SQL> select tablespace_name, file_name, status from dba_data_files;
select tablespace_name, file_name, status from dba_data_files;
[-2206]:无效的参数值.
已用时间: 9.580(毫秒). 执行号:0.
SQL> SELECT GROUP_ID,PATH,CLIENT_PATH FROM "V$DATAFILE";
 
行号     GROUP_ID    PATH                                                               CLIENT_PATH
---------- ----------- ------------------------------------------------------------------ -----------
1          0           /home/dmdba/TEST_RM/DAMENG/SYSTEM.DBF                              SYSTEM.DBF
2          1           /home/dmdba/TEST_RM/DAMENG/ROLL.DBF                                ROLL.DBF
3          3           /home/dmdba/TEST_RM/DAMENG/TEMP.DBF                                TEMP.DBF
4          4           /home/dmdba/TEST_RM/DAMENG/MAIN.DBF                                MAIN.DBF
5          NULL        文件或目录[/home/dmdba/TEST_RM/DAMENG/TEST_RM01.DBF]不存在 NULL
 
已用时间: 0.669(毫秒). 执行号:53308.
SQL>

2.4 进行数据文件检查

SQL> call SP_FILE_SYS_CHECK();
DMSQL 过程已成功完成
已用时间: 1.861(毫秒). 执行号:53309.
SQL>  select * from TEST_RM.T1;
 select * from TEST_RM.T1;
[-3430]:表空间[TEST_RM]中文件[/home/dmdba/TEST_RM/DAMENG/TEST_RM01.DBF]已被删除.
已用时间: 1.049(毫秒). 执行号:0.

上面看得到如果未做数据文件检查的话,被删除的数据文件上的表和对象是可以正常访问的,在做了数据文件校验之后将无法正常访问。

2.5 恢复数据文件

2.5.1 先执行恢复前的准备工作

SQL> call sp_tablespace_prepare_recover('TEST_RM');
DMSQL 过程已成功完成
已用时间: 1.018(毫秒). 执行号:53311.

2.5.2 查看数据库进程号,找到未释放的文件句柄号和被删除的数据文件(重启之后文件句柄将会消失)

[dmdba@RH6 DAMENG]$ ps -ef|grep TEST_RM
dmdba    **27296**     1  0 16:01 pts/4    00:00:03 /home/dmdba/dm46/bin/dmserver path=/home/dmdba/TEST_RM/DAMENG/dm.ini -noconsole
dmdba    27444 26219  0 16:20 pts/5    00:00:00 grep TEST_RM
[dmdba@RH6 DAMENG]$ cd /proc/27296/fd
[dmdba@RH6 fd]$ ls -ltr
total 0
l-wx------ 1 dmdba dinstall 64 Oct 28 16:20 2 -> /home/dmdba/dm46/log/DmServiceTESTRM.log
lrwx------ 1 dmdba dinstall 64 Oct 28 16:20 9 -> /home/dmdba/TEST_RM/DAMENG/DAMENG02.log
lrwx------ 1 dmdba dinstall 64 Oct 28 16:20 8 -> /home/dmdba/TEST_RM/DAMENG/DAMENG01.log
lrwx------ 1 dmdba dinstall 64 Oct 28 16:20 7 -> /home/dmdba/TEST_RM/DAMENG/TEMP.DBF
lrwx------ 1 dmdba dinstall 64 Oct 28 16:20 6 -> /home/dmdba/TEST_RM/DAMENG/SYSTEM.DBF
lrwx------ 1 dmdba dinstall 64 Oct 28 16:20 5 -> socket:[225406]
lrwx------ 1 dmdba dinstall 64 Oct 28 16:20 48 -> socket:[226078]
lrwx------ 1 dmdba dinstall 64 Oct 28 16:20 47 -> socket:[226077]
lrwx------ 1 dmdba dinstall 64 Oct 28 16:20 46 -> socket:[225766]
**lrwx------ 1 dmdba dinstall 64 Oct 28 16:20 45 -> /home/dmdba/TEST_RM/DAMENG/TEST_RM01.DBF (deleted)**
lrwx------ 1 dmdba dinstall 64 Oct 28 16:20 44 -> socket:[225508]
......
lrwx------ 1 dmdba dinstall 64 Oct 28 16:20 11 -> /home/dmdba/TEST_RM/DAMENG/MAIN.DBF
lrwx------ 1 dmdba dinstall 64 Oct 28 16:20 10 -> /home/dmdba/TEST_RM/DAMENG/ROLL.DBF
l-wx------ 1 dmdba dinstall 64 Oct 28 16:20 1 -> /home/dmdba/dm46/log/DmServiceTESTRM.log
lr-x------ 1 dmdba dinstall 64 Oct 28 16:20 0 -> /dev/null
[dmdba@RH6 fd]$

2.5.3 将数据文件复制回去

注意:用dmdba的用户复制文件

[dmdba@RH6 fd]$ cp 45 /home/dmdba/TEST_RM/DAMENG/TEST_RM01.DBF

2.5.4 执行数据文件恢复过程

SQL> call sp_tablespace_recover('TEST_RM');
DMSQL 过程已成功完成
已用时间: 6.302(毫秒). 执行号:53312.
SQL> call SP_FILE_SYS_CHECK();
DMSQL 过程已成功完成
已用时间: 0.254(毫秒). 执行号:53313.

2.5.5 查询数据和表空间进行数据验证

SQL> select * from TEST_RM.T1;
 
行号     SESS_ID              SESS_SEQ    SQL_TEXT                                              STATE  N_STMT      N_USED_STMT SEQ_NO      CURR_SCH USER_NAME TRX_ID               CREATE_TIME                CLNT_TYPE TIME_ZONE CHK_CONS CHK_IDENT RDONLY INS_NULL
---------- -------------------- ----------- ----------------------------------------------------- ------ ----------- ----------- ----------- -------- --------- -------------------- -------------------------- --------- --------- -------- --------- ------ --------
           COMPILE_FLAG AUTO_CMT DDL_AUTOCMT RS_FOR_QRY CHK_NET ISO_LEVEL   CLNT_HOST APPNAME CLNT_IP OSNAME CONN_TYPE    VPOOLADDR            RUN_STATUS MSG_STATUS LAST_RECV_TIME             LAST_SEND_TIME             DCP_FLAG THRD_ID     CONNECTED   PORT_TYPE  
           ------------ -------- ----------- ---------- ------- ----------- --------- ------- ------- ------ ------------ -------------------- ---------- ---------- -------------------------- -------------------------- -------- ----------- ----------- -----------
           SRC_SITE    MAL_ID               CONCURRENT_FLAG CUR_LINENO  CUR_MTDNAME CUR_SQLSTR CLNT_VER
           ----------- -------------------- --------------- ----------- ----------- ---------- --------
1          140611457980408      549          create table TEST_RM.T1 as select * from v$sessions; ACTIVE 64          1           8           SYSDBA   SYSDBA    3561                 2021-10-28 16:02:53.000000 SQL3      +08:00    N        N         N      Y
           N            N        Y           N          N       1           RH6       disql   ::1     Linux   HOMOGENEOUS 140611457912752      RUNNING    RECIEVE    2021-10-28 16:03:10.000000 2021-10-28 16:03:05.000000 N        27377       1           0
           65535       NULL                 0               55          NULL        NULL       7.1.8.46
 
 
已用时间: 1.916(毫秒). 执行号:53314.
SQL> SELECT GROUP_ID,PATH,CLIENT_PATH FROM "V$DATAFILE";
 
行号     GROUP_ID    PATH                                     CLIENT_PATH  
---------- ----------- ---------------------------------------- -------------
1          0           /home/dmdba/TEST_RM/DAMENG/SYSTEM.DBF    SYSTEM.DBF
2          1           /home/dmdba/TEST_RM/DAMENG/ROLL.DBF      ROLL.DBF
3          3           /home/dmdba/TEST_RM/DAMENG/TEMP.DBF      TEMP.DBF
4          4           /home/dmdba/TEST_RM/DAMENG/MAIN.DBF      MAIN.DBF
5          5           /home/dmdba/TEST_RM/DAMENG/TEST_RM01.DBF TEST_RM01.DBF
 
已用时间: 0.450(毫秒). 执行号:53315.
SQL> select tablespace_name, file_name, status from dba_data_files;
 
行号     TABLESPACE_NAME FILE_NAME                                STATUS   
---------- --------------- ---------------------------------------- ---------
1          SYSTEM          /home/dmdba/TEST_RM/DAMENG/SYSTEM.DBF    AVAILABLE
2          TEST_RM         /home/dmdba/TEST_RM/DAMENG/TEST_RM01.DBF AVAILABLE
3          MAIN            /home/dmdba/TEST_RM/DAMENG/MAIN.DBF      AVAILABLE
4          TEMP            /home/dmdba/TEST_RM/DAMENG/TEMP.DBF      AVAILABLE
5          ROLL            /home/dmdba/TEST_RM/DAMENG/ROLL.DBF      AVAILABLE
已用时间: 4.885(毫秒). 执行号:53316.

至此恢复完成,恢复完成之后立即做一个整库的备份;如果未做数据定时备份的赶紧做任务。恢复过程中需要注意的点:1.数据库和操作系统不能重启 ;2.复制数据文件的时候需要用dmdba用户进行复制,其他账户复制文件需要将文件用户和组权限设置为dmdba和dinstall;

总结:以上方法是在数据库未开启归档也未做备份的情况下使用的办法,如果有备份的话可以直接使用备份和归档将数据完整恢复出来,同时恢复的速度和数据的完整性都有保障。在遇到不熟悉的环境需要做数据软件升级或者关闭重启的时候,最好检查下数据文件的状态。

猜你喜欢

转载自blog.csdn.net/qq_35273918/article/details/129738162