达梦数据库DM8表空间数据文件被人为误删除恢复方法
1. 创建示例表空间
create tablespace TBS_DATA_N datafile '/dm8/dmdbms/data/dm02/TBS_DATA_01.DBF' size 128 autoextend on next 4 maxsize 1024;
alter tablespace TBS_DATA_N add datafile '/dm8/dmdbms/data/dm02/TBS_DATA_02.DBF' size 128;
alter tablespace TBS_DATA_N add datafile '/dm8/dmdbms/data/dm02/TBS_DATA_03.DBF' size 128 autoextend on next 4 maxsize 1024;
SQL> select tablespace_name,file_name,autoextensible from dba_data_files;
行号 TABLESPACE_NAME FILE_NAME AUTOEXTENSIBLE
---------- --------------- -------------------------------------- --------------
1 SYSTEM /dm8/dmdbms/data/dm02/SYSTEM.DBF YES
2 TBS_DATA1 /dm8/dmdbms/data/dm02/TBS_DATA1_01.DBF YES
3 TBS_DATA_N /dm8/dmdbms/data/dm02/TBS_DATA_03.DBF YES
4 TBS_DATA_N /dm8/dmdbms/data/dm02/TBS_DATA_02.DBF YES
5 TBS_DATA_N /dm8/dmdbms/data/dm02/TBS_DATA_01.DBF YES
6 MAIN /dm8/dmdbms/data/dm02/MAIN.DBF YES
7 TEMP /dm8/dmdbms/data/dm02/TEMP.DBF YES
8 ROLL /dm8/dmdbms/data/dm02/ROLL.DBF YES
8 rows got
已用时间: 1.456(毫秒). 执行号:1105.
2. 表空间的备份
SQL> backup tablespace TBS_DATA_N backupset 'tablespace_TBS_DATA_N_bak_01';
3. 表空间恢复
方法1:通过操作系统恢复
1)创建一张表
create table tb1 tablespace TBS_DATA_N as select * from dba_users;
SQL> create table tb1 tablespace TBS_DATA_N as select * from dba_users;
操作已执行
已用时间: 14.160(毫秒). 执行号:1121.
SQL> select username,account_status from tb1;
行号 USERNAME ACCOUNT_STATUS
---------- ------------ --------------
1 SYSAUDITOR OPEN
2 SYSSSO OPEN
3 SYSDBA OPEN
4 DMETL_SAMPLE OPEN
5 SYS OPEN
已用时间: 0.436(毫秒). 执行号:1122.
SQL>
2)删除表空间的数据文件
--对数据文件有效性进行验证:
SQL> sp_file_sys_check();
-- 再次查询tb1表报错数据文件被删除
SQL> select username,account_status from tb1;
3)通过 linux 句柄进行删除文件恢复。
SQL> SP_TABLESPACE_PREPARE_RECOVER('TBS_DATA_N');
DMSQL 过程已成功完成
已用时间: 0.486(毫秒). 执行号:1126.
SQL> exit
--- 通过ps命令找到进程号17292,在/proc中找到对应的被删除的数据文件
--- 操作系统层面cp 被删除的文件至 原目录
cp /proc/17292/fd/48 /dm8/dmdbms/data/dm02/datafile/TBS_DATA_02.DBF
cp /proc/17292/fd/49 /dm8/dmdbms/data/dm02/TBS_DATA_03.DBF
--- recover表空间并检查数据文件一致性
SQL> SP_TABLESPACE_RECOVER('TBS_DATA_N');
SQL> SP_FILE_SYS_CHECK();
--- 表tb1的信息可以查到了
---检查操作系统层面数据文件DBF已经恢复
方法2:通过dmrman进行恢复
1)关闭数据服务
[dmdba@dmdb ]$ /dm8/dmdbms/bin/DmServicedm02 stop
Stopping DmServicedm02: [ OK ]
[dmdba@dmdb ]$
2)启动DMRMAN进行恢复
/dm8/dmdbms/bin/dmrman CTLSTMT="RESTORE DATABASE '/dm8/dmdbms/data/dm02/dm.ini' tablespace TBS_DATA_N FROM BACKUPSET '/dm8/dmdbms/data/dm02/bak/tablespace_TBS_DATA_N_bak_01'"
/dm8/dmdbms/bin/dmrman CTLSTMT="RECOVER DATABASE '/dm8/dmdbms/data/dm02/dm.ini' tablespace TBS_DATA_N WITH ARCHIVEDIR '/dm8/dmdbms/data/dm02/arch'"
3)启动数据库服务
[dmdba@dmdb02 ~]$ /dm8/dmdbms/bin/DmServicedm02 start
Starting DmServicedm02: [ OK ]
[dmdba@dmdb02 ~]$
4)验证tb1数据
SQL> select username,account_status from tb1;
行号 USERNAME ACCOUNT_STATUS
---------- ------------ --------------
1 SYSAUDITOR OPEN
2 SYSSSO OPEN
3 SYSDBA OPEN
4 DMETL_SAMPLE OPEN
5 SYS OPEN
已用时间: 2.840(毫秒). 执行号:500.
SQL>
方法3:通过DM控制台工具进行恢复
1)关闭数据服务
[dmdba@dmdb ]$ /dm8/dmdbms/bin/DmServicedm02 stop
Stopping DmServicedm02: [ OK ]
[dmdba@dmdb ]$
2)启动console控制台工具
3)启动数据库服务
4)检查tb1表信息
达梦数据库社区地址:https://eco.dameng.com/