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