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

预写式日志(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中进行配置:image

需要注意的是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,同时对比了两种方法的机制和触发条件,这对我们将来进一步讲解事务日志的基本原理和恢复机制提供了良好的基础。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/119751.html原文链接:https://javaforall.cn

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)
blank

相关推荐

  • SpringBoot解决CORS跨域(@CrossOrigin)

    SpringBoot解决CORS跨域(@CrossOrigin)一、关于跨域介绍在前后分离的架构下,跨域问题难免会遇见比如,站点http://domain-a.com的某HTML页面通过的src请求http://domain-b.com/image.jpg。网络上的许多页面都会加载来自不同域的CSS样式表,图像和脚本等资源。出于安全原因,浏览器限制从脚本内发起的跨源HTTP请求。例如,XMLHttpRequest和FetchAPI…

  • vuex里mapState,mapGetters使用详解

    vuex里mapState,mapGetters使用详解这次给大家带来vuex里mapState,mapGetters使用详解,vuex里mapState,mapGetters使用的注意事项有哪些,下面就是实战案例,一起来看一下。一、介绍vuex里面的四大金刚:State,Mutations,Actions,Getters(上次记得关于vuex笔记http://www.jb51.net/article/138229.htm,是一个简…

  • linux中shell变量$#,$@,$0,$1,$2的含义解释

    linux中shell变量$#,$@,$0,$1,$2的含义解释

  • 镁光闪存颗粒对照表_最全的内存颗粒编码规则说明,教你看穿内存条到底用的什么颗粒…[通俗易懂]

    镁光闪存颗粒对照表_最全的内存颗粒编码规则说明,教你看穿内存条到底用的什么颗粒…[通俗易懂]今天我们一起来了解、学习下海力士、南亚、镁光内存颗粒的编码规则,以帮助我们快速的看穿内存条到底使用的是什么颗粒,颗粒的质量和性能如何。海力士内存颗粒编码规则以苹果DDR42666MHz64GB(2*32GB)笔记本内存条为例,价格8802元。这款内存条采用的颗粒是海力士的H5ANAG8NMJRVKC。海力士DDR4颗粒编码一共14位。前4位基本是固定的,不用看,我们看后10位——AG8NMJR…

  • Parallel ForEach For 多线程并行计算使用注意

    Parallel ForEach For 多线程并行计算使用注意之前用DataTable进行遍历,出现索引超出范围问题,因为List<T>也只支持单线程,改用ConcurrentBag解决问题。在ParallelForEach/For外的变量要避免同时操作同一个变量造成数据不一致的情况。List<T>转为ConcurrentBagConcurrentBag<T>concT=newC…

  • 看了很多人的面试经验,我也来一段:这段时间的几个面试

    看了很多人的面试经验,我也来一段:这段时间的几个面试
    泉州巴黎婚纱摄影
     
    店门口摆了个牌子,说招聘20名数码师,月薪2000-4000。又在网上也看到招聘启事,投了。
     
    投完,人才网收到个面试通知,不过简历状态竟然是未阅?通知人面试连简历都不看的?打了个电话过去,又给了我个电话,再打过去,电话里跟我说,我们这个职位啊,工作时间长工资低(6+*12+,<=800),你要有心理准备……KAO,牌子上不是写的2000-4000吗?到底打的啥鬼主意?
     
    过阵子在百度PS吧,看到有人发了一个贴

发表回复

您的电子邮箱地址不会被公开。

关注全栈程序员社区公众号