Sql Server 事务日志(二)

            Sql Server在将每次更新写入到数据文件之前,会先顺序的将更改 写入到日志文件。这种技术应用到很多种类的数据库上,这种预先写入日志的技术,称之为WAL(write  ahead logging)。

            由于每次数据修改都会被写到事务日志中,所以,在数据库崩溃自动恢复时,已经完成提交的事务会被Redo,而未提交的事务会RollBack。

            对于一个事务来说,他是在何时写入到日志文件呢。对于任何数据修改,都是在数据缓存中进行的,缓存中的数据被修改之前,将在记录修改的日志高速缓存中生成一条记录,然后修改缓存中的数据页,若事务被提交,则日志会写到磁盘。在此,需要注意的一点是,如果一个事务比较大,则可能出现即使事务未提交,日志也被写入到磁盘的情况。所以,日志告诉缓存中的记录在以下两种情况下会写入磁盘:

            1. 事务提交时;

            2. 有超过60KB的日志没有刷新写入磁盘;

            则日志记录写入日志文件的大致流程示意图如下:

            

              sql server 数据修改分步骤来说如下 :

              1. SQL Server 在日志缓存中写入Begin Tran 记录

              2. 在日志缓存中写入要修改的信息

              3. 修改缓存中的数据页;

              4. 日志缓存中记录Commit

              5. 将日志缓存刷新到磁盘

              6. 返回给客户端事务执行成功。

            需要注意的是,每次事务提交都会造成日志刷新,且只有等待日志刷新到磁盘后,事务才算提交成功,因此,日志文件所在磁盘的延迟会直接影响到事务的执行时间。

            

            数据修改被写入日志文件之后,数据是如何写入数据文件呢,SQL Server通过 CheckPoint 和 Lazy writer两个存储过程将缓存中的数据页写入数据文件。

            上面提及到,事务在提交时,只是日志高速缓存中的记录写入到日志文件,数据缓存中的数据页并没有写入到数据文件

            

          做CheckPoint 或 Lazy Writer后,数据缓存写入磁盘

           

           CheckPoint和Lazy Writer 区别

           首先,两者都可将数据缓存中的“脏”页写入数据文件。

           Lazy Writer 的主要作用是对缓存区进行管理,并管理缓存区可用资源列表,CheckPoint不会;

           CheckPoint 的触发条件

           1.自上次检查点后产生大量日志

           2.数据库实例关闭

           3.数据库完备或差异备份

           Lazy writer触发条件

           1.缓存数据页不足

           2.windows 系统存在内存压力

          

posted @ 2015-07-02 23:28  风言  阅读(236)  评论(0)    收藏  举报