用日志文件恢复事务的过程

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了用日志文件恢复事务的过程相关的知识,希望对你有一定的参考价值。

  日志文件恢复事务前提条件:
  备份必须按照其创建顺序进行恢复。 在恢复特定的事务日志备份之前,必须先还原下列以前备份,而不回滚未提交的事务,即 WITH NORECOVERY。
  日志文件恢复事务步骤:
  1、连接到相应的 Microsoft SQL Server 数据库引擎实例之后,在对象资源管理器中,单击服务器名称以展开服务器树;
  2、展开“数据库”,然后根据数据库的不同,选择用户数据库,或展开“系统数据库”,再选择系统数据库;
  3、右键单击该数据库,指向“任务”,再指向“还原”,然后单击“事务日志”,这将打开“还原事务日志”对话框;
  4、在“常规”页上的“数据库”列表框中,选择数据库名称。 仅列出处于还原状态的数据库;
  5、若要指定要还原的备份集的源和位置,请单击以下选项之一:
  ①从数据库以前的备份
  从下拉列表中选择要还原的数据库。 此列表仅包含已根据 msdb 备份历史记录进行备份的数据库;
  ②从文件或磁带
  单击浏览 (...) 按钮以打开“选择备份设备”对话框。 在“备份介质类型”框中,从列出的设备类型中选择一种。 若要为“备份介质”框选择一个或多个设备,请单击“添加”。
  将所需设备添加到“备份介质”列表框后,单击“确定”返回到“常规”页;
  6、在“选择要还原的事务日志备份”网格中,选择要还原的备份。 此网格列出了选定数据库可以使用的事务日志备份。只有在日志备份的“第一个 LSN”大于数据库的“最后一个 LSN”时,此日志备份才可用。日志备份按照它们所包含的日志序列号 (LSN) 的顺序排列,并且也必须按照这种顺序还原;
  7、选择下列项之一:
  ①时间点
  保留默认值(“最近状态”);或者通过单击“浏览”按钮,打开“时点还原”对话框,从中选择特定的日期和时间;
  ②标记的事务
  将数据库还原为以前标记的事务。 选择此选项会启动“选择标记的事务”对话框,从而显示一个网格,列出选定事务日志备份中可以使用的标记的事务;
  默认情况下,将一直还原到(但不包含)标记的事务为止。 若要同时还原标记的事务,请选择“包含标记的事务”。
  8、对于“恢复状态”选项,请指定还原操作之后的数据库状态即可。
参考技术A 根据日志文件进行重做队列和撤销队列处理

MySQL三种重要日志

参考技术A

日志是MySQL的重要组成部分,其中对于开发而言不得不关注三种重要的日志,分别是二进制日志(bin log)、事务日志(redo log、undo log)。接下来详细介绍这三种日志。

binlog叫做二进制日志,主要是用于记录MySQL表的逻辑变化过程。在实际应用过程中,通常被用于主从复制和数据恢复。

事务执行过程中,会先把日志写到binlog cache,事务提交的时候,再把binlog cache写到binlog文件中。

事务提交后的写入只是写入到文件系统的page cache,并没有把数据持久化到磁盘。持久化磁盘由操作系统决定调用fsync。

MySQL提供了配置决定fsync的时机,当sync_binlog=0的时候,每次提交事务只写入page cache,不执行fsync。当sync_binlog=1的时候,表示每次提交事务都会执行fsync。当sync_binlog = N的时候,每次提交事务都写入page cache,累计多个事务才进行fsync。

显然,当sync_binlog = 1的时候,binlog日志不会丢失。当sync_binlog = N的时候,如果发生异常重启,会丢失N个事务的binlog日志。

STATEMENT
记录数据操作的原始SQL,可能引发主库备库因索引选择不一致,导致数据执行结果不一致。

ROW
ROW基于行复制,只记录哪条数据被修改.缺点:占空间。比如DELETE 语句,对于STATEMENT只占用1条SQL。而ROW格式则需要把所有记录的数据记录下来。

MIXED
对于可能引发主备不一致的命令使用ROW格式,否则使用STATEMTNT

对于每一次更新操作,MySQL都需要写入磁盘,然后需要找到对应那条记录并更新。IO成本较高和查找成本都很高。为了提高性能,MySQL会将更新操作写入redo log,并更新内存。INNODB引擎会在适当的时候将操作记录更新到磁盘。

[图片上传失败...(image-c6a1f2-1627716309698)]

undo log主要是记录了数据的逻辑变化,比如对应一条insear语句,undo log会记录一条delete语方便回退到更新前的值。

时刻A发生故障的话,由于binlog未写入,redo log回滚数据,两个日志数据是一致的。

时刻B发生故障,则需要判断binlog是否完整来决定如何恢复。

redo log和bin log的区别?

为什么redo log crash-safe,而bin log不可以?

以上是关于用日志文件恢复事务的过程的主要内容,如果未能解决你的问题,请参考以下文章

sql运行问题?

从损坏的 SQL Server 数据库中恢复事务日志

使用Rman备份的归档日志恢复数据库时,需要先还原归档日志吗

数据库的备份与恢复

事务日志的用途是啥

(2.6)备份与还原--在简单恢复模式下事务日志的角色