一、事物日志作用
每个 SQL Server 数据库都具有事务日志,用于记录所有事务以及每个事务对数据库所做的修改。事物日志的作用主要如下:
- WAL事务预提交,减少了脏页刷盘的IO消耗,极大的提高了数据库性能
- 崩溃恢复,当数据库发生意外宕机,数据库启动时会进行崩溃恢复的流程,会先读取事务日志进行前滚,将数据恢复到崩溃前的状态;然后进行回滚操作,对事务日志中未提交的事务进行rollback,以此保证数据库中数据的一致性
- 还原数据库至指定的时间点,当数据库出现误操作等故障时,可通过完整备份+差异备份/日志备份进行数据恢复,将数据恢复故障前的时间点
- 高可用性和灾难恢复解决方案: Always On 可用性组、数据库镜像和日志传送
对于内存中的脏页的刷盘主要有以下两种方式:
- 检查点会周期性扫描内存数据将脏页进行刷盘
- 当数据库内存达到高水位后,LazyWriter也会将内存中脏页进行刷盘
二、事务日志原理
如上图,SQL Server的日志由多个虚拟日志文件(Vitual Log Files(VLF))组成,事务日志被截断的基本单位是VLF而不是数据页,对于事务日志中的日志记录都有自己的逻辑序列号(LSN)进行标记。
1、事物日志状态分类
- 活动(Alive):这个状态的VLF是活动的,因为它至少包含活动日志部分的一条记录,因此它需要被回滚或其他目的。这个状态的VLF是不活动的,但没被截断或备份,空间不可以重用。
- 可恢复(Recoverable):这个状态的VLF是不活动的,但没被截断或备份,空间不可以重用。
- 可重用(Reusable):这个状态的VLF是不活动的,它已被截断或备份,空间可以重用。
- 未使用(Unused):这个状态的VLF是不活动的,在它里面还没有被记录的日志记录。
2、