首页 > 数据库 >【数据库】数据恢复

【数据库】数据恢复

时间:2024-06-17 15:32:39浏览次数:23  
标签:数据恢复 force 数据库 undo commit 日志 redo

日志:先记日志后写数据库

  • 记日志----(出错)-----写数据库:数据库还没有被修改,数据库还是好的

  • 记日志 ----- 写数据库 ----(出错):数据库内的文件可能有问题,但日志是好的,可以根据日志恢复数据库

如果反过来 先写数据库再写日志,那么若 写数据库----(出错) ----记日志,这种情况数据库中数据可能有问题,但是又没有日志的记录,谁都不知道数据库中已经有错误了


恢复策略

正向扫描日志文件,若事务既有start,又有commit,需要redo;若只有start,需要undo。因此有两个队列:redo队列和undo队列

undo:反向扫描日志文件(从新到旧),用旧值覆盖新值

redo:正向扫描日志,新值覆盖旧值


各种各样的更新策略

steal:允许读一个未提交的数据

即时更新:只要数据有了修改,立马记日志,output到数据库中,注意此时并没有commit。此时数据库中的脏数据是可以被其他事务读取的。

即时更新既需要redo,又需要undo

若数据库中的数据被修改,但是执行该操作事务还没有commit,那么被修改的这些数据称为”脏数据“


no steal:不允许读一个未提交的数据(脏数据)

延迟更新:等到commit之后,再记日志,改数据库,因此不会有脏数据。


force:commit必须写在最后。即先日志,再数据库,最后commit

系统故障恢复时,若数据库采用force策略

  • 如果看到commit,说明是在commit之后出错的,而在此之前日志和数据库都已经同步了,因此什么都不用做
  • 没看到commit,当事务没发生过,做undo,把全部涉及的数据修改回事务start的状态。

因此,force策略只需要undo


no force:commit提前。只要日志写好了,就立马commit

系统故障恢复时,若数据库采用no force策略

  • 如果看到commit,说明日志是好的,做redo,把所有数据更新为新值
  • 没看到commit,说明此时还没开始修改数据库,数据库内的数据都是没问题的,什么都不用做

因此,no force策略只需要redo


采用检查点的恢复策略

① 将当前日志缓冲中的所有日志记录写入磁盘的日志文件上

② 在日志文件中写入一个检查点记录(checkpoint)

③ 将当前数据缓冲的所有数据记录写入磁盘的数据库中

④ 把检查点记录在日志文件中的地址写入一个重新开始文件

上述2、3两步可以互换,各有所长

如果第3步已经完成,那么说明日志和数据库都已经同步完成,当前这个检查点就是正确有效(可读档的),之后就可以从这个点开始恢复,之前的不用管

标签:数据恢复,force,数据库,undo,commit,日志,redo
From: https://www.cnblogs.com/laobei-uu/p/18252499

相关文章

  • EasyRecovery数据恢复软件电脑的超级救星,无论是误删除的文件、格式化的硬盘还是病毒攻
    EasyRecovery数据恢复软件,是我近期用过最神奇的产品之一了!它就像是电脑的超级救星,无论是误删除的文件、格式化的硬盘还是病毒攻击,都能轻松搞定!让我给大家详细介绍一下这个神器吧!EasyRecovery数据恢复软件的功能真的是非常强大!它可以扫描并恢复各种类型的文件,包括照片、视频、......
  • 国产最好用的EasyRecovery数据恢复软件2024中文电脑版下载
    EasyRecovery数据恢复软件,简直就是数据丢失者的救星!......
  • 如何解决c++使用mysql数据库读取中文输出时乱码问题
    使用vs写c++输出数据库中文时出现乱码设置utf-8还是不行这是数据库的内容这是输出:在网上找有说改成utf-8的格式,加入这样一句:mysql_query(conn,"setnamesutf8");效果就是这样:发现错误依旧,询问群友后修改,需要在连接数据库的函数中加入如下一句:mysql_query(conn,"set......
  • 绘制MySQL数据库的实体关系图(ERD)与逻辑模型图
    绘制MySQL的实体关系图(ERD,Entity-RelationshipDiagram)和数据库模型图对于理解和设计数据库结构非常重要。这些图表有助于可视化数据库中的表、列、关系以及约束。以下是一些步骤和工具,你可以使用它们来创建这些图表。步骤确定实体:首先,确定你的数据库中的实体(或称为表......
  • MySQL使用命令导出数据库
    MySQL自带了一个命令行工具mysqldump,可以方便的将数据导出至文件使用案例mysqldump-uroot-p数据库名称>xxx.sql#再输入密码即可#增加过滤条件mysqldump-uroot-p数据库名称表名称--where="id>1000">xxx.sql过滤条件#仅导出数据而不包含表结构--no-crea......
  • 【odoo | SQL】odoo使用sql语句操作数据库
    概要        Odoo的SQL指的是在Odoo框架内使用SQL语句直接操作数据库。这些操作通常是通过Odoo提供的数据库游标(self.env.cr)来执行的。虽然Odoo主要鼓励使用其ORM(对象关系映射)来进行数据库操作,因为ORM更安全、易维护且与Odoo的模型和视图系统深度集成,但在某些情况下,直......
  • Python 学习 第二册 第13章 数据库支持
    ----用教授的方法学习目录13.1Python 数据库 API 13.1.1 全局变量13.1.2 异常13.1.3 连接和游标13.1.4 类型13.2SQLite 和 PySQLite13.2.1 起步13.2.2 数据库应用程序示例13.1Python 数据库 API 为解决Python数据库模块存在的这种问题,人们一致同......
  • Oracle数据库ORA-12514错误消息
    引用:https://www.php.cn/faq/131370.htmlhttps://blog.csdn.net/arrowzz/article/details/17144653https://www.51969.com/post/18969077.htmlhttps://blog.csdn.net/yuan1164345228/article/details/115310827https://www.cnblogs.com/danghuijian/archive/2010/01/07/440......
  • 基于springboot的球队训练信息管理系统源码数据库
    传统办法管理信息首先需要花费的时间比较多,其次数据出错率比较高,而且对错误的数据进行更改也比较困难,最后,检索数据费事费力。因此,在计算机上安装球队训练信息管理系统软件来发挥其高效地信息处理的作用,可以规范信息管理流程,让管理工作可以系统化和程序化,同时,球队训练信息管理系......
  • 基于springboot的青年公寓服务平台源码数据库
    传统信息的管理大部分依赖于管理人员的手工登记与管理,然而,随着近些年信息技术的迅猛发展,让许多比较老套的信息管理模式进行了更新迭代,房屋信息因为其管理内容繁杂,管理数量繁多导致手工进行处理不能满足广大用户的需求,因此就应运而生出相应的青年公寓服务平台。本青年公寓服务......