SQL 2014新特性- Delayed durability
ACID 是数据库的基本属性。其中的D是指"持久性":只要事务已经提交,对应的数据修改就会被保存下来,即使出现断电等情况,当系统重启后之前已经提交的数据依然能够反映到数据库中。
那么D特性是如何在SQL Server中实现的呢?SQL Server使用write-ahead logging的方式,保证日志记录会先于数据记录固化到磁盘中。当事务提交后,只有当日志记录固化到磁盘时,才会向客户端返回提交成功的消息,至于相应的数据记录,会通过异步的方式后续写入到磁盘中。如果在此期间发生断电等故障,那么就会出现以下两种情况:
- 日志已经写入到磁盘(committed),但数据没有写入:
系统重启后进行redo操作,通过读取日志,来将没有固化到数据文件的信息写入到数据文件。
- 部分日志已经写入到磁盘(uncommitted),数据部分写入或没有写入
系统重启后执行undo操作,将没有提交的事务对应的数据从数据文件中清除。
这样就保证了已经提交的事务不会丢失。
Delayed durability
SQL Server 2014中引入了一个新的特性,叫做Delayed durability(也称作lazy commit),颠覆了之前提到的概念。通过Delayed durability,可以让日志记录按照一定规律异步地写入到日志文件中,避免日志磁盘写入过于频繁。这样就以牺牲Durability来换取性能。
应用场景:
使用该特性的前提是您的应用可以容忍一定程度的数据丢失。
日志磁盘出现系统瓶颈。
由于日志磁盘性能问题,导致事务无法提交,导致相应的资源(memory,lock等)无法释放引发的资源竞争
Delayed Durability有以下特性:
- 一旦事务提交,事务中的数据变更对其他事务(包含full durable transaction和delayed durability transaction)可见。具体请参考isolation level http://msdn.microsoft.com/en-us/library/dn133175.aspx
- 事务的持久性(durability)依赖于日志记录是否固化到磁盘。
- 内存中的日志记录只有在任意以下情况发生时才会固化到磁盘:
- )Full durable transaction进行了数据变更,并且commit.
- )执行了sp_flush_log存储过程.
- )Log buffer满了,日志记录也会固化到磁盘.
如果1)或2)出现两次,那么SQLSERVER会保证第一次之前的Delayed durability transaction的数据变更已经被固化到了磁盘。
如何使用Delayed durability
Delayed durability是一个数据库级别的特性,默认是禁用的,我们首先要开启这个选项。
ALTER DATABASE [DDtest] SET DELAYED_DURABILITY = FORCED|Allowed|Disabled |
如果是forced,那么该数据库内所有的事务都强制使用delayed durability;如果是allowed,那么delayed durability和full durable transaction可以同时存在;如果是disabled,那么无法使用delayed durability.
当该属性发生变化后,errorlog中也会有相应的记录
Setting database option delayed_durability to forced for database 'DDtest'.
Setting database option delayed_durability to allowed for database 'DDtest'.
Setting database option delayed_durability to disabled for database 'DDtest'.
如果数据库的DELAYED_DURABILITY为Allowed,我们可以在语句级别进行控制,否则就要遵循数据库的设定了(如果语句的设定和数据库级别设定冲突,那么SQL Server会使用数据库级别的设定)。
事例
将数据的 DELAYED_DURABILITY设置为Allowed
ALTER DATABASE [DDtest] SET DELAYED_DURABILITY = Allowed
创建一张表,并循环插入1000行数据,每次插入都是一个单独的事务
create table ta(col int)
declare @N int=0
while @n<1000
begin
begin tran
insert ta values(1)
commit tran with(delayed_durability=off)
set @N+=1
print cast(@N as varchar(1000))
end
开启Process Monitor,监控对数据库日志文件的操作。
一共对日志文件进行了1012次的写入操作,也就是每次commit都会立刻固化到日志文件
下面比较一下使用delayed durability的情况
declare @N int=0
while @n<1000
begin
begin tran
insert ta values(1)
commit tran with(delayed_durability=on)
set @N+=1
print cast(@N as varchar(1000))
end
1000个事务只触发了32次写入,大大地减少了对日志文件的写入操作。
注意事项
- 当系统不忙时,也会主动将delayed durability的日志记录固化到磁盘。但目前不知道如何判断"不忙"这个标准。
- checkpoint不会将delayed durability的日志记录固化到磁盘。
- SQL Server正常关闭不会将delayed durability的日志记录固化到磁盘,也就说正常关闭也可能会导致数据丢失,建议之前先执行sp_flush_log。
SQL 2014新特性- Delayed durability的更多相关文章
- SQL Server 2014 新特性——内存数据库
SQL Server 2014 新特性——内存数据库 目录 SQL Server 2014 新特性——内存数据库 简介: 设计目的和原因: 专业名词 In-Memory OLTP不同之处 内存优化表 ...
- SQL Server 2014 新特性——内存数据库(转载)
目录 SQL Server 2014 新特性——内存数据库 简介: 设计目的和原因: 专业名词 In-Memory OLTP不同之处 内存优化表 内存优化表的索引 并发能力的提升 和竞争对手相比几点 ...
- 谈谈我的微软特约稿:《SQL Server 2014 新特性:IO资源调控》
一.本文所涉及的内容(Contents) 本文所涉及的内容(Contents) 背景(Contexts) 撰写经历(Experience) 特约稿正文(Content-body) 第一部分:生活中资源 ...
- 小心SQL SERVER 2014新特性——基数评估引起一些性能问题
在前阵子写的一篇博文"SQL SERVER 2014 下IF EXITS 居然引起执行计划变更的案例分享"里介绍了数据库从SQL SERVER 2005升级到 SQL SERVER ...
- SQL Server 2014新特性——Buffer Pool扩展
Buffer Pool扩展 Buffer Pool扩展是buffer pool 和非易失的SSD硬盘做连接.以SSD硬盘的特点来提高随机读性能. 缓冲池扩展优点 SQL Server读以随机读为主,S ...
- SQL Server 2014 新特性:IO资源调控
谈谈我的微软特约稿:<SQL Server 2014 新特性:IO资源调控> 2014-07-01 10:19 by 听风吹雨, 570 阅读, 16 评论, 收藏, 收藏 一.本文所涉及 ...
- SQL Server 2014新特性:五个关键点带你了解Excel下的Data Explorer
SQL Server 2014新特性:五个关键点带你了解Excel下的Data Explorer Data Explorer是即将发布的SQL Server 2014里的一个新特性,借助这个特性讲使企 ...
- [SQL Server 2014] SQL Server 2014新特性探秘
SQL Server 2014新特性探秘(1)-内存数据库 简介 SQL Server 2014提供了众多激动人心的新功能,但其中我想最让人期待的特性之一就要算内存数据库了.去年我再西雅图参加SQ ...
- SQL Server 2014新特性探秘(3)-可更新列存储聚集索引
简介 列存储索引其实在在SQL Server 2012中就已经存在,但SQL Server 2012中只允许建立非聚集列索引,这意味着列索引是在原有的行存储索引之上的引用了底层的数据,因此会 ...
随机推荐
- 浅谈JSON数据解析方法
JSON数据解析 JSON是什么?? 如何把JSON数据解析出来 如何把一个字典转换为JSON JSON详细介绍 JSON(JavaScript Object Notation) 是一种轻量级的数据交 ...
- OC NSDictionary
OC NSDictionary NSDictionary初始化 NSDictionary * dict = [[NSDictionary alloc] initWithObjectsAndKeys:@ ...
- Hibernate连接mysql数据库并自动创建表
天才第一步,雀氏纸尿裤,Hibernate第一步,连接数据库. Hibernate是一个开放源代码的对象关系映射框架,它对JDBC进行了非常轻量级的对象封装,它将POJO与数据库表建立映射关系,是一个 ...
- 1.4 基础知识——GP2.2 计划 与 GP2.8 计划跟踪
摘要: CMMI有计划(PP)及计划跟踪(PMC)两个PA,而某一个PA又有GP2.2计划及GP2.8计划跟踪两个GP,看上去是挺“神奇”也挺让人“困惑”的事情. 正文: GP2.2 Establis ...
- PlantUML的实例参考
project: blog target: plant-uml-instances.md date: 2015-12-24 status: publish tags: - PlantUML - UML ...
- .net C# 图片转Base64 Base64转图片
//图片 转为 base64编码的文本 private void button1_Click(object sender, EventArgs e) { OpenFileDialog dlg = ne ...
- Java基础知识学习(一)
部门接了新项目,后台使用Java框架play framework,前端是html,前后台通过rest交互,能够支持多端的互联网架构. 因为之前没有Java基础,前端使用的也很少,决定深入学习一下Jav ...
- 因GIT默认忽略.dll文件导致的Visual Studio项目通过Bamboo编译失败
背景 由GIT管理的Visual Studio项目,使用Stash管理远端代码库,通过与Stash集成的Bamboo生成项目并发布 现象 Visual Studio项目本地生成成功,用SourceTr ...
- 【API】获取优酷视频信息接口
序: 自己的网站中需要接入一个视频模块,虚拟主机的空间小所以只能引用第三方的链接.感觉国内优酷好不错,所以查了一下优酷的接口. 0x00: 先去优酷API开放中心申请一个开 ...
- Python将MySQL表数据写入excel
背景:将mysql表查询结果写入excel. 1.使用sqlyog工具将查询结果导出到Excel.xml中,用excel打开发现:因为text字段中有回车换行操作,显示结果行是乱的. 2.用mysql ...