预写式日志(Write-Ahead Logging (WAL))

     SQL Server中使用了WAL(Write-Ahead Logging)技术来保证事务日志的ACID特性。而且大大减少了IO操作。

     WAL的核心思想是:在数据写入到数据库之前,先写入到日志.再将日志记录变更到存储器中。

SQL Server修改数据的步骤

     1.在SQL Server的缓冲区的日志中写入”Begin Tran”记录

     2.在SQL Server的缓冲区的日志页写入要修改的信息

     3.在SQL Server的缓冲区将要修改的数据写入数据页

     4.在SQL Server的缓冲区的日志中写入”Commit”记录

     5.将缓冲区的日志写入日志文件

     6.发送确认信息到客户端(SMSS,ODBC等)

     7.将缓冲区内的页写入到磁盘

   本篇着重介绍将缓冲区的数据页写入到磁盘的两个过程:CheckPoint和Lazy Writer。      当事务遇到Commit时,仅仅是将缓冲区的所有日志页写入磁盘中的日志文件;而直到Lazy Writer或CheckPoint时,才真正将缓冲区的数据页写入磁盘文件。

CheckPoint:系统会按照恢复间隔 SQL Server 配置选项确定的间隔自动发出检查点。 Checkpoint 方法会立即发出检查点,而无论恢复间隔设置为何。

      这个CheckPoint的间隔是一个服务器级别的参数。可以通过sp_config进行配置,也可以在SSMS中进行配置:

需要注意的是CHECKPOINT 权限预设会授予系统管理员 (sysadmin) 固定伺服器角色及 db_ownerdb_backupoperator 固定资料库角色的成員,並不可加以转让。更短的恢复间歇意味这更短的恢复时间和更多的磁盘IO,而更长的恢复间歇则带来更少的磁盘IO占用和更长的恢复时间.

checkpoint的触发条件

1. 自上次检查点后产生大量日志

2. 服务实例关闭

3. 数据库完整备份或差异备份(日志备份不会触发checkpoint)

4. 数据库恢复模式为简单恢复模式下当日志文件使用超过70%时

Lazy Writer:lazywriter是一个系统进程,其主要任务是成批刷新老化的脏缓冲区(指包含更改的缓冲区,这些更改必须写回磁盘,才能使该缓冲区由其它页重新使用),并使之可由用户进程使用。

lazywriter的触发条件

1. 缓存区内可用空闲缓存块数据不足

2. Windows系统内存压力

区别:

      Checkpoint目的是减少数据库的恢复时间(服务奔溃或重启服务后的恢复),而Lazy writer的目的是保证SQL OS 有空闲缓存块和系统有一定可用内存。

      Checkpoint和LazyWriter都会将缓冲区内脏页写入到磁盘;

      LazyWriter会更新缓存区空闲可用列表,而checkpoint不会;

      Checkpoint操作会被记录到数据库日志中,而lazywriter不会;

      通过指定CheckPoint后的参数,SQL Server会按照这个时间来完成CheckPoint过程,如果时间指定的短,则SQL Server会使用更多的资源优先完成CheckPoint过程。

      通常情况下,将“脏”页写入磁盘的工作,Lazy Writer要做的比CheckPoint会多出许多。

总结

    本文简单介绍了WAL的概念和最终实现数据实际修改的两种方法。介绍了CheckPoint和Lazy Writer,同时对比了两种方法的机制和触发条件,这对我们将来进一步讲解事务日志的基本原理和恢复机制提供了良好的基础。

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏我是攻城师

Spark如何读取一些大数据集到本地机器上

52440
来自专栏网站漏洞修补

网站安全检测 对thinkphp通杀漏洞利用与漏洞修复建议

thinkphp在国内来说,很多站长以及平台都在使用这套开源的系统来建站,为什么会这么深受大家的喜欢,第一开源,便捷,高效,生成静态化html,第二框架性的易于...

32710
来自专栏灯塔大数据

每周学点大数据 | No.62 Hadoop MapReduce 实践—环境搭建(上)

NO.62  Hadoop MapReduce 实践—环境搭建(上) Mr. 王:前面我们讲了很多关于并行算法的理论,今天我们来看看如何在计算机上实际运行一些...

32690
来自专栏Spark学习技巧

聊聊流式批处理

要说流式微批处理,就不得不说一下TCP流。典型的tcp IO流模型有,bio,伪异步IO,NIO,AIO,Rector模型等。我们这里主要是说伪异步IO。 ? ...

24370
来自专栏用户画像

4.1.6 文件系统基础

文件是以计算机硬盘为载体存储在计算机上的信息集合,它的形式很多样化,可以是文本文档、图片、程序等。

7320
来自专栏晓晨的专栏

ABP从入门到精通(3):aspnet-zero-core 使用Redis缓存

23220
来自专栏皮振伟的专栏

[linux][statethread]协程库ST技术分析

前言: 在IO密集型的场景下,尤其是互联网后台,经常会使用epoll等IO复用技术。鉴于直接使用epoll的代码阅读性和开发效率等原因,就抽象出来了各种高级模型...

34880
来自专栏HaHack

化繁为简的企业级 Git 管理实战(五):二进制大文件的版本控制

18670
来自专栏余生开发

VS Code—插件的开发

说再多也不如做一遍,这里我们一起来一步步做一个插件。就做官网的那个demo,wordCounter,用于统计当前页单词量。 官网是TypeScript,我不会....

1.6K10
来自专栏猿人谷

在windows下使用eclipes连接linux下的Hadoop集群

hadoop 是工作在linux下的分布式系统,做为一个开发者,对于手里资源有限,不得不使用只有终端的虚拟机来运行hadoop集群。但是,在这种环境下,开发,调...

22650

扫码关注云+社区

领取腾讯云代金券