前面因为遇到实际问题做了一次关于利用事务日志备份还原数据的实际操作,觉得有必要系统的理顺一下关于事务日志这块的知识,接下来用几篇的时间来系统的归纳一下事务日志的基本原理和实际应用。
什么是事务日志?
事务日志是一个与数据库文件分开的文件。它存储对数据库进行的所有更改,并全部记录插入、更新、删除、提交、回退和数据库模式变化。事务日志还称作前滚日志或重做日志。事务日志是备份和恢复的重要组件,也是使用 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在操作中会如何使用到日志文件。