Oracle的CURRENT REDO丢失,数据丢失风险分析

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

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 varchstatus;未选定行已用时间:0.809(毫秒).执行号:604.SQL>ALTERDATABASEMOUNT;操作已执行已用时间:2.126(毫秒).执行号:0.SQL>ALTERDATABASEARCHIVELOG;操作已执行已用时间:7.726(毫秒).执行号:0.SQL>ALTERDATABASEADDARCHIVELOG′DEST=/dm8/arch,TYPE=LOCAL,FILESIZE=200,SPACELIMIT=10240′;操作已执行已用时间:1.377(毫秒).执行号:0.SQL>ALTERDATABASEOPEN;操作已执行已用时间:10.472(毫秒).执行号:0.SQL>Select∗fromvarch_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 varchstatus;未选定行已用时间:0.809(毫秒).执行号:604.SQL>ALTERDATABASEMOUNT;操作已执行已用时间:2.126(毫秒).执行号:0.SQL>ALTERDATABASEARCHIVELOG;操作已执行已用时间:7.726(毫秒).执行号:0.SQL>ALTERDATABASEADDARCHIVELOG′DEST=/dm8/arch,TYPE=LOCAL,FILESIZE=200,SPACELIMIT=10240′;操作已执行已用时间:1.377(毫秒).执行号:0.SQL>ALTERDATABASEOPEN;操作已执行已用时间:10.472(毫秒).执行号:0.SQL>Select∗fromvarch_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:49fil_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:49fil_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/sCost:00:00:53Remaining: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

EP0's cur_lsn770990721, file_lsn770990721 Percent:100.00%Speed:0.00PKG/sCost:00:00:00Remaining: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

EP0's cur_lsn770996956, file_lsn770996956

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.里写自定义目录标题)

quenceDiagram.html

相关推荐
喵了几个咪2 小时前
选择第三方IAM还是自建权限体系?中小型后台系统权限架构决策指南
数据库·oracle·架构
Elastic 中国社区官方博客3 小时前
Kibana:使用 AI Chat 及 MCP 轻松创建 AI 原生仪表板
大数据·数据库·人工智能·elasticsearch·搜索引擎·ai·信息可视化
杨云龙UP3 小时前
Oracle Health Check巡检脚本使用SOP V2.0:从HTML原始报告→生成Word专业巡检报告→交付客户_2026-06-03
linux·运维·数据库·sql·oracle·报告·巡检
Database_Cool_4 小时前
Hudi 湖仓一体架构:阿里云 AnalyticDB MySQL 原生集成最佳实践
数据库·mysql·阿里云
我是一颗柠檬4 小时前
【Redis】发布订阅与消息队列Day8(2026年)
数据库·redis·后端·缓存
sukioe4 小时前
Redis 持久化+高可用详解:RDB/AOF/混合/主从/哨兵/集群
数据库·redis·缓存
全栈软件开发4 小时前
祈福导航系统V1.1更新 优化后端控制逻辑和前台UI
数据库·祈福导航系统
_qingche5 小时前
H2 数据库到 MySQL 数据迁移
java·数据库·spring boot·mysql·spring·重构·kotlin
AOwhisky5 小时前
MySQL 学习笔记(第一期):数据库基础与 MySQL 初探
运维·数据库·笔记·学习·mysql·云计算