浅谈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 ...
随机推荐
- ( 译、持续更新 ) JavaScript 上分小技巧(三)
最近家里杂事较多,自学时间实在少的可怜,所以都在空闲时间看看老外写的内容,学习之外顺便翻译分享~等学习的时间充足些再写写自己的一些学习内容和知识点分析(最近有在接触的:复习(C#,SQL).(学习)T ...
- 《Linux菜鸟入门2》Ldap
ldap网络帐号1.ldap是什么ldap目录服务认证,和windows活动目录类似,就是记录数据的一种方式 2.ldap客户端所需软件yum install sssd krb-workstation ...
- Vijos1921严厉的班长
传送门 在贴吧上看到了这道题,恰好最近在学相关的东西,觉得比较有意思就去做了. 第一眼看上去比较像搜索,其实是道状压DP.我简单讲一下思路: 首先明确,不管之前取了什么数,取1必定满足所有的数之间互质 ...
- BigDecimal 类型数据的一些应用
1.比较大小 可以通过BigDecimal的compareTo方法来进行比较.返回的结果是int类型,-1表示小于,0是等于,1是大于. 例如: if(a.compareTo(b) == -1){ a ...
- gettextize与glib-gettextize的使用
gettextize在各种场合都可以使用,用于支持多语言开发 glib-gettextize运行后,会修改po/Makefile.in.in文件,导致后续都必须运行glib-gettextize ge ...
- TextBox的值是否为数字
<asp:TextBox ID="t" Width="70" runat="server" style="ime-mode: ...
- sql优化之not in
sql : select ID from awhere XX <> 0 and ID not in (select ID from b) 4万多条记录,执行了316秒,无法接受. 优化 ...
- JavaWeb学习笔记——Ajax
- ansible加密命令
ansible-vault用于配置文件加密,如编写的playbook配置文件中包含敏感信息,不希望其他人随意查看,ansible-valut可加密/解密这个配置文件,刚试了下也可以加密txt文档,猜想 ...
- php mysql实体字符
问题描述:php提交数据的时候遇到特殊符号,需要转义才可以提交数据 如:提交单引号,双引号... php代码: $str = "我但是'sdf6448"; $data['goods ...