事务日志初探(一)

前面因为遇到实际问题做了一次关于利用事务日志备份还原数据的实际操作,觉得有必要系统的理顺一下关于事务日志这块的知识,接下来用几篇的时间来系统的归纳一下事务日志的基本原理和实际应用。

什么是事务日志?

事务日志是一个与数据库文件分开的文件。它存储对数据库进行的所有更改,并全部记录插入、更新、删除、提交、回退和数据库模式变化。事务日志还称作前滚日志或重做日志。事务日志是备份和恢复的重要组件,也是使用 SQL Remote 或 [复制代理] 复制数据所必需的。

说起事务不得不提出一个概念就是ACID属性,它包括原子性(Atomicity) ,一致性(Consistency) ,隔离性(Isolation) ,持久性(Durability)四大特性。而SQL SERVER利用事务日志来确保持久性(Durability)和事务回滚(Rollback)。从而还部分确保了事务的ACID属性。

事务日志的物理体系结构

事务日志存储的是对数据库所做的更改信息,让 SQL Server 有机会恢复数据库。这样我们就需要将相应的把信息存储起来,对于熟悉mssql的人来说很熟悉,就是在创建数据库时,创建的.ldf文件,下面我们来具体看一下它的物理结构如何。

在SQL Server中日志文件是将逻辑上一个ldf文件划分成多个逻辑上的虚拟日志文件(virtual log files,简称VLFs),通过这种方式使得存储引擎管理事务日志更高效.并且对于日志空间的重复利用也会更加高效。

事务日志是一种回绕的文件。例如,假设有一个数据库,它包含一个分成四个虚拟日志文件的物理日志文件。当创建数据库时,逻辑日志文件从物理日志文件的始端开始。新日志记录被添加到逻辑日志的末端,然后向物理日志的末端扩张。日志截断将释放记录全部在最小恢复日志序列号 (MinLSN) 之前出现的所有虚拟日志。“MinLSN”是成功进行数据库范围内回滚所需的最早日志记录的日志序列号。

SQL Server 会根据如下规则来判断 VLF 的数量:


日志大小


VLF 数量


Size <= 1MB


将日志文件大小除以最小 VLF 大小(31KB*8KB)确定个数


1MB < Size <= 64MB


4 个


64MB < Size <= 1GB


8 个


Size > 1GB


16 个

事务日志逻辑体系结构

SQL Server 事务日志按逻辑运行,就好像事务日志是一串日志记录一样。每条日志记录由一个日志序列号 (LSN) 标识。每条新日志记录均写入日志的逻辑结尾处,并使用一个比前面记录的 LSN 更高的 LSN。日志记录按创建时的串行序列存储。每条日志记录都包含其所属事务的 ID。对于每个事务,与事务相关联的所有日志记录通过使用可提高事务回滚速度的向后指针挨个链接在一个链中。

如图:

LSN号可以看作是将日志文件和其记录数据之间的纽带.每一条日志不仅有LSN号,还有其对应事务的事务日志。

不管为事务日志定义多少个物理文件,SQL Server 总是把日志当成连续流(Contiguous Stream)来对待。

操作的恢复步骤取决于日志记录的类型:

  • 记录逻辑操作

    • 若要前滚逻辑操作,请再次执行该操作。
    • 若要回滚逻辑操作,请执行相反的逻辑操作。
  • 记录前像和后像
    • 若要前滚操作,请应用后像。
    • 若要回滚操作,请应用前像。

许多类型的操作都记录在事务日志中。这些操作包括:

  • 每个事务的开始和结束。
  • 每次数据修改(插入、更新或删除)。这包括系统存储过程或数据定义语言 (DDL) 语句对包括系统表在内的任何表所做的更改。
  • 每次分配或释放区和页。
  • 创建或删除表或索引。

总结:

本章从事务日志的逻辑和物理构架简单介绍了事务日志的构成.需要注意的是如果 SQL Server 设置了设SIMPLE 恢复模型,数据库会定期截断日志;或者从未进行过完全数据库备份;则认为没有维护日志备份。下一章将会介绍SQL Server在操作中会如何使用到日志文件。

时间: 2024-10-15 20:44:28

事务日志初探(一)的相关文章

事务日志初探(二)---简单恢复模式

简述 在简单恢复模式下,日志文件的作用仅仅是保证了SQL Server事务的ACID属性.并不承担具体的恢复数据的角色.正如”简单”这个词的字面意思一样,数据的备份和恢复仅仅是依赖于手动备份和恢复.我们简单介绍下三种恢复模式. 1.完整恢复模式 这种模式会为所有操作都记录日志,当数据文件被破坏时,可以备份尾部事务日志,并用于将数据库还原到给定的时间点.因此OLTP生产系统通常会使用完整的恢复模式. 2.大容量日志恢复模式 这种模式把日志记录量最小化,只为大容量操作记录日志. 3.简单恢复模式 我

SharePoint 2010 数据库xxx的事务日志已满

http://www.cnblogs.com/sygwin/p/6222428.html 接到领导安排,说客户有问题 请求协助解决,对方给我展示的错误日志,如下: 数据库'WSS_Content_xxxx'的事务日志已满.若要查明无法重用日志中的空间的原因,请参阅sy.databases中的log_reuse_wait_dec列 导致的结果是用户再也无法上传文件到文档库了. 看来一下对应的数据库文件,日志文件大的惊人,已经超过1.8T 作为老司机,理论上解决这样的问题,就是收缩数据库.可是咱是个

事务日志文件该设多大

既然事务日志如此重要,如果设置不当可能会带来性能问题,那么我们究竟该给事务日志分配多大空间呢?额,这个没有明确的答案,要具体情况具体对待. 一般做为正常的日常操作,建议为起始数据文件大小的 25%.因此,如果您的数据文件是 20 GB,那么日志文件设置为 5 GB.还要持续的监视它,看它是否会不断的增长并超越 5GB.正如我们之前说的,频繁的添加小的日志空间将会增加新的虚拟日志文件,过多的虚拟日志文件会带来性能问题.25%是一个正常操作的起点,如果你的系统每晚都要重建索引和其他高利用日志的操作如

mysql的innodb中事务日志ib_logfile

mysql的innodb中事务日志ib_logfile事务日志或称redo日志,在mysql中默认以ib_logfile0,ib_logfile1名称存在,可以手工修改参数,调节开启几组日志来服务于当前mysql数据库,mysql采用顺序,循环写方式,每开启一个事务时,会把一些相关信息记录事务日志中(记录对数据文件数据修改的物理位置或叫做偏移量);作用:在系统崩溃重启时,作事务重做:在系统正常时,每次checkpoint时间点,会将之前写入事务应用到数据文件中.引入一个问题:在m/s环境中,in

(转)解释一下SQLSERVER事务日志记录

本文转载自桦仔的博客http://www.cnblogs.com/lyhabc/archive/2013/07/16/3194220.html 解释一下SQLSERVER事务日志记录 大家知道在完整恢复模式下,SQLSERVER会记录每个事务所做的操作,这些记录会存储在事务日志里,有些软件会利用事务日志来读取 操作记录恢复数据,例如:log explorer 那么事务日志记录怎麽查看,里面都记录了些什么? 打开可以利用下面SQL语句来查看所在数据库的事务日志记录 1 USE [GPOSDB] -

PostgreSQL Replication之第二章 理解PostgreSQL的事务日志(4)

2.4 调整检查点和XLOG 目前为止,这一章已经提供深入洞察PostgreSQL如何写入数据,一般来说,XLOG是用来干什么的.考虑到这方面的知识,我们现在可以继续并学习我们能做些什么来使我们的数据库在复制和单台服务器运行的两种情况更加有效的工作. 2.4.1 理解检查点 在本章中,我们已经看到在数据可能到其它地方之前,它已经被写入到了XLOG.问题是,如果XLOG从未被删除,显然,在没有填满磁盘的同一时间,我们不会永远写到XLOG中. 要解决这个问题,XLOG必须在某一时刻被删除.这个过程就

Sql Server 事务日志(三)

SQL server的日志文件会随着数据修改的增加而变大,在处理日志文件时,我们常用的方式是将日志截断,并收缩. Backup log databasename to disk='' dbcc shrinkfile(databasename_log) 当然,如果磁盘空间紧张,可以将恢复模式改成‘simple’的方式使日志截断,然后再收缩日志 alter database test set recovery simple; DBCC shrinkfile(test_log) alter datab

SQL Server中事务日志已满的原因以及解决办法

错误描述:数据库的事务日志已满.若要查明无法重用日志中的空间的原因 ,请参阅sys.databases 中的 log_reuse_wait_desc 列 . 首先引入一下事务日志的概念(来自百度百科): 事务日志是一个与数据库文件分开的文件.它存储对数据库进行的所有更改,并全部记录插入.更新.删除.提交.回退和数据库模式变化.事务日志还称作前滚日志或重做日志. 事务日志是备份和恢复的重要组件,也是使用 SQL Remote 或 [复制代理] 复制数据所必需的. 在缺省情况下,所有数据库都使用事务

SQL事务日志备份时的问题

1.在进行事务日志备份的时候,如下图: 3041 消息的疑难解答时的考虑事项:不会只是一个数据库或所有数据库出现问题吗?是备份到本地存储区或远程存储吗?哪种类型的备份 (数据库备份. 日志备份和差异备份) 是否出现故障?正在执行备份的应用程序 (SQL Server 代理作业. SQL 维护计划或 VDI/VSS 备份软件供应商提供的备份代理程序) 是什么?用于备份命令的选项是什么?什么是在其下运行 SQL Server 的帐户,此帐户没有所需的访问目标位置写入文件? 参考:http://sup