为什么Oracle的CURRENT REDO丢失,会有数据丢失风险,而达梦数据库没这个问题呢?

注意:

仅用于测试环境,仅供参考。

一:问题说明:

Oracle数据库 和 达梦数据库,每天都有定时物理备份,如果分别将Oracle和达梦的所有REDO LOG FILE删除,并关闭实例,为什么Oracle有数据丢失风险,而达梦没有?

二:原因分析:

因为Oracle和达梦在 REDO、归档 处理机制上有根本区别:
达梦数据库:采用“边写边归档”的策略,日志在写入在线日志的同时,也被实时写入归档日志。
Oracle数据库:采用“写满切换再归档”的策略,归档完全依赖于在线日志文件成功切换,是异步进行的。

这就导致了:
达梦:归档日志包含至故障发生前最后一刻的所有事务,可实现零数据丢失。
Oracle:当前在线日志文件损坏,其内容直接丢失,其中记录的所有事务数据永 久丢失。

三:实验验证:

1.达梦数据库启动归档:

SQL> select PARA_NAME,PARA_VALUE,DEFAULT_VALUE from v$dm_ini where para_name LIKE '%ARCH_INI%';
行号     PARA_NAME PARA_VALUE DEFAULT_VALUE
---------- --------- ---------- -------------
1          ARCH_INI  0          0
已用时间: 7.122(毫秒). 执行号:603.
SQL> Select * from v$arch_status;
未选定行
已用时间: 0.809(毫秒). 执行号:604.
SQL> ALTER DATABASE MOUNT;
操作已执行
已用时间: 2.126(毫秒). 执行号:0.
SQL> ALTER DATABASE ARCHIVELOG;
操作已执行
已用时间: 7.726(毫秒). 执行号:0.
SQL> ALTER DATABASE ADD ARCHIVELOG 'DEST=/dm8/arch, TYPE=LOCAL, FILE_SIZE=200, SPACE_LIMIT=10240';
操作已执行
已用时间: 1.377(毫秒). 执行号:0.
SQL> ALTER DATABASE OPEN;
操作已执行
已用时间: 10.472(毫秒). 执行号:0.
SQL> Select * from v$arch_status;
行号     ARCH_TYPE ARCH_DEST ARCH_STATUS ARCH_SRC
---------- --------- --------- ----------- --------
1          LOCAL     /dm8/arch VALID       CJC
已用时间: 1.014(毫秒). 执行号:605.

2.检查REDO信息:

SQL> select GROUP_ID,FILE_ID,PATH from v$rlogfile;
行号     GROUP_ID    FILE_ID     PATH                   
---------- ----------- ----------- -----------------------
1          2           0           /dm8/redo/dm_redo01.log
2          2           1           /dm8/redo/dm_redo02.log
已用时间: 1.034(毫秒). 执行号:601.
SQL> host ls -lrth /dm8/redo/
total 512M
-rw-r--r-- 1 dmdba dinstall 256M May 22 10:19 dm_redo02.log
-rw-r--r-- 1 dmdba dinstall 256M May 22 10:58 dm_redo01.log

3.备份数据库

启动DMAP

[root@cjc-db-11 ~]# /dm8/dbms/bin/service_template/DmAPService start
Starting DmAPService: Last login: Fri May 22 10:59:21 CST 2026 on pts/2
                                                           [ OK ]

备份:

SQL> backup database backupset '/dm8/bak/full/20260522';
操作已执行
已用时间: 00:02:39.236. 执行号:615.

4.创建测试数据

SQL> create table cjc.t0522(id int,name varchar(10));
操作已执行
已用时间: 8.151(毫秒). 执行号:616.
SQL> insert into cjc.t0522 values(1,'x');
影响行数 1
已用时间: 0.868(毫秒). 执行号:617.
SQL> commit;
操作已执行
已用时间: 1.036(毫秒). 执行号:618.
SQL> select * from cjc.t0522;
行号     id          name
---------- ----------- ----
1          1           x
已用时间: 0.897(毫秒). 执行号:619.

5.模拟误删除

[dmdba@cjc-db-11 redo]$ ls -lrth
total 512M
-rw-r--r-- 1 dmdba dinstall 256M May 22 10:19 dm_redo02.log
-rw-r--r-- 1 dmdba dinstall 256M May 22 14:30 dm_redo01.log
[dmdba@cjc-db-11 redo]$ rm -f dm_redo0*.log

6.影响范围

短时间内,还可以正常读写数据。

SQL> select * from cjc.t0522;
行号     id          name
---------- ----------- ----
1          1           x
已用时间: 0.897(毫秒). 执行号:619.
SQL> select * from cjc.t0522;
行号     id          name
---------- ----------- ----
1          1           x
已用时间: 0.527(毫秒). 执行号:620.
SQL> insert into cjc.t0522 values(2,'y');
影响行数 1
已用时间: 0.517(毫秒). 执行号:621.
SQL> commit; 
操作已执行
已用时间: 1.017(毫秒). 执行号:622.
SQL> select * from cjc.t0522;
行号     id          name
---------- ----------- ----
1          1           x
2          2           y
已用时间: 0.293(毫秒). 执行号:623.

检查文件

SQL> sp_file_sys_check();
DMSQL 过程已成功完成
已用时间: 4.271(毫秒). 执行号:624.

告警日志:

2026-05-22 14:32:56.335 [ERROR] database P0000002785 T0000000000000003338  [EID:49]fil_sys check file [/dm8/redo/dm_redo01.log] fail, Can't find file
2026-05-22 14:32:56.335 [ERROR] database P0000002785 T0000000000000003338  [EID:49]fil_sys check file [/dm8/redo/dm_redo02.log] fail, Can't find file

此时仍然可以读写数据

SQL> select * from cjc.t0522;
行号     id          name
---------- ----------- ----
1          1           x
2          2           y
已用时间: 0.264(毫秒). 执行号:626.
SQL> insert into cjc.t0522 values(3,'z');
影响行数 1
已用时间: 0.530(毫秒). 执行号:627.
SQL> commit;
操作已执行
已用时间: 1.081(毫秒). 执行号:628.
SQL> select * from cjc.t0522;
行号     id          name
---------- ----------- ----
1          1           x
2          2           y
3          3           z
已用时间: 0.311(毫秒). 执行号:629.

如果实例没有关闭,可以使用文件句柄进行恢复:

[dmdba@cjc-db-11 redo]$ ps -ef|grep dms|grep -v grep
dmdba     2785     1  0 12:08 pts/0    00:00:10 /dm8/dbms/bin/dmserver path=/dm8/data/CJC/dm.ini -noconsole
[dmdba@cjc-db-11 redo]$ ls -lrth /proc/2785/fd|grep dele
lrwx------ 1 dmdba dinstall 64 May 22 10:19 9 -> /dm8/redo/dm_redo02.log (delted)
lrwx------ 1 dmdba dinstall 64 May 22 10:19 8 -> /dm8/redo/dm_redo01.log (delted)

本次主要讲解,实例已经关闭,并且无法启动,通过备份进行恢复

关闭数据库

SQL> shutdown immediate;
操作已执行
已用时间: 1.038(毫秒). 执行号:0.

启动数据库,启动失败

[dmdba@cjc-db-11 ~]$ DmServiceCJC start
Starting DmServiceCJC:                                     [ FAILED ]

后台报错:

026-05-22 14:38:16.108 [FATAL] database P0000005274 T0000000000000005274  /dm8/redo/dm_redo01.log not exist,can not startup

7.恢复:

覆盖前,备份

[dmdba@cjc-db-11 dm8]$ cp -r data/ data_bak

还原

RMAN> restore database '/dm8/data/CJC/dm.ini' from backupset '/dm8/bak/full/20260522';
restore database '/dm8/data/CJC/dm.ini' from backupset '/dm8/bak/full/20260522';
Normal of FAST
Normal of DEFAULT
Normal of RECYCLE
Normal of KEEP
Normal of ROLL                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                      [Percent:100.00%][Speed:0.00M/s][Cost:00:00:53][Remaining:00:00:00]
restore successfully.
time used: 00:00:53.936

可以看到 restore database会将redo文件还原回来,也就是达梦的backup database会备份redo log file:

[dmdba@cjc-db-11 ~]$ ls -lrth /dm8/redo/
total 512M
-rw-r--r-- 1 dmdba dinstall 256M May 22 15:12 dm_redo01.log
-rw-r--r-- 1 dmdba dinstall 256M May 22 15:12 dm_redo02.log

8.恢复,这里是完全恢复,和Oracle不同:

RMAN> recover database '/dm8/data/CJC/dm.ini' with archivedir '/dm8/arch';
recover database '/dm8/data/CJC/dm.ini' with archivedir '/dm8/arch';
Database mode = 2, oguid = 0
Normal of FAST
Normal of DEFAULT
Normal of RECYCLE
Normal of KEEP
Normal of ROLL
EP[0]'s cur_lsn[770990721], file_lsn[770990721]                                                                                                                                                                                                               [Percent:100.00%][Speed:0.00PKG/s][Cost:00:00:00][Remaining:00:00:00]
recover successfully!
time used: 655.023(ms)

更新db_magic:

RMAN> recover database '/dm8/data/CJC/dm.ini' update db_magic;
recover database '/dm8/data/CJC/dm.ini' update db_magic;
Database mode = 2, oguid = 0
Normal of FAST
Normal of DEFAULT
Normal of RECYCLE
Normal of KEEP
Normal of ROLL
EP[0]'s cur_lsn[770996956], file_lsn[770996956]
recover successfully!
time used: 00:00:01.181

9.启动数据库:启动成功

[dmdba@cjc-db-11 ~]$ DmServiceCJC start
Starting DmServiceCJC:                                     [ OK ]

10.检查数据:数据没有丢失

[dmdba@cjc-db-11 ~]$ sh conn.sh 
服务器[LOCALHOST:5238]:处于普通打开状态
登录使用时间 : 6.457(ms)
disql V8
SQL> select * from cjc.t0522;
行号     id          name
---------- ----------- ----
1          1           x
2          2           y
3          3           z
已用时间: 1.297(毫秒). 执行号:501.

欢迎关注我的公众号《 IT小Chen

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