目录
一、说明
1.1、表空间文件失效检查
1.2、表空间失效文件恢复
二、实操
2.1、环境准备
2.2、删除表空间数据文件
2.3、恢复表空间数据文件
一、说明
1.1、表空间文件失效检查
LINUX 操作系统中,被进程打开的文件仍可以在 OS 系统中被删除,因此存在 DM 数据文件可能被误删的风险。如果数据文件被删除,DM8 数据库能够及时检测出来,并立刻停止对其继续使用并通知用户。在 dm.ini 中参数 FIL_CHECK_INTERVAL 的值指定 DM8 数据库检查数据文件是否仍存在的时间间隔,将其设为 0 表示不进行检查。也可以通过系统过程 SP_FILE_SYS_CHECK() 来手动的进行检查。系统一旦检测出某个表空间内的数据文件被删除,则与该表空间所有的操作都将会失败,并报错该表空间内有数据文件被删除。
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 /proc/<PID>/fd–l,会发现被删除的文件后有(deleted)字样;
4、 使用操作系统的 cp 命令将文件复制到原位置:cp bak_fildata_file_path_dir;
5、 复制成功后,调用系统过程 SP_TABLESPACE_RECOVER(ts_name)完成表空间失效文件的恢复。
注意,要保证数据文件正确修复,需要保证在 SP_TABLESPACE_PREPARE_RECOVER后进行数据文件的复制。
二、实操
2.1、环境准备
1.创建表空间
dmdba@dmdsc01:~/dmdbms/bin$ ./disql sysdba/SYSDBA服务器[LOCALHOST:5236]:处于普通打开状态
登录使用时间 : 28.147(ms)
disql V8
SQL> create tablespace test datafile '/home/dmdba/dbdata/dmdata/TEST.DBF' size 32;
操作已执行
已用时间: 258.774(毫秒). 执行号:14700.
SQL> select tablespace_name, file_name, status from dba_data_files;行号 TABLESPACE_NAME FILE_NAME STATUS
---------- --------------- ---------------------------------------- ---------
1 SYSTEM /home/dmdba/dbdata/dmdata/OMS/SYSTEM.DBF AVAILABLE
2 TEST /home/dmdba/dbdata/dmdata/TEST.DBF AVAILABLE
3 MAIN /home/dmdba/dbdata/dmdata/OMS/MAIN.DBF AVAILABLE
4 TEMP /home/dmdba/dbdata/dmdata/OMS/TEMP.DBF AVAILABLE
5 ROLL /home/dmdba/dbdata/dmdata/OMS/ROLL.DBF AVAILABLE已用时间: 85.315(毫秒). 执行号:14701
2.创建用户指定表空间并授权
SQL> create user test identified by test_1234 default tablespace test;
操作已执行
已用时间: 53.491(毫秒). 执行号:14702.
SQL> grant dba to test;
操作已执行
已用时间: 9.860(毫秒). 执行号:14703.
3.切换新用户创建表并插入数据
SQL> conn test/test_1234;服务器[LOCALHOST:5236]:处于普通打开状态
登录使用时间 : 9.534(ms)
SQL> create table test(id int, name varchar2(32));
操作已执行
已用时间: 21.311(毫秒). 执行号:14800.
SQL> insert into test values(1,'lilv');
影响行数 1已用时间: 1.581(毫秒). 执行号:14801.
SQL> commit;
操作已执行
已用时间: 2.377(毫秒). 执行号:14802.
SQL> select * from test;行号 ID NAME
---------- ----------- ----
1 1 lilv已用时间: 2.065(毫秒). 执行号:14803.
2.2、删除表空间数据文件
1.删除数据文件
dmdba@dmdsc01:~/dbdata/dmdata$ ls -lrth TEST.DBF
-rw-r--r-- 1 dmdba dinstall 32M 4月 26 00:43 TEST.DBF
dmdba@dmdsc01:~/dbdata/dmdata$ rm -rf TEST.DBF
dmdba@dmdsc01:~/dbdata/dmdata$ ls -lrth TEST.DBF
ls: 无法访问TEST.DBF: 没有那个文件或目录
2.验证
SQL> select * from test;行号 ID NAME
---------- ----------- ----
1 1 lilv已用时间: 0.761(毫秒). 执行号:14804.
SQL> call SP_FILE_SYS_CHECK();
DMSQL 过程已成功完成
已用时间: 1.216(毫秒). 执行号:14805.
SQL> select * from test;
select * from test;
[-3430]:表空间[TEST]中文件[/home/dmdba/dbdata/dmdata/TEST.DBF]已被删除.
已用时间: 0.912(毫秒). 执行号:0.
2.3、恢复表空间数据文件
1.执行准备恢复过程
SQL> call sp_tablespace_prepare_recover('TEST');
DMSQL 过程已成功完成
已用时间: 1.270(毫秒). 执行号:14807.
2.查看达梦进程,根据进程好查找被删除的文件,然后还原数据文件到原始目录
dmdba@dmdsc01:~/dmdbms/bin$ ps -ef|grep dmser
dmdba 1763 1 0 4月25 ? 00:01:10 /home/dmdba/dmdbms/bin/dmserver /home/dmdba/dbdata/dmdata/OMS/dm.ini -noconsole
dmdba 10574 4586 0 00:55 pts/1 00:00:00 grep dmser
dmdba@dmdsc01:~/dmdbms/bin$ ls /proc/17
17/ 170/ 1763/
dmdba@dmdsc01:~/dmdbms/bin$ ls /proc/1763/fd -l
总用量 0
lr-x------ 1 dmdba dinstall 64 4月 25 22:55 0 -> /dev/null
l-wx------ 1 dmdba dinstall 64 4月 25 22:55 1 -> /home/dmdba/dmdbms/log/DmServiceDMSERVER.log
lrwx------ 1 dmdba dinstall 64 4月 26 00:56 50 -> /home/dmdba/dbdata/dmdata/TEST.DBF (deleted)dmdba@dmdsc01:~/dmdbms/bin$ cp /proc/1763/fd/50 /home/dmdba/dbdata/dmdata/TEST.DBF
3.执行恢复过程并检查
SQL> call sp_tablespace_recover('TEST');
DMSQL 过程已成功完成
已用时间: 5.500(毫秒). 执行号:14808.
SQL> call SP_FILE_SYS_CHECK();
DMSQL 过程已成功完成
已用时间: 0.995(毫秒). 执行号:14809.
4.验证
SQL> select tablespace_name, file_name, status from dba_data_files;行号 TABLESPACE_NAME FILE_NAME STATUS
---------- --------------- ---------------------------------------- ---------
1 SYSTEM /home/dmdba/dbdata/dmdata/OMS/SYSTEM.DBF AVAILABLE
2 TEST /home/dmdba/dbdata/dmdata/TEST.DBF AVAILABLE
3 MAIN /home/dmdba/dbdata/dmdata/OMS/MAIN.DBF AVAILABLE
4 TEMP /home/dmdba/dbdata/dmdata/OMS/TEMP.DBF AVAILABLE
5 ROLL /home/dmdba/dbdata/dmdata/OMS/ROLL.DBF AVAILABLE已用时间: 27.772(毫秒). 执行号:14810.
SQL> select * from test;行号 ID NAME
---------- ----------- ----
1 1 lilv已用时间: 0.951(毫秒). 执行号:14811.