• 事物日志的组织架构


    1 事物日志文件是ldf结尾的文件  它是由虚拟日志(virtual log files vlf )组成的。SQLSERVER中在创建数据库的时候,新建ldf文件的大小规定了vlf的数量;

       SQL Server创建数据库时,根据日志文件(ldf)的大小,生成VLF的数量公式如下:

    ldf文件的大小

    VLF的数量

    1M到64M

    4

    64M到1GB

    8

    大于1GB

    16

    查询虚拟日志文件个数的  DBCC loginfo

    WAL技术 基本主流的数据库 包括oracle sqlserver db2 mysql都使用了WAL技术 预写式日志(Write-Ahead Logging)  wal的核心思想是 数据写入数据库前,先写入日志。

    对于数据的每笔记录,都会写入日志中,所以对于数据的修改实时的写入磁盘中并没有太大的意义。即使当sqlserver发生崩溃后,在恢复Recovery过程中那些不该写入磁盘的数据会被回滚RollBack。那些应该被写入磁盘却没有写入的数据会被重做  Redo.

    从而保证了持久性 Durablility;

    WAL还会提升性能。通过WAL技术,每次提交的数据修改并不会立刻反映到数据库中。而是先记录到日志,在随后的Checkpoint 和lazyWrite中一并提交。如果没有WAL技术,则需要每次提交数据就写入数据库。

    SQL Server修改数据的步骤

         SQL Server对于数据的修改,会分为以下几个步骤顺序执行:

         1.在SQL Server的缓冲区的日志中写入”Begin Tran”记录

         2.在SQL Server的缓冲区的日志页写入要修改的信息

         3.在SQL Server的缓冲区将要修改的数据写入数据页

         4.在SQL Server的缓冲区的日志中写入”Commit”记录

         5.将缓冲区的日志写入日志文件

         6.发送确认信息(ACK)到客户端(SMSS,ODBC等)

      

    可以看到,事务日志并不是一步步写入磁盘.而是首先写入缓冲区后,一次性写入日志到磁盘.这样既能在日志写入磁盘这块减少IO,还能保证日志LSN的顺序.

         上面的步骤可以看出,即使事务已经到了Commit阶段,也仅仅只是把缓冲区的日志页写入日志,并没有把数据写入数据库.那将要修改的数据页写入数据库是在何时发生的呢?

    Lazy Writer和CheckPoint

        上面提到,SQL Server修改数据的步骤中并没有包含将数据实际写入到磁盘的过程.实际上,将缓冲区内的页写入到磁盘是通过两个过程中的一个实现:

         这两个过程分别为:

         1.CheckPoint

         2.Lazy Writer

        任何在缓冲区被修改的页都会被标记为“脏”页。将这个脏页写入到数据磁盘就是CheckPoint或者Lazy Writer的工作.

        当事务遇到Commit时,仅仅是将缓冲区的所有日志页写入磁盘中的日志文件:

        3

         而直到Lazy Writer或CheckPoint时,才真正将缓冲区的数据页写入磁盘文件:

        4

       

        前面说过,日志文件中的LSN号是可以比较的,如果LSN2>LSN1,则说明LSN2的发生时间晚于LSN1的发生时间。CheckPoint或Lazy Writer通过将日志文件末尾的LSN号和缓冲区中数据文件的LSN进行对比,只有缓冲区内LSN号小于日志文件末尾的LSN号的数据才会被写入到磁盘中的数据库。因此确保了WAL(在数据写入到数据库之前,先写入日志)。

    Lazy Writer和CheckPoint的区别

        Lazy Writer和CheckPoint往往容易混淆。因为Lazy Writer和CheckPoint都是将缓冲区内的“脏”页写入到磁盘文件当中。但这也仅仅是他们唯一的相同点了。

        Lazy Writer存在的目的是对缓冲区进行管理。当缓冲区达到某一临界值时,Lazy Writer会将缓冲区内的脏页存入磁盘文件中,而将未修改的页释放并回收资源。

        而CheckPoint存在的意义是减少服务器的恢复时间(Recovery Time).CheckPoint就像他的名字指示的那样,是一个存档点.CheckPoint会定期发生.来将缓冲区内的“脏”页写入磁盘。但不像Lazy Writer,Checkpoint对SQL Server的内存管理毫无兴趣。所以CheckPoint也就意味着在这个点之前的所有修改都已经保存到了磁盘.这里要注意的是:CheckPoint会将所有缓冲区的脏页写入磁盘,不管脏页中的数据是否已经Commit。这意味着有可能已经写入磁盘的“脏页”会在之后回滚(RollBack).不过不用担心,如果数据回滚,SQL Server会将缓冲区内的页再次修改,并写入磁盘。

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

        5

        恢复间歇的默认参数是0,意味着由SQL Server来管理这个回复间隔。而自己设置恢复间隔也是需要根据具体情况来进行界定。更短的恢复间歇意味这更短的恢复时间和更多的磁盘IO,而更长的恢复间歇则带来更少的磁盘IO占用和更长的恢复时间.

        除了自动CheckPoint之外,CheckPoint还会发生在Alter DataBase以及关闭SQL Server服务器时。sysadmin和db_backupoperator组的成员以及db_owner也可以使用CheckPoint指令来手动保存CheckPoint:

        6

        通过指定CheckPoint后的参数,SQL Server会按照这个时间来完成CheckPoint过程,如果时间指定的短,则SQL Server会使用更多的资源优先完成CheckPoint过程。

        通常情况下,将“脏”页写入磁盘的工作,Lazy Writer要做的比CheckPoint会多出许多。

  • 相关阅读:
    组合和继承
    解决不了问题
    [zz]shared_ptr 在 stl容器中排序的陷阱
    char ** 初始化
    [zz]c++ list sort方法
    [zz]ZeroMQ的学习和研究
    shared_prt自己使用记录
    rapidxml使用笔记
    HDOJ_ACM_I love sneakers!
    HDOJ_ACM_PiggyBank
  • 原文地址:https://www.cnblogs.com/yachao1120/p/8574915.html
Copyright © 2020-2023  润新知