undo 回滚段,REDO,日志,SCN,DBWRIT,恢复,CHECKPIONT

本文深入解析Oracle数据库实例恢复过程中的关键步骤,包括如何利用REDO日志和UNDO表空间数据进行实例恢复,确保数据库的一致性和完整性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

话说实例恢复的时候需要用到UNDO里的数据,对此有些不明白. 既然有日志还需要UNDO表空间的数据,这对数据库只需要日志来恢复来说讽刺意义吗?


还说 REDO也保护了UNDO段的数据. 生成某个条目. 最后写到日志文件中. 写日志文件是根据3个条件去写的, 也就是说有些事务没提交也被写进了日志文件.


日志文件写满了要进行切换要激发CHECKPOING的进程. 要搞清楚ORACLE内存关系和机制还是蛮难的.


第一 回滚段存放在UNDO表空间里的数据文件中.

第二 要修改某个数据,必须把此数据所在数据文件的数据块 读到 内存中SGA里的BUFFER CACHE中.

第三 UPDATE此数据块的数据前, 要向回滚段申请数据块,  就是向回滚段的UNDO文件获得地址,并把该地址读到内存中

第四  把要UPDATE的数据块的前期影像  放到回滚段所在内存中的数据块.    (不太清楚这个前期影像 只的是数据记录还是数据块)

第五  回滚段数据块的值  假设原来是空的, 现在变成了 5 . 那么就要生成一条 REDO记录  有的说是矢量或者是条目 中文解释太烂了

第六 把要修改的数据块中的记录 更新成新值为3,同时产生一条REDO 记录.


第七 该事务 未提交 .  REDO BUF保存了该UPDATE行为的两条REDO记录 分别是 数据块和回滚段的改变量.

第八 REDO 写进日志文件.

第九 DBWRIT 没有写脏数据到数据文中

第十  没有发生CHECKPION事件.


第11 断电   丢失了部分REDO BUF的事务.

第12  启动进行实例恢复

第13  恢复根据日志文件的 CHECKPOINT 点以后的日志  重新做一遍  也就是执行一遍 INSERT  然后UPDATE

我们对UPDATE语句要修改的记录以前的值 不确定是多少,  通过日志重做 对应的回滚块插入值为 5  在内存中把数据文件的值UPDATE 成3

这样 现场得到了恢复.

第14  对已经提交的事务 进行提交,  对未提交的事务 进行回滚. 就是把数据文件块中的3值 改回成5. 


最后 实例恢复并不需要UNDO表空间的数据,只需要相应的数据块地址  也就是数据块对象. 毕竟UNDO和回滚段 旧值会被覆盖的.





评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值