本文档案例是基于数据文件在操作系统层面被误rm删除,达梦数据库服务句柄没有被关闭的场景。
1、说明
1.1、表空间文件失效检查
LINUX 操作系统中,被进程打开的文件仍可以在 OS 系统中被删除,因此存在 DM 数据文件可能被误删的风险。如果数据文件被删除,DM8 数据库能够及时检测出来,并立刻停止对其继续使用并通知用户。在 dm.ini 中参数 FIL_CHECK_INTERVAL 的值指定 DM8 数据库检查数据文件是否仍存在的时间间隔,将其设为 0 表示不进行检查(默认0)。也可以通过系统过程 SP_FILE_SYS_CHECK() 来手动的进行检查。系统一旦检测出某个表空间内的数据文件被删除,则与该表空间所有的操作都将会失败,并报错该表空间内有数据文件被删除。
--检查数据文件是否仍存在的时间间隔 默认0 不进行检查
[dmdba@top175 bin]$ ps -ef | grep dmserver
dmdba 3058 1 0 13:59 pts/0 00:00:50 /dmdb8/dmdbms/bin/dmserver path=/topqspsserverdata/topqsps_server/dm.ini -noconsole
dmdba 30796 20102 0 15:27 pts/0 00:00:00 grep --color=auto dmserver
[dmdba@top175 bin]$ cat /topqspsserverdata/topqsps_server/dm.ini | grep FIL_CHECK_INTERVAL
FIL_CHECK_INTERVAL = 0 #Check file interval in Second,0 means no_check(Non-Windows Only)1.2、表空间失效文件恢复
达梦官方手册提供的恢复方法如下:
LINUX 系统中被删除的文件,只要其句柄没有被关闭,可以在/proc/<pid>/fd 中找到其对应的文件副本。其中<pid>指打开该文件的进程 id。利用该方法,结合 OS 命令,DM 提供失效文件的恢复方案如下:
1、 调用系统过程 SP_TABLESPACE_PREPARE_RECOVER(tablespace_name)准备进行恢复;
2、 如果使用过程中 DM 报错表空间数据文件被删除,通过操作系统的 ps 命令找到当前dmserver 的 PID:ps –ef|grep dmserver;
3、 使用操作系统 ls 命令查看被删除文件对应的副本:ls -l /proc/<PID>/fd,会发现被删除的文件后有(deleted)字样;
4、 使用操作系统的 cp 命令将文件复制到原位置:cp bak_fildata_file_path_dir;
5、 复制成功后,调用系统过程 SP_TABLESPACE_RECOVER(ts_name)完成表空间失效文件的恢复。
注意:要保证数据文件正确修复,需要保证在 SP_TABLESPACE_PREPARE_RECOVER后进行数据文件的复制。
2、实验步骤
2.1、环境准备
--登录数据库
[dmdba@top175 bin]$ disql sysdba/SYSDBA:5239
--设置密码策略(可选) 0不限制
SP_SET_PARA_VALUE(1,'PWD_POLICY',0) ;
--查看达梦数据库库名
SQL> select name,create_time from v$database;
行号 name create_time
---------- -------- -------------------
1 topqsps_server 2024-02-01 10:42:31
已用时间: 0.553(毫秒). 执行号:700.
--查看达梦数据库实例名及状态
SQL> select name,instance_name,start_time,status$ from v$instance;
行号 name instance_name start_time status$
---------- -------- ------------- ------------------- -------
1 TOPQSPS_SERVER TOPQSPS_SERVER 2024-02-01 10:51:08 OPEN
已用时间: 0.119(毫秒). 执行号:701.
--查看已有表空间和数据文件的位置
select tablespace_name, file_name, status from dba_data_files;
--创建表空间
create tablespace topnet datafile '/topqspsserverdata/topqsps_server/topnet01.dbf'
size 1024
autoextend on maxsize 32764 CACHE = NORMAL;
select tablespace_name, file_name, status from dba_data_files;
--创建用户指定表空间并授权
create user topnet identified by topnet default tablespace topnet;
grant public,dba to topnet;
--切换新用户创建表并插入数据
disql topnet/topnet:5239
create table test(id int, name varchar2(32));
insert into test values(1,'lilv');
commit;
select * from test;2.2、删除表空间数据文件
2.2.1、模拟误删除数据文件
--磁盘上删除表空间topnet的数据文件,模拟误删除
[dmdba@top175 ~]$ cd /topqspsserverdata/topqsps_server/
[dmdba@top175 topqsps_server]$ ls -l
total 2052228
drwxr-xr-x 2 dmdba dinstall 4096 Feb 21 13:51 bak
drwxr-xr-x 2 dmdba dinstall 4096 Feb 21 16:11 ctl_bak
-rw-r--r-- 1 dmdba dinstall 6656 Feb 21 16:11 dm.ctl
-rw-r--r-- 1 dmdba dinstall 75735 Feb 21 13:52 dm.ini
-rw-r--r-- 1 dmdba dinstall 1116 Feb 21 13:52 dminit20240221135157.log
-rw-r--r-- 1 dmdba dinstall 633 Feb 21 13:52 dm_service.prikey
drwxr-xr-x 2 dmdba dinstall 4096 Feb 21 13:52 HMAIN
-rw-r--r-- 1 dmdba dinstall 134217728 Feb 21 13:52 MAIN.DBF
-rw-r--r-- 1 dmdba dinstall 1073741824 Feb 21 15:13 postgres01.DBF
-rw-r--r-- 1 dmdba dinstall 134217728 Feb 21 17:18 ROLL.DBF
-rw-r--r-- 1 dmdba dinstall 714 Feb 21 13:51 sqllog.ini
-rw-r--r-- 1 dmdba dinstall 77594624 Feb 21 17:18 SYSTEM.DBF
-rw-r--r-- 1 dmdba dinstall 10485760 Feb 21 14:00 TEMP.DBF
-rw-r--r-- 1 dmdba dinstall 134217728 Feb 21 16:11 topnet01.dbf
-rw-r--r-- 1 dmdba dinstall 268435456 Feb 21 17:18 topqsps_server01.log
-rw-r--r-- 1 dmdba dinstall 268435456 Feb 21 14:00 topqsps_server02.log
drwxr-xr-x 2 dmdba dinstall 4096 Feb 21 14:00 trace
[dmdba@top175 topqsps_server]$ rm -f topnet01.dbf
[dmdba@top175 topqsps_server]$ ls -l topnet01.dbf
ls: cannot access topnet01.dbf: No such file or directory2.2.2、模拟插入数据
LINUX 系统中被删除的文件,只要其句柄没有被关闭。且 dm.ini 中参数 FIL_CHECK_INTERVAL 的值默认为 0 即不进行检查,所以误删除数据文件后数据库还是能继续运行一段时间,依然可以进行查询写入。 FIL_CHECK_INTERVAL指定 DM8 数据库检查数据文件是否仍存在的时间间隔,默认0。
SQL> select * from test;
LINEID ID NAME
---------- ----------- ----
1 1 lilv
used time: 0.481(ms). Execute id is 70517.
SQL> insert into test values(2,'yingzi');
affect rows 1
used time: 1.011(ms). Execute id is 70518.
SQL> commit;
executed successfully
used time: 2.414(ms). Execute id is 70519.
SQL> select * from test;
LINEID ID NAME
---------- ----------- ------
1 1 lilv
2 2 yingzi
used time: 0.315(ms). Execute id is 70520.
--查看表空间和数据库状态 TOPNET表空间状态可用
SQL> select tablespace_name, file_name, status from dba_data_files order by 1;
LINEID TABLESPACE_NAME FILE_NAME STATUS
---------- --------------- ------------------------------------------------ ---------
1 MAIN /topqspsserverdata/topqsps_server/MAIN.DBF AVAILABLE
2 ROLL /topqspsserverdata/topqsps_server/ROLL.DBF AVAILABLE
3 SYSTEM /topqspsserverdata/topqsps_server/SYSTEM.DBF AVAILABLE
4 TEMP /topqspsserverdata/topqsps_server/TEMP.DBF AVAILABLE
5 TOPNET /topqspsserverdata/topqsps_server/topnet01.dbf AVAILABLE
7 postgres /topqspsserverdata/topqsps_server/postgres01.DBF AVAILABLE2.2.3、表空间文件手动失效检查
SQL> call SP_FILE_SYS_CHECK();
DMSQL executed successfully
used time: 0.699(ms). Execute id is 70521.2.2.4、验证数据
SQL> select * from test;
select * from test;
[-3433]:tablespace is offline.
used time: 0.258(ms). Execute id is 0.
--查看表空间和数据库状态 TOPNET表空间已变成了无效
SQL> select tablespace_name, file_name, status from dba_data_files order by 1;
LINEID TABLESPACE_NAME FILE_NAME STATUS
---------- --------------- ------------------------------------------------ ---------
1 MAIN /topqspsserverdata/topqsps_server/MAIN.DBF AVAILABLE
2 ROLL /topqspsserverdata/topqsps_server/ROLL.DBF AVAILABLE
3 SYSTEM /topqspsserverdata/topqsps_server/SYSTEM.DBF AVAILABLE
4 TEMP /topqspsserverdata/topqsps_server/TEMP.DBF AVAILABLE
5 TOPNET /topqspsserverdata/topqsps_server/topnet01.dbf INVALID
7 postgres /topqspsserverdata/topqsps_server/postgres01.DBF AVAILABLE2.3、恢复表空间数据文件
2.3.1、调用系统过程进行准备恢复
SQL> call sp_tablespace_prepare_recover('TOPNET');
DMSQL executed successfully
used time: 0.996(ms). Execute id is 70902.2.3.2、查看达梦进程
[dmdba@top175 ~]$ ps -ef | grep dmserver
dmdba 3058 1 0 13:59 pts/0 00:00:58 /dmdb8/dmdbms/bin/dmserver path=/topqspsserverdata/topqsps_server/dm.ini -noconsole2.3.3、查找被删除的文件
根据进程查找被删除的文件
/topqspsserverdata/topqsps_server/topnet01.dbf (deleted)
[dmdba@top175 ~]$ cd /proc/3058/fd
[dmdba@top175 fd]$ ls -l
total 0
lr-x------ 1 dmdba dinstall 64 Feb 21 14:00 0 -> /dev/null
l-wx------ 1 dmdba dinstall 64 Feb 21 14:00 1 -> /dev/null
lrwx------ 1 dmdba dinstall 64 Feb 21 14:00 10 -> /topqspsserverdata/topqsps_server/ROLL.DBF
lrwx------ 1 dmdba dinstall 64 Feb 21 14:00 11 -> /topqspsserverdata/topqsps_server/MAIN.DBF
lr-x------ 1 dmdba dinstall 64 Feb 21 14:00 12 -> pipe:[11853975]
l-wx------ 1 dmdba dinstall 64 Feb 21 14:00 13 -> pipe:[11853975]
lr-x------ 1 dmdba dinstall 64 Feb 21 14:00 14 -> pipe:[11853976]
l-wx------ 1 dmdba dinstall 64 Feb 21 14:00 15 -> pipe:[11853976]
lr-x------ 1 dmdba dinstall 64 Feb 21 14:00 16 -> pipe:[11853977]
l-wx------ 1 dmdba dinstall 64 Feb 21 14:00 17 -> pipe:[11853977]
lr-x------ 1 dmdba dinstall 64 Feb 21 14:00 18 -> pipe:[11853978]
l-wx------ 1 dmdba dinstall 64 Feb 21 14:00 19 -> pipe:[11853978]
l-wx------ 1 dmdba dinstall 64 Feb 21 14:00 2 -> /dev/null
lr-x------ 1 dmdba dinstall 64 Feb 21 14:00 20 -> pipe:[11853979]
l-wx------ 1 dmdba dinstall 64 Feb 21 14:00 21 -> pipe:[11853979]
lr-x------ 1 dmdba dinstall 64 Feb 21 14:00 22 -> pipe:[11853980]
l-wx------ 1 dmdba dinstall 64 Feb 21 14:00 23 -> pipe:[11853980]
lr-x------ 1 dmdba dinstall 64 Feb 21 14:00 24 -> pipe:[11853981]
l-wx------ 1 dmdba dinstall 64 Feb 21 14:00 25 -> pipe:[11853981]
lr-x------ 1 dmdba dinstall 64 Feb 21 14:00 26 -> pipe:[11853982]
l-wx------ 1 dmdba dinstall 64 Feb 21 14:00 27 -> pipe:[11853982]
lr-x------ 1 dmdba dinstall 64 Feb 21 14:00 28 -> pipe:[11853983]
l-wx------ 1 dmdba dinstall 64 Feb 21 14:00 29 -> pipe:[11853983]
lrwx------ 1 dmdba dinstall 64 Feb 21 14:00 3 -> socket:[11853612]
lr-x------ 1 dmdba dinstall 64 Feb 21 14:00 30 -> pipe:[11853984]
l-wx------ 1 dmdba dinstall 64 Feb 21 14:00 31 -> pipe:[11853984]
lr-x------ 1 dmdba dinstall 64 Feb 21 14:00 32 -> pipe:[11853985]
l-wx------ 1 dmdba dinstall 64 Feb 21 14:00 33 -> pipe:[11853985]
lr-x------ 1 dmdba dinstall 64 Feb 21 14:00 34 -> pipe:[11853986]
l-wx------ 1 dmdba dinstall 64 Feb 21 14:00 35 -> pipe:[11853986]
lr-x------ 1 dmdba dinstall 64 Feb 21 14:00 36 -> pipe:[11853987]
l-wx------ 1 dmdba dinstall 64 Feb 21 14:00 37 -> pipe:[11853987]
lr-x------ 1 dmdba dinstall 64 Feb 21 14:00 38 -> pipe:[11853988]
l-wx------ 1 dmdba dinstall 64 Feb 21 14:00 39 -> pipe:[11853988]
lrwx------ 1 dmdba dinstall 64 Feb 21 14:00 4 -> socket:[11853613]
lr-x------ 1 dmdba dinstall 64 Feb 21 14:00 40 -> pipe:[11853989]
l-wx------ 1 dmdba dinstall 64 Feb 21 14:00 41 -> pipe:[11853989]
lr-x------ 1 dmdba dinstall 64 Feb 21 14:00 42 -> pipe:[11853990]
l-wx------ 1 dmdba dinstall 64 Feb 21 14:00 43 -> pipe:[11853990]
lrwx------ 1 dmdba dinstall 64 Feb 21 14:00 44 -> socket:[12289082]
lrwx------ 1 dmdba dinstall 64 Feb 21 14:02 45 -> /topqspsserverdata/topqsps_server/postgres01.DBF
lrwx------ 1 dmdba dinstall 64 Feb 21 14:08 46 -> /topqspsserverdata/topqsps_server/topnet01.dbf (deleted)
lrwx------ 1 dmdba dinstall 64 Feb 21 14:32 47 -> socket:[12216067]
lrwx------ 1 dmdba dinstall 64 Feb 21 14:32 48 -> socket:[12216068]
lrwx------ 1 dmdba dinstall 64 Feb 21 14:32 49 -> socket:[12216086]
l-wx------ 1 dmdba dinstall 64 Feb 21 14:00 5 -> /dev/null
lrwx------ 1 dmdba dinstall 64 Feb 21 14:00 6 -> /topqspsserverdata/topqsps_server/SYSTEM.DBF
lrwx------ 1 dmdba dinstall 64 Feb 21 14:00 7 -> /topqspsserverdata/topqsps_server/TEMP.DBF
lrwx------ 1 dmdba dinstall 64 Feb 21 14:00 8 -> /topqspsserverdata/topqsps_server/topqsps_server01.log
lrwx------ 1 dmdba dinstall 64 Feb 21 14:00 9 -> /topqspsserverdata/topqsps_server/topqsps_server02.log
[dmdba@top175 fd]$ ls -l /proc/3058/fd/46
lrwx------ 1 dmdba dinstall 64 Feb 21 14:08 /proc/3058/fd/46 -> /topqspsserverdata/topqsps_server/topnet01.dbf (deleted)2.3.4、还原数据文件到原始目录
[dmdba@top175 fd]$ cp /proc/3058/fd/46 /topqspsserverdata/topqsps_server/topnet01.dbf2.3.5、执行恢复过程并检查
--执行表空间恢复
SQL> call sp_tablespace_recover('TOPNET');
DMSQL executed successfully
used time: 27.094(ms). Execute id is 70903.
--表空间文件手动失效检查
SQL> call SP_FILE_SYS_CHECK();
DMSQL executed successfully
used time: 0.508(ms). Execute id is 70904.2.4、验证数据
--再次查询数据
SQL> select * from test;
LINEID ID NAME
---------- ----------- ------
1 1 lilv
2 2 yingzi
used time: 0.420(ms). Execute id is 70906.
--查看表空间和数据库状态 TOPNET表空间已变成了有效
SQL> select tablespace_name, file_name, status from dba_data_files order by 1;
LINEID TABLESPACE_NAME FILE_NAME STATUS
---------- --------------- ------------------------------------------------ ---------
1 MAIN /topqspsserverdata/topqsps_server/MAIN.DBF AVAILABLE
2 ROLL /topqspsserverdata/topqsps_server/ROLL.DBF AVAILABLE
3 SYSTEM /topqspsserverdata/topqsps_server/SYSTEM.DBF AVAILABLE
4 TEMP /topqspsserverdata/topqsps_server/TEMP.DBF AVAILABLE
5 TOPNET /topqspsserverdata/topqsps_server/topnet01.dbf AVAILABLE
7 postgres /topqspsserverdata/topqsps_server/postgres01.DBF AVAILABLE参考链接:https://blog.csdn.net/lilv1989/article/details/116197950




