达梦数据库---误删文件或数据的处理

一、 误删数据

        1.  误删前闪回处于开启

    可以依靠回滚段进行闪回查询到被删除的数据。( truncate drop 除外)

       开启闪回 / 设置保持时间:

alter system set 'ENABLE_FLASHBACK' = 1 both;
alter system set 'UNDO_RETENTION' = 3600 both;--(单位S)

    查询是否开启闪回:

select name,value from v$parameter where name in ('ENABLE_FLASHBACK','UNDO_RETENTION');

    开启且在保持时间内 , 执行查询语句 :

select * from table_name when timestamp '20220426 19:00:00';/ sysdate-10/1440

2.  误删前有备份和开启归档

      可以初始化一个新实例,将新实例恢复至删除前时间点。

    ① 初始化一个和故障实例参数一致的 实例

./dminit path=新实例目录

    ② 通过备份 +归档还原

打开RMAN:
RMAN> RESTORE DATABASE '新实例DM.INI目录' FROM BACKUPSET '备份目录';
RMAN> RECOVER DATABASE '新实例DM.INI目录' with archivedir '归档目录' UNTIL time '恢复时间点';
RMAN> recover database '新实例DM.INI目录' update db_magic

   若误操作数据很少,可以使用 DBMS_LOGMNR 对数据库归档日志进行挖掘,重构 操作 ,前提是 开启了在日志中记录逻辑操作 1,2,3 ),查询语句如下。

select para_name,para_value from v$dm_ini where para_name in ('RLOG_APPEND_LOGIC');

   

    ① 查询归档信息,拿到 name

select sequence# seq, name , to_char(first_time,'yyyy-mm-dd hh24:mi:ss') 
first_time, to_char(next_time,'yyyy-mm-dd hh24:mi:ss') next_time, 
first_change# , next_change#  from v$archived_log;

    若操作时间段的 redo未归档,需要手动切换日志

alter system archive log current;

    ② 向系统包中添加日志文件 (一次性可以添加多个,可以在V$LOGMNR_LOGS中查询信息)

DBMS_LOGMNR.ADD_LOGFILE('&name');

    ③ 启动归档日志文件分析

DBMS_LOGMNR.START_LOGMNR(OPTIONS=>2128,STARTTIME=>TO_DATE(‘2022-04-01 00:00:00’,‘YYYY-MM-DD HH24:MI:SS’),
ENDTIME=>TO_DATE(‘2022-04-01 12:00:00’,‘YYYY-MM-DD HH24:MI:SS’));--还可以指定START_SCN,END_SCN等参数

 

    ④ 查看分析结果

SELECT OPERATION_CODE,OPERATION,SCN,SQL_REDO,TIMESTAMP ,SEG_OWNER, TABLE_NAME 
FROM V$LOGMNR_CONTENTS WHERE TABLE_NAME ='T_TEST3' and OPERATION='UPDATE';

    ⑤ 终止归档日志文件分析

DBMS_LOGMNR.END_LOGMNR();

3.  无备份和开启归档,未开启闪回

        正常手段无法 恢复。

二、 实例参数文件:

记录了数据库服务器的各种功能和性能选项,参数属性分为三种:静态、动态和手动。路径为实例的安装目录下,名称为 DM.INI 。丢失或损坏的情况下会如下报错:

解决办法:初始化一个和故障实例参数一致的 实例,将 DM.INI 拷贝到故障实例目录下,修改相关的 PATH 和端口信息等。

              

三、 控制文件:

记录了数据库的初始信息(数据库名称、 OGUID 唯一标识、表空间信息等)的二进制文件 ,路径为实例的安装目录下,名称为 DM.CTL 。可以通过 dmctlcvt 工具将二进制的文件转化成文本文件。

数据库运行过程中误删控制文件或控制文件损坏不会影响实例服务运行,不过不能操作更改控制文件的相关操作,如创建表空间,会报错 ‘控制文件错误’。达梦数据库有自动备份控制文件的策略,控制文件备份的路径默认是在数据目录下的 ctl_bak 目录下,也可以通过查看 dm.ini 中的 CTL_BAK_PATH 参数来确认控制文件备份路径,如下图,只要将最新的控制文件把它拷贝到数据目录下并重命名为 dm.ctl 即可正常启动数据库。

    

四、 联机重做日志:

包含了所有物理数据页的修改内容,路径为实例的安装目录下,名称为 DAMENG01.log/DAMENG02.log 。可以通过语句 select * from v$rlogfile; 查看日志信息。丢失或损坏的情况下,数据库可以正常运行,不过存在风险。

1.  运作中发现丢失,此时应该立即逻辑导出,然后新建实例在逻辑导入。

    ① 通过逻辑导出数据

        ./dexp   USERID=SYSDBA/SYSDBA   FILE=FULL_DB . dmp FULL=Y DIRECTORY= ...

    ② 初始化一个和故障实例参数一致的 实例

初始 化时的参数可查看 dminit###.log文件(###为八位日期+6位流水)

./dminit path= 新实例目录  

    ③ 通过逻辑导入数据

./dimp SYSDBA/SYSDBA@192.168.112.128:5237 FULL='Y' FILE=' ... /FULL_DB . dmp'

    服务已经关闭:

2.  是否开启归档且有备份

    使用 “备份 + 归档”还原一个新实例,不存在数据丢失的可能。

3.  无归档和备份

        只能替换 REDO 日志启动数据库,为不完全恢复,可能会有数据丢失的可能。

    ① 初始化一个和故障实例参数一致的实例,正常启动、停止一次

    ② 查看故障实例的 db_magic值(数据库魔数)和pemnt_magic值(数据库永久魔数)

                    ./dmmdf type=1 file=/home/dmdba/dmdbms/data/DAMENG/SYSTEM.DBF

  

    ③ 修改新实例的 db_magic值和pemnt_magic值

          ./dmmdf type=2 file=/home/dmdba/dmdbms/data/DAMENG02/DAMENG0201.log

                  ./dmmdf type=2 file=/home/dmdba/dmdbms/data/DAMENG02/DAMENG0202.log

    ④ 将修改后的 日志文件 拷贝到 故障 库, 然后 启动数据库

          ./dmserver /home/dmdba/dmdbms/data/DAMENG/dm.ini

    ⑤ 启动成功后,进行一次全备。

 

五、 用户数据文件:

用户创建的业务相关的数据文件 ( 包含 main.dbf) 数据库运行过程中误删用户数据文件损坏不会影响实例服务运行。

1.  误删后未停止数据库服务

  通过逻辑导出数据

        ./dexp USERID=SYSDBA/SYSDBA   FILE=FULL_DB . dmp FULL=Y DIRECTORY= ...

  初始化一个和故障实例参数一致的 实例

初始 化时的参数可查看 dminit###.log文件(###为八位日期+6位流水)

./dminit path= 新实例目录  

   通过逻辑导入数据

./dimp SYSDBA/SYSDBA@192.168.112.128:5237 FULL='Y' FILE=' ... /FULL_DB . dmp'

2.  误删前已开启归档且有备份

使用 “备份 + 归档”还原一个新实例,不存在数据丢失的可能。

初始化一个和故障实例参数一致的 实例

./dminit path= 新实例目录

通过备份 +归档还原

打开 RMAN

RMAN> RESTORE DATABASE ' 新实例 DM.INI 目录 ' FROM BACKUPSET ' 备份目录 ';

RMAN> RECOVER  DATABASE ' 新实例 DM.INI 目录 ' with archivedir ' 归档目录 ' UNTIL time ' 恢复时间点 ';

RMAN> recover database ' 新实例 DM.INI 目录 ' update db_magic


3.  误删前无归档无备份

这种情况下数据已经确定无法恢复,只能尽可能保存其他数据,此时可以通过修改控制文件让数据库服务启动,之后再进行备份、还原等操作。

①  通过 dmctlcvt 工具将控制文件转换为可读文件

./dmctlcvt TYPE=1 SRC= 控制文件 dm.ctl 目录  DEST= 转换的可读文件保存目录

②  修改可读文件,将被删除的数据文件的 fil_path 目录的一行记录删除即可,如下图。


③  通过 dmctlcvt 工具将控制文件转换为二进制文件。

./dmctlcvt TYPE=2 SRC= 转换的可读文件保存目录  DEST= 控制文件 dm.ctl 目录

④  重新启动数据库进行逻辑备份。

此时控制文件会被自动补全 fil_path (补全机制尚未明确,现象是取之上面最近的一个 fil_path , 原该数据文件下的表数据会缺失或错误。

 

六、 ROLL.DBF

用于保存系统的回滚记录 , 提供事务回滚时的信息。回滚文件整个是一个段。每个事务的回滚页在回滚段中各自挂链 , 页内则顺序存放回滚记录


同上述的用户数据文件的操作。差异在于无法恢复时,可以选择跳过回滚段 PURG 的操作启动数据库,修改 dm.ini 参数 PSEG_RECV 0

若启动不了,则进行 ROLL 的替换:初始化 和故障实例参数一致的 实例, 最好将 ROLL 文件大小调整到源库之前一致,然后拷贝到故障库即可。

七、 密钥文件:

dm_service.prikey 是达梦数据库密钥文件,删除后数据不会丢失,此时数据库无法启动。

可以初始化一个新的实例,将新实例的 dm_service.prikey 拷贝到故障实例数据目录下,数据库就能启动。

 

 

                更多信息请登录社区地址:https://eco.dameng.com

请使用浏览器的分享功能分享到微信等