达梦数据库文件误删的修复

数据库有一些重要的文件如控制文件,redo, 回滚段undo, temp,表空间数据文件,有时因为在操作系统误操作或者是存储等原因导致文件损坏,如果没有前期安装主从同步的容灾方案,那这类异常恢复还是有一些需求,同时伴随高风险,在oracle数据库有较多的技术像重建ctl,推scn, 隐藏参数非一致open resetlogs, bbed, dul/odu等异常修复手段,达梦中如果出现记录几种常见修复。

达梦v8

1, 数据文件

如果有备份当然推荐使用备份恢复

dmrman
RESTORE DATABASE '/dm8/data/DAMENG/dm.ini' TABLESPACE MAIN FROM BACKUPSET '/dm8/backup/fullbak_2
RECOVER DATABASE '/dm8/data/DAMENG/dm.ini' TABLESPACE MAIN;

如果是system表空间,需要做全库恢复

dminit path=/dm8/data/
RESTORE DATABASE '/dm8/data/DAMENG/dm.ini' FROM BACKUPSET '/dm8/backup/fullbak_20241126_002';
RECOVER DATABASE '/dm8/data/DAMENG/dm.ini' FROM BACKUPSET '/dm8/backup/fullbak_20241126_002';
RECOVER DATABASE '/dm8/data/DAMENG/dm.ini' UPDATE DB_MAGIC;

如果没有备份,可使用Linux操作系统未释放的文件句柄,(oracle中也可以使用该手段)

1、 表空间失效⽂件恢复准备
SP_TABLESPACE_PREPARE_RECOVER('DMHR');

2、 查找dmserver 进程号
ps -ef|grep dmserver
dmdba 1798 1 0 09:14 ? 00:00:05 /dm8/dmdbms/bin/dmserver path=/dm8/data/DAME

3、 查看进程⽬录下的⽂件
ll /proc/1798/fd

4、 还原⽂件
cp -p /proc/1798/fd/17 /dm8/data/DAMENG/DMHR.DBF

5、 修复表空间⽂件
SP_TABLESPACE_RECOVER('DMHR');

6、验证
SELECT count(*) FROM DMHR.EMPLOYEE;

数据文件复制的前后需要使用 SP_TABLESPACE_PREPARE_RECOVER和 SP_TABLESPACE_RECOVER(表空间名称)完成表空间失效⽂件的恢复。

2, undo roll

同样,可使用备份恢复

dmrman
RESTORE DATABASE '/dm8/data/DAMENG/dm.ini' TABLESPACE ROLL FROM BACKUPSET '/dm8/backup/fullbak_2
RECOVER DATABASE '/dm8/data/DAMENG/dm.ini' TABLESPACE ROLL;

如果没有备份

使⽤其他数据库的ROLL⽂件冒充误删除的⽂件,同时修改 dm.ini 参数 PSEG_RECV 为 0,跳过启动时的undo 一致性验证。

PSEG_RECV参数:

  • 0:跳过回滚活动事务和 PURGE 已经提交事务的步骤。
  • 1:回滚活动事务并 PURGE 已经提交事务;
  • 2:延迟 PURGE 已提交事务,延迟回滚活动事务;
  • 3:回滚活动事务,延迟 PURGE 已提交事务。

3, redo

redo损坏,也是需要全库恢复,同上面的system表空间删除

如果没有备份,可尝试使⽤没损坏的redo⽂件或使⽤新建相同配置数据库的redo⽂件冒充,通常要⽤dmmdf⼯具修改db_magic、pemnt_magic等非常规手段修复。

4, 控制文件

到ctl_bak⽬录,找到时间最近的备份,名称改为dm.ctl即可

5, temp临时文件

重启数据库后会重新⽣成TEMP.DBF⽂件

Leave a Comment