预写日志 (WAL)

SQL Server 使用预写日志 (WAL),此日志确保在将关联的日志记录写入磁盘后再将数据修改写入磁盘。这维护了事务的 ACID 属性。

SQL Server 维护当必须检索数据时,将数据页读入的缓冲区高速缓存。数据修改不是直接在磁盘上进行,而是修改高速缓冲存储器中的页副本。直到数据库中出现检查点,或者必须将修改写入磁盘才能使用缓冲区来容纳新页时,才将修改写入磁盘。将修改后的数据页从高速缓冲存储器写入磁盘的操作称为刷新页。在高速缓存中修改但尚未写入磁盘的页称为“脏页”。

对缓冲区中的页进行修改时,将在记录修改的日志高速缓存中生成一条日志记录。在将关联的脏页从高速缓冲存储器刷新到磁盘之前,必须将这条日志记录写入磁盘。如果在写入日志记录前刷新脏页,则该脏页便会在磁盘上创建修改。如果服务器在将日志记录写入磁盘前失败,则不能回滚此修改。SQL Server 具有防止在写入关联的日志记录前刷新脏页的逻辑。日志记录将在提交事务时写入磁盘。

注意:

某些 IDE SATA 驱动器在将数据写入磁盘之前将数据写入缓存在内部内存中。这样会导致预写日志无法正确工作。如果正在运行 SQL Server 的计算机使用这些磁盘类型之一,则应启用 enable_force_flush 选项。

=======================================================================

日志文件的I/O是顺序I/O,所以创建多个日志文件是没有意义的。

当针对数据库对象所做的任何修改保存到数据库之前,相应的日志首先会被记录到日志文件。这个记录会被按照先后顺序记录到日志文件的逻辑末尾,并分配一个全局唯一的日志序列号(log sequence number,简称LSN),这个序列号完全是按照顺序来的,如果日志中两个序列号LSN2>LSN1,则说明LSN2所在LSN1之后发生的.

由此可以看出,将日志文件分为多个文件除了磁盘空间的考虑之外。完全不会像数据那样可以并行访问,所以将日志文件分为多个完全不会有性能上的提升.

LSN号可以看作是将日志文件和其记录数据之间的纽带.每一条日志不仅有LSN号,还有其对应事务的事务日志:

参考:http://www.360doc.com/content/14/0619/11/18247611_388004580.shtml

=======================================================================

日志序列号 (LSN)

SQL Server 事务日志中的每个记录都由一个日志序列号 (LSN) 唯一标识。LSN 是这样排序的:如果 LSN2 大于 LSN1,则 LSN2 所标识的日志记录描述的更改发生在日志记录 LSN1 描述的更改之后。

发生重大事件的日志记录的 LSN 对于构造正确的还原顺序可能很有用。因为 LSN 是有顺序的,所以可以比较它们是否相等(即 <、>、=、<=、>=)。构造还原顺序时,这种比较很有用。

LSN 是数据类型为 numeric 的值 (25,0)。算术运算(例如加法或减法)对 LSN 没有任何意义,请不要与 LSN 一起使用。

RESTORE 顺序期间,在内部使用 LSN 跟踪数据还原到的时间点。还原备份后,数据被还原到与进行备份的时间点相对应的 LSN。差异和日志备份将还原的数据库推到稍后的时间,该时间与一个更高的 LSN 相对应。

日志备份 B 中出现的日志记录 n,在日志备份 A 中记录为 last_lsn,在日志备份 B 中记录为 first_lsn。

日志备份 A 的 last_lsn 等于日志备份 B 的 first_lsn

=======================================================================

虚拟日志文件(VLF)

SQL Server 数据库引擎在内部将每一物理日志文件分成多个虚拟日志文件。虚拟日志文件没有固定大小,且物理日志文件所包含的虚拟日志文件数不固定。数据库引擎在创建或扩展日志文件时动态选择虚拟日志文件的大小。数据库引擎尝试维护少量的虚拟文件。在扩展日志文件后,虚拟文件的大小是现有日志大小和新文件增量大小之和。管理员不能配置或设置虚拟日志文件的大小或数量。

只有当日志文件使用较小的 size 和 growth_increment 值定义时,虚拟日志文件才会影响系统性能。如果这些日志文件由于许多微小增量而增长到很大,则它们将具有很多虚拟日志文件。这会降低数据库启动以及日志备份和还原操作的速度。建议您为日志文件分配一个接近于最终所需大小的 size 值,并且还要分配一个相对较大的 growth_increment 值。

在SQL Server对于日志文件的管理,是将逻辑上一个ldf文件划分成多个逻辑上的虚拟日志文件(virtual log files,简称VLFs).以便于管理。那为什么SQL Server要把日志文件划分出多个VLFS呢?因为SQL Server通过这种方式使得存储引擎管理事务日志更加有效.并且对于日志空间的重复利用也会更加高效。使用VLF作为收缩数据库的最小单位比使用ldf文件作为最小单位无疑是更加高效的。

=======================================================================

Checkpoint

检查点的作用:控制内存缓冲区的数据写入到磁盘,当数据库宕机之后,我们可以利用更少的时间去恢复,数据库需要redo的时间就更少。checkpoint默认的时间间隔是1分钟;checkpoint控制数据从内存写入到磁盘的时间间隔,设置的时间越短,则数据库恢复的越快。

CheckPoint会将所有缓冲区的脏页写入磁盘,不管脏页中的数据是否已经Commit。这意味着有可能已经写入磁盘的“脏页”会在之后回滚(RollBack).不过不用担心,如果数据回滚,SQL Server会将缓冲区内的页再次修改,并写入磁盘。

通过CheckPoint的运作机制可以看出,CheckPoint的间歇(Recovery Interval)长短有可能会对性能产生影响。这个CheckPoint的间歇是一个服务器级别的参数。可以通过sp_config进行配置,也可以在SSMS中进行配置。

=======================================================================

TARGET_RECOVERY_TIME和”recovery interval”

参考:http://543925535.blog.51cto.com/639838/1424306

=======================================================================

sys.database的log_reuse_wait/log_reuse_wait_desc列

   

log_reuse_wait

log_reuse_wait_desc

正确响应已满事务日志在某种程度上取决于导致日志已满的情况。若要在给定情况下查找阻止日志截断的原因,请使用 sys.database 目录视图的 log_reuse_wait 列和 log_reuse_wait_desc 列。

=============================================================

2014年6.27日补充

大多数情况下,日志文件分配的空间大概为数据文件的20%左右就够了;数据文件和日志文件分开存放(如果底层存储阵列做了RAID,数据存放本身就是打散放在多块磁盘的,那么分开存放意义不大了);

默认的数据库自动增长为1M,日志为10%,这不符合最佳实践,频繁扩充对I/O有影响,建议文件自动增长幅度设置为100-500M比较合适;

================================================================

SQL Server 2012笔记分享-29:日志文件的工作方式相关推荐

  1. SQL Server 2012笔记分享-47:Database Recovery Advisor

    下面英文的部分,参考了官方的语言.     简单来说,两大优势: 帮助数据库管理员创建最佳的恢复序列 使用msdb中的备份历史纪录 The Database Recovery Advisor(数据库恢 ...

  2. SQL Server 2012笔记分享-48:备份时间线

    备份时间线是SQL server 2012数据库恢复顾问页面中的一项重要新功能,可以让我们更方便的基于备份时间点进行数据库的恢复. 在SQL server 2012的还原数据库界面,可以找到时间线,如 ...

  3. SQL Server 2012笔记分享-35:配置客户端网络协议

    客户端应用程序可以使用 TCP/IP.命名管道.VIA 或共享内存协议连接到 Microsoft SQL Server.可以通过使用 SQL Server Native Client dll 中包含的 ...

  4. SQL Server 2012笔记分享-6:理解内存管理

    内存管理 – SQL Server 2005/2008/2008r2 SQL Server 2012以前的版本(SQL 2005/2008/2008R2),有single page allocator ...

  5. SQL Server 2012笔记分享-49:理解数据库快照

    数据库快照是 SQL Server 数据库(源数据库)的只读静态视图. 自创建快照那刻起,数据库快照在事务上与源数据库一致. 数据库快照始终与其源数据库位于同一服务器实例上. 当源数据库更新时,数据库 ...

  6. SQL Server 2012笔记分享-52:可用性指标

    在电信和可靠性理论中,可用性是指: 系统,子系统,或者设备在开始一项任务时处在指定的可操作或可提交状态的程度,这项任务什么时候被用到是未知的,例如,是随机的.简单的说,可用性就是一个系统处在可工作状态 ...

  7. SQL Server 2012 开发新特性:文件表

    转载于 春哥 一.启用FileTable 1.修改数据库引擎的属性 打开"SQL Server配置管理器",修改SQL Server数据库引擎的属性.使用此页可针对此 Micros ...

  8. Sql Server实用操作-无数据库日志文件恢复数据库两种方法

    数据库日志文件的误删或别的原因引起数据库日志的损坏 方法一 1.新建一个同名的数据库 2.再停掉sql server(注意不要分离数据库) 3.用原数据库的数据文件覆盖掉这个新建的数据库 4.再重启s ...

  9. sql server 2012 如何收缩事务日志(脚本)

    sql2008不再支持 BACKUP LOG 数据库名 WITH NO_LOG   语句 BACKUP Log zxta with no_log 截断事务日志 sql2008 提示错误如下 BACKU ...

最新文章

  1. Java Web整合开发(85)
  2. 面试:InnoDB 中一棵 B+ 树可以存放多少行数据?
  3. viterbi算法_HMM模型和Viterbi算法如何应用于分词
  4. optee的共享内存的介绍
  5. ABAP 字符串操作
  6. linux主机拷贝文件到另一台主机
  7. VS2008 fatal error LNK1000: Internal error during IncrBuildImage 解决方案
  8. 日常生活小技巧 -- UltraEdit复制16进制数据
  9. docker安装前提条件
  10. 想让照片里的美女“回头”?清华MIT谷歌用AI帮你实现了
  11. MacOS开发必备工具brew,安装nginx反向代理,替代linux工具 apt-get和 yum
  12. 第七章 软件配置管理
  13. 【uniapp】实现H5微信分享
  14. 力科(Lecroy)示波器专用波形文件(轨迹文件/trace文件/.trc文件)在MATLAB上的解析与回写
  15. Python -- 手动搭建HTTP服务器
  16. Tcpdump 命令——筑梦之路
  17. 7z 快速、高压缩率的命令参数 压缩方法
  18. 比较两组数据的差异用什么图更直观_扩增子图表解读7三元图:三组差异数量和关系...
  19. 华为路由器、交换机、AC忘记密码,但是想保留配置怎么处理
  20. 推荐 GitHub 上很火的录屏工具,秒杀 33 种同行工具

热门文章

  1. 嵌入式linux mono,嵌入式linux/android alsa_aplay alsa_amixer命令行用法(示例代码)
  2. super.getClass()方法调用返回结果的原因
  3. 为您详细解析防火墙的工作原理
  4. 201712-1最小差值
  5. destoon代码从头到尾捋一遍
  6. Hadoop从0开始 (安装配置:转) (一) - 沐魇
  7. Android ExpandableListView几个特殊的属性
  8. Android ListView侧滑item,仿QQ删除效果
  9. python 列表创建
  10. step1.day12 Linux下使用C语言编程基础总结