注意:
仅用于测试环境,仅供参考。
一:问题说明:
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》