暂无图片
暂无图片
1
暂无图片
暂无图片
暂无图片

DM8恢复误删表空间的数据文件_句柄未被关闭场景

原创 董小姐 恩墨学院 2024-02-21
539

本文档案例是基于数据文件在操作系统层面被误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 directory

2.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 AVAILABLE

2.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 AVAILABLE

2.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 -noconsole

2.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.dbf

2.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

「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

文章被以下合辑收录

评论