浅谈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 ...
随机推荐
- 保存密码(KeyChain的使用)
1.导入框架Security.framework 2.编写工具类 /* 该工具类只能保存一个用户和密码 */ /* service 一般为 bundle ID */ @interface GLKeyC ...
- Linux学习之CentOS--CentOS6.下Mysql数据库的安装与配置
跟着配置,顺利配置完成 http://www.cnblogs.com/xiaoluo501395377/archive/2013/04/07/3003278.html
- Docker入门教程(九)10个镜像相关的API
Docker入门教程(九)10个镜像相关的API [编者的话]DockerOne组织翻译了Flux7的Docker入门教程,本文是系列入门教程的第九篇,重点介绍了镜像相关的Docker Remote ...
- C#调用WebService实现天气预报
http://zhangkui.blog.51cto.com/1796259/497324/ 本文使用Winform (C#)调用互联网上公开的WebServices(http://www.webxm ...
- 什么是jsonp
Jsonp其实就是一个跨域解决方案. Js跨域请求数据是不可以的,但是js跨域请求js脚本是可以的. 所以可以把要请求的数据封装成一个js语句,做一个方法的调用. 跨域请求js脚本可以得到此脚本.得到 ...
- jquery输出ajax返回数据中的时间戳转化为日期时间的函数
//第一种 function getLocalTime(nS) { ).toLocaleString().replace(/:\d{,}$/,' '); } alert(getLocalTime()) ...
- Linux下Redis服务器安装配置
说明:操作系统:CentOS1.安装编译工具yum install wget make gcc gcc-c++ zlib-devel openssl openssl-devel pcre-devel ...
- SPL--Serializable
Serializable[自定义序列化的接口] : 实现此接口的类将不再支持 __sleep() 和 __wakeup(). 作用: 为一些高级的序列化场景提供支持.__sleep()和__wakeu ...
- 使用BLADE构建c++工程管理
使用BLADE构建c++工程管理 字数764 阅读2753 评论2 喜欢4 一. c++工程依赖管理 之前在百度一直使用comake2构建c++项目,十分方便.免去了手写Makefile的痛苦,很多项 ...
- linux sort,uniq,cut,wc,tr命令详解
sort是在Linux里非常常用的一个命令,对指定文件进行排序.去除重复的行 sort 命令对 File 参数指定的文件中的行排序,并将结果写到标准输出.如果 File 参数指定多个文件,那么 sor ...