3. SQLServer存储引擎之日志篇

  (3.1)日志结构

  (3.1.1)物理日志

    (0)物理日志即数据库的.ldf文件, 当然后缀名是可以自定义的,默认是.ldf

    (1)一个SqlServer数据库,可以定义多个物理日志文件,SQL Server逻辑上把他们当作一个整体,顺序写入日志记录,用完第一个,再用下一个:即第一个日志文件的当前空间,如果没有可分配的VLF时,就会使用下一个日志文件的VLF,直到最后一个日志文件也没有可分配的VLF时,会重新回到第一个日志开始增长;VLF的使用如下图:

                        

      SQLServer把事务日志文件划分为多个VLF(Virtual Log File),即虚拟日志文件。

    (2)物理日志文件初始大小至少为512KB

    (3)日志文件不可以放在文件组内

  (3.1.2)虚拟日志

    (0)日志文件除了文件头页外,其他VLF部分都不是以数据页的方式来存储的,物理日志以虚拟日志(VLF)为最小单位进行增长、收缩和使用,通常VLF大小为256KB,但第一个VLF的大小最小为8K,因为第一个页面8K为日志文件头页面。

    (1)虚拟日志是由SQLServer来维护的,大小不一,数量不定,不可以人工干预,但可以事先分配较大的物理日志,或者设置较大的物理日志的增量,以减少虚拟日志的生成,从而减少数据库维护虚拟日志的成本,以及提高数据库启动,备份还原的速度。

  (3.1.3)逻辑日志

    (0)数据库逻辑操作的记录,每个事务可能会有多条日志记录,每条日志记录由唯一的顺序增长的LSN来标记,通过DBCC LOG()来查看日志文件如下图:

                                            

    (1)SQL Server用日志记录来保证事务的基本属性,及数据库恢复。

    (2)SQLServer数据库遵循预写日志(WAL)的原则。

  (3.1.4)活动日志

    (0)从MinLSN起往后的日志部分即为活动日志。如下图,以最早活动事务起点LSN142作为MinLSN,从142往后的日志部分为活动日志:

                                               

    (1)检查点LSN、最早活动事务起点LSN、尚未传递给分发数据库的最早的复制事务起点的LSN,当中的最小值将作为MinLSN;

  

  (3.2)日志管理

    (3.2.1)截断

      (0)SQL SERVER可以通过截断日志以实现物理日志的回绕,截断操作仅是将被截断的日志部分标记为可重用,根据数据库恢复模式的设置:SIMPLE/BULK_LOGGED/FULL,在SIMPLE模式下,SQL SERVER会自动截断日志,类似于ORACLE的非归档模式。

      (1)SIMPLE模式下,CHECKPOINT会自动截断日志的非活动部分,FULL和BULK_LOGGED模式下,只有通过日志备份来截断日志。

      (2)SQL SERVER截断日志后,并不会主动释放日志文件占用的磁盘空间,需要手动去收缩日志文件才会释放,但通常不建议这样做,毕竟当日志文件再次增长时又需要去重新申请磁盘空间。

      (3)日志文件的截断以VLF为单位,从不活动的日志记录所在的第一个VLF起,到MinLSN所在的VLF的前一个VLF,如下图:

                                      

      (4)只可以截断非活动日志部分。

      (5)当运行一个长事务且一直未结束时,此时会影响MinLSN的推进,进而影响日志文件的截断,从而会出现,即便是SIMPLE模式下,日志文件也会变得很大,甚至出现吃掉磁盘所有空间,出现事务日志已满的9002错误。

    (3.2.2)备份

      (0)SQL SERVER没有ORACLE中的ARCH进程,无法像ORACLE一样自动归档日志,需要手动去备份,而且在有多个物理日志文件时,也无法对单个日志文件进行备份。

      (1)当数据库故障恢复时,在线的日志需要手动通过NO_TRUNCATE选项去备份,即尾日志备份,然后再利用尾日志备份结合之前的备份进行故障恢复。

    (3.2.3)还原

      还原在两种情况下发生,一是数据库重启时;一是手动通过备份集恢复时;

      (0)还原的过程,是把数据和日志放在内存中,模拟用户读写操作以进行的。还原时只需要重做或撤销最后一个检查点之后的日志部分,这也是检查点机制提高恢复效率的原因所在。

      (1)REDO和UNDO:

        还原时如果事务日志已结束(提交或回滚),而且数据页尚未被刷新,则重做(REDO);

        如果事务日志未结束,但数据脏页已被刷新到磁盘,则回滚(UNDO)。

      (2)日志记录中包含数据页被修改前及当次修改的两个LSN,如果目前数据页头的LSN等于修改前的LSN,则日志操作被重做;如果数据页头的LSN等于或大于当次修改的LSN,则跳过日志操作,不重做。

      (3)数据库重启不需要人工干预,通过备份集恢复需要人工干预。因为有时需要恢复到某个操作点,并不是完全恢复所有日志记录。

SQLServer存储引擎——03.日志的更多相关文章

  1. SQLServer存储引擎——02.内存

    SQLServer存储引擎之内存篇: (1)SQL SERVER 内存结构        SQL SERVER 内存结构简图 SQL SERVER 内存空间主要可分为两部分: (1.1)可执行代码(E ...

  2. SQLServer存储引擎——05.索引的结构和分类

    5. SQLServer存储引擎——索引的结构和分类 关系型数据库中以二维表来表达关系模型,表中的数据以页的形式存储在磁盘上,在SQL SERVER中,数据页是磁盘上8k的连续空间,那么,一个表的所有 ...

  3. MySQL的存储引擎与日志说明

    1.1 存储引擎的介绍 1.1.1 文件系统存储 文件系统:操作系统组织和存取数据的一种机制.文件系统是一种软件. 类型:ext2 3 4 ,xfs 数据.  不管使用什么文件系统,数据内容不会变化, ...

  4. MySql中innodb存储引擎事务日志详解

    分析下MySql中innodb存储引擎是如何通过日志来实现事务的? Mysql会最大程度的使用缓存机制来提高数据库的访问效率,但是万一数据库发生断电,因为缓存的数据没有写入磁盘,导致缓存在内存中的数据 ...

  5. MySQL查看当前用户、存储引擎、日志

    #查看MySQL的当前用户 mysql> SELECT USER(); +----------------+ | USER() | +----------------+ | root@local ...

  6. SQLServer存储引擎——04.数据

    4. SQL SERVER存储引擎之数据篇 (4.1)文件 (0)主数据文件.mdf初始文件大小至少为3MB,次要数据文件.ndf初始大小,同日志文件一样至少为512KB: (1)SQL SERVER ...

  7. SQLServer存储引擎——01.数据库如何读写数据

    一.引言 在SQL Server数据库中,数据是如何被读写的?日志里都有些什么?和数据页之间是什么关系?数据页又是如何存放数据的?索引又是用来干嘛的? 一起看看SQL Server的存储引擎. 二.S ...

  8. 0728MySQL数据库InnoDB存储引擎重做日志漫游REDOLOG,UNDOLOG

    转自http://www.mysqlops.com/2012/04/06/innodb-log1.html 00 – Undo LogUndo Log 是为了实现事务的原子性,在MySQL数据库Inn ...

  9. Mysql基本用法-存储引擎-03

    看到存储引擎这个地方感到很多细节比较陌生,所以总结小记一些 为了适应各种不同的运行环境,MYSQL提供了多种不同的存储引擎(Storage Engine ),在应用程序开发这个层面上,开发者可以根据不 ...

随机推荐

  1. [转]使用Flexible实现手淘H5页面的终端适配

    曾几何时为了兼容IE低版本浏览器而头痛,以为到Mobile时代可以跟这些麻烦说拜拜.可没想到到了移动时代,为了处理各终端的适配而乱了手脚.对于混迹各社区的偶,时常发现大家拿手机淘宝的H5页面做讨论—— ...

  2. 最长递增子序列 LIS 时间复杂度O(nlogn)的Java实现

    关于最长递增子序列时间复杂度O(n^2)的实现方法在博客http://blog.csdn.net/iniegang/article/details/47379873(最长递增子序列 Java实现)中已 ...

  3. PIX v2版本中Query 失败时, ERR段的构造

    在ITI-9中描述PIX query事务的几个TestCase场景.其中有些是对于Query失败的描述. ERR 段包含Error location, Error code, Error code t ...

  4. svn更新报错:出现skipped:目标路径

    skipped 意为:跳过此目标文件: 一般出现在目标文件被删除后,重新更新情况下: 解决办法及结果: 1,回到此目标文件的上一层文件夹,team-clean up,结果不成功 2,回到此目标文件的上 ...

  5. Intellij IDEA 发布后的项目在哪里

    Intellij IDEA 中使用 tomcat 并发布项目后,项目并没有出现在在 webapps 文件夹中,如果没有手动修改过部署目录的话,idea的真实部署目录为 File---->Proj ...

  6. 【OpenCV】基于图像处理和模式识别的火灾检测方法

    学期末一直忙考试,大作业,很久没来CSDN耕耘了... 虽然考试都结束了,手头还是累积了不少活儿要补,不多写了,晒个小项目,之前一直做的,后来当做模式识别课程的大作业交了. 大体框架如下: 还是之前的 ...

  7. NodeJs之文件合并(某一文件的内容发生变化与之相关的内容重新合并)

    首先,一个文件里面的内容是由多个文件共同组成的.例如一个文件夹包含有多文件(文件夹) 然后,当其中一个发生变化时所用与之有直接作用的文件(文件夹)都会重新组合. /*注意:该例子需要在同级目录下完成及 ...

  8. div的作用

    <div></div>主要是用来设置涵盖一个区块为主,所谓的区块是包含一行以上的数据,所以在<div></div>的开始之前与结束后,浏览都会自动换行, ...

  9. 【转】Xcode 清理存储空间

    移除 Xcode 运行安装 APP 产生的缓存文件(DerivedData) 只要重新运行Xcode就一定会重新生成,而且会随着运行程序的增多,占用空间会越来越大.删除后在重新运行程序可能会稍微慢一点 ...

  10. spl_autoload_register()和__autoload()2

    这也是OO设计的基本思想之一.在PHP5之前,如果需要使用一个类,只需要直接使用include/require将其包含进来即可.下面是一个实际的例子:   class ClassA{ public f ...