SQL Server 何时将“脏页”回写到硬盘

  SQL Server的工作原理:不能直接修改硬盘上的数据,而是先将数据从硬盘读入到内存的data cache,然后在内存中修改(被修改过的页称为脏数据页),最后再从内存回写到硬盘。下述进程都可能将脏页回写到硬盘。


一、Checkpoint(检查点)

  Checkpoint会搜索整个data cache,将脏页回写到硬盘。

  以下情况通常会触发checkpoint:

1、运行Checkpoint 命令。

2、使用alter database往数据库中添加了文件,或者从数据库中删除了文件。

3、备份数据库。在数据库备份之前,数据库引擎会自动执行检查点,以便在备份中包含对数据库数据页面的全部更改。

4、正常关闭SQL Server,并且不使用NOWAIT选项。

5、SQL Server预计的恢复时间超过了恢复间隔(recovery interval)。该值默认为0,即由SQL Server自动配置,一般为1分钟。一般情况下,按最低每分钟10MB日志进行设计。


  以下特殊情况也会触发checkpoint:

1、当恢复模式为简单时,如果日志文件的空闲空间低于70%。例外的情况是:如果日志文件是由于一个事务长时间执行而且尚未结束(意味着没有空间可释放)导致空闲空间低于70%,则不会触发checkpoint。

2、当恢复模式为大容量日志时,对数据库做了一个大容量操作。


  checkpoint对数据库的影响:

1、当数据库重启时,SQL Server将从checkpoint 完成的这个时间点开始恢复,即在此之后做redo(前滚)。这种机制加速了恢复的进度。

2、当恢复模式为简单时,checkpoint在把脏页回写到硬盘后,就去截断日志(将VLF的状态从2改为0)。



二、Lazywriter(惰性编辑器)

  SQL Server为每一个NUMA(非一致性内存访问)配备一个Lazywriter线程。Lazywriter被定期唤醒后,就去扫描与NUMA节点中的data cache,检查自由列表(free list)。如果列表的大小低于某个阀值(这个阀值取决于data cache的总大小)意味着内存压力,Lazywriter就去扫描data cache,将其中一些页标记到自由列表,表示这是空闲内存;如果这些页中有脏页,就回写到硬盘。

  当Lazywriter察觉到系统有内存压力时,它会增加或减少自由列表上的数据页,使操作系统的可用物理内存保持在4.8~5.2MB,以防止分页。

  Lazywriter自SQL Server 2005被引入。它与checkpoint的主要区别:checkpoint不会去修改自由列表。

  这是一个周期运行的线程,默认情况下,每隔一秒钟运行一次。


三、Worker Thread(工作线程)

  SQL Server 启动时,同时启动30~40个工作线程,用于完成客户端连接提出的各种操作请求。当客户端连接增加时,SQL Server会自动启动新的工作线程。当某个工作线程空闲15分钟,就会被关闭;当空闲内存不够时,某些工作线程也会被关闭(x86环境)。在x86环境,每个工作线程至少占用0.5MB内存;在x64环境,每个工作线程至少占用2MB内存。

  当worker线程察觉内存压力时,它会扫描data cache,把一段时间内未被访问的数据页添加到自由列表;如果这些页中有脏页,就回写到硬盘。


本文出自 “我们一起追过的MSSQL” 博客,谢绝转载!

你可能感兴趣的:(sql,checkpoint)