就不干开发

导航

< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5

统计

事务流程与介质恢复

事务生命周期
-->获取排他锁
-->重做数据存入PGA(进程程序的全局区)
-->获取复制锁和重做分配锁
-->获取重做日志分配空间
-->释放重做分配锁
-->重做日志缓冲区同步重做日志
-->释放重做复制锁
-->LGWR将重做日志缓冲区写入磁盘(注意:数据没有写入磁盘)
-->LGWR将重做日志缓冲区写入ORL(注意:事务写入磁盘但未提交)
-->到检查点时间,数据库缓冲区写入磁盘
 
在DBWR进程将数据库缓冲区写入磁盘前,LGWR进程必须将重做缓冲区写入磁盘。这个顺序由写前日志记录协议强制执行,协议要求:未记录到重做日志中的更改不能写入数据文件,该协议可保证:事务提交前如果出现故障可以撤销事务
事务提交时会分配一个SCN,并经历上述事务流程,commit是一个事务的结束
 
写后日志记录
写前日志记录的唯一例外是使用直接路径写入:直接路径加载或执行create table as select...语句
这些事务不是来自缓冲区,需要使用写后日志记录协议。但会生成重做数据,可以恢复
当移动高水位线的重做数据提交后,可以看到数据
在执行直接路径写入操作时可结合UNRECOVERABLE选项,实现无日志的需求。
缺陷
使用UNRECOVERABLE选项不会为事务生成重做数据,但会伟数据库字典表生成重做数据,并生成少量数据用于定义无效范围(开始快地址、SCN)
虽然这样有利于加载大量数据,但在dg环境有缺陷:当介质恢复遇到无效范围数据时,由于没有重做数据,数据块被标为soft-corrupt。备库会报错,如果执行介质恢复,主库会报相同错误
0
解决方案
主库:对UNRECOVERABLE模式加载的表空间文件进行查询
0
备库:检查无日志操作,如检测到可以执行托管恢复
0
托管恢复
备库
方式                  命令
-->停止重做数据            recover managed standby database cancel
-->对受影响的无日志文件脱机操作    alter database datafile 数据文件名 offline drop
-->重新应用重做数据          recover managed standby database disconnect
 
主库
-->用RMAN备份受影响的数据文件
-->停止应用重做数据          recover managed standby database cancel
-->对脱机的数据文件重新联机      alter database datafile 数据文件名 online
-->重新应用重做数据          recover managed standby database disconnect

posted on   专注运维20年  阅读(28)  评论(0编辑  收藏  举报

相关博文:
阅读排行:
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· 什么是nginx的强缓存和协商缓存
· 一文读懂知识蒸馏
· Manus爆火,是硬核还是营销?
点击右上角即可分享
微信分享提示