浅谈checkpoint与内存缓存
事务日志存在检查点checkpoint,把内存中脏数据库写入磁盘,以减少故障恢复的时间,在此之前有必要提下SQL Server内存到底存放了哪些数据?
SQL Server内存使用
对SQL Server数据库有一定了解的人一定知道,数据库为提高交互速度是将数据提取到内存缓冲区,然后客户端取内存的数据,内存中数据按用途分类具体可如下
(1)database cache
顾名思义,用于存放数据的缓冲区,用户修改某个数据时,SQL Server会修改内存中相应页面的数据,不会立即修改磁盘中数据,用户读取数据也是从内存中读取,若内存中未命中才从磁盘获取。对于内存中已经修改的数据,需要checkpoint或lazy write的时候集中处理。
因此最理想的情况,将磁盘中所有数据都存放在内存中,而不需要到磁盘中读取数据。只要后续通过checkpoint写入修改的数据即可。
(2)各类Consumer
SQL Server的其他组件需要通过内存完成任务,其中主要包括:connection,执行计划,编译、执行上下文,元数据等。
(3)其他(线程,第三方代码)
通过以上分类能了解到,内存缓冲区主要数据缓存和计划缓存。而checkpoint具体做了哪些事情呢?接下来便说说checkpoint的执行过程
checkpoint
go
select [current lsn],Operation,CONTEXT,[Transaction ID],[Log Record Length],[Previous LSN],[Minimum LSN] ,AllocUnitName,[Page ID],[Slot ID],[Begin Time],[End Time],[RowLog Contents 0],[RowLog Contents 1],[Log Record]
from fn_dblog(null,null)
where [current lsn]>'00000115:000001e2:0001'
1、在checkpoint 执行后,往日志中插入操作类型为LOP_BEGIN_CKPT的记录;在此日志中记录MinLSN,MinLSN可能为以下情况
• CheckPoint的开始LSN
• 还未结束的事务在日志的最小LSN
• 尚未传递给分发数据库的最早的复制事务起点的 LSN【镜像和复制分发】
2、往日志中插入操作类型为LOP_XACT_CKPT的记录。
下图为不存在活动事务的情况。
下图为存在活动事务,log Record记录活动事务LSN。
3、若数据库恢复模式为简单恢复模式,或者非完整/大容量恢复模式在为执行全备的情况下,将MinLSN之前的所有VLF设置为reusable。
4、把当前日志缓冲区的日志页写入磁盘,将数据库缓冲区的脏数据写入磁盘。
dbcc errorlog
go
dbcc traceon(3502,3504,-1)
go
checkpoint
go
xp_readerrorlog
从下图可以看出cleaned up 4 bufs ;注意:不管事务是否已经提交都要写入磁盘。
5、往日志中插入操作类型为LOP_END_CKPT的记录。
6、将checkpoint操作的开始LSN写入数据库的启动数据页。
以上具体各个步骤记录的详细内容需要分析LogRecord的记录lsn内容,此文暂不细说。
需要注意以上几点:
(1)checkpoint将脏页写入磁盘的时候,会先将日志写入磁盘。以保证数据永久性
(2)将脏页写入磁盘,是所有已经修改的数据,这里包括正在活动的事务
(3)不只是简单恢复模式在执行checkpoint的时候会导致日志重用,未做过完整备份的完整恢复模式和大容量日志恢复模式也会导致日志重用。(这是因为在为做完整备份之前,不用保证一条完整的日志序列)
(4)checkpoint 的主要作用是为了减短故障恢复时间,主要写入脏页数据操作为懒写入。
浅谈checkpoint与内存缓存的更多相关文章
- 浅谈Java的内存模型以及交互
本文的内存模型只写虚拟机内存模型,物理机的不予描述. Java内存模型 在Java中,虚拟机将运行时区域分成6中,如下图: 程序计数器:用来记录当前线程执行到哪一步操作.在多 ...
- 浅谈Linux的内存管理机制
转至:http://ixdba.blog.51cto.com/2895551/541355 一 物理内存和虚拟内存 我们知道,直接从物理内存读写数据要比从硬盘读写数据要快的多,因此, ...
- 浅谈CPU、内存、硬盘之间的关系
计算机,大家都知道的,就是我们日常用的电脑,不管台式的还是笔记本都是计算机.那么这个看着很复杂的机器由哪些组成的呢,今天就简单的来了解一下. 先放图: 图上展示的就是计算机的基本组成啦. 首先是输入设 ...
- 转:浅谈Linux的内存管理机制
一 物理内存和虚拟内存 我们知道,直接从物理内存读写数据要比从硬盘读写数据要快的多,因此,我们希望所有数据的读取和写入都在内存完成,而内存是有限的,这样就引出了物理内存与虚拟内存的概 ...
- 浅谈浏览器http的缓存机制
针对浏览器的http缓存的分析也算是老生常谈了,每隔一段时间就会冒出一篇不错的文章,其原理也是各大公司面试时几乎必考的问题. 之所以还写一篇这样的文章,是因为近期都在搞新技术,想“回归”下基础,也希望 ...
- [转载]浅谈C/C++内存泄漏及其检测工具
http://dev.yesky.com/147/2356147_3.shtml 对于一个c/c++程序员来说,内存泄漏是一个常见的也是令人头疼的问题.已经有许多技术被研究出来以应对这个问题,比如Sm ...
- 12.Object-C--浅谈OC的内存管理机制
昨天学习了OC的内存管理机制,今天想总结一下,所以接下来我要在这里bibi一下:OC的内存管理. 首先我要说的是,内存管理的作用范围. 内存管理的作用范围: 任何继承了NSObject的对象,对其他基 ...
- [转]浅谈C/C++内存泄露及其检测工具
转自:http://www.cnblogs.com/taoxu0903/archive/2007/10/27/939261.html 对于一个c/c++程序员来说,内存泄漏是一个常见的也是令人头疼的问 ...
- 浅谈JVM与内存分配
一.程序内存分配 初始内存分配 当一个程序准备运行时,它首先向java虚拟机要内存,但是java虚拟机本身没有权限,它只能向操作系统申请内存,此时java虚拟机会拥有一个初始内存, 此处额外说明一下e ...
随机推荐
- C#变量类型
在C#语言中,我们把变量分为七种类型,它们分别是:静态变量(static varibles),非静态变量(instance variables),数组元素(array elements),值参数(va ...
- MVC项目经验杂谈
ASP.NET MVC 绝大多数的公司已经用上了ASP.NET MVC,博主手里也做了不少个MVC的项目,在这里分享一下我在项目中是如何使用MVC的 打造通用的异常处理 项目上线运行,并不是所有的时候 ...
- yield和python(如何生成斐波那契數列)
您可能听说过,带有 yield 的函数在 Python 中被称之为 generator(生成器),何谓 generator ? 我们先抛开 generator,以一个常见的编程题目来展示 yield ...
- 【Beta】团队协作模式探讨试行
概述 鉴于Alpha阶段松散的结构和低下的效率,以及Scrum会议时间过长.文档不到位.无标准化验收等问题,尝试对协作模式作一点变化. 依照课程压力等实际情况,以及按照贡献分分配原则,以一周为贡献分计 ...
- HTML5系列一(属性概述)
HTML5概述 HTML5於2004年被WHATWG(网页超文本技术工作小组)提出,於2007年被W3C接纳 在2008年1月22日,第一份正式草案已公布.WHATWG表示该规范是目前正在进行的工作, ...
- 淘宝npm镜像
来源:https://cnodejs.org/topic/4f9904f9407edba21468f31e 镜像使用方法(三种办法任意一种都能解决问题,建议使用第三种,将配置写死,下次用的时候配置还在 ...
- ::before/:before和::after/:after的使用
::before/:before和::after/:after的使用 之前总是可以看到::before :before ::after :after,但是没有使用过,今天查了些资料,终于知道了他们的关 ...
- python 培训之HTTP
1. urllib #!/usr/env/python # -*- coding:UTF-8 -*- from __future__ import print_function import sys ...
- SSH的各个配置文件:
struts的配置: struts.xml: <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE ...
- java泛型中<?>和<T>有什么区别?
public static void printColl(ArrayList<?> al){ Iterator<?> it = al.iter ...