• 【数据库事务日志碎片原理分析与方案】分析篇


    前言:对于Log日志文件,相信大家都应该非常的熟悉了,Log日志文件的优化是性能调优和故障排除中的一个老大难。
    在优化的过程中,常常有人说”把Log日志放在单独的磁盘上面,并且将其自动增长禁止,并且把大小设置的和磁盘大小接近,可以提高性能“,确实,这句话看起来很对,但是最后发现似乎又不太对。

    通过研究和学习,也看了一些国外社区的文章,发布此文。

    一般而言,我们都没有必要去关心事务日志中的虚拟日志文件的个数。这里提到的“虚拟日志文件”的概念,我们后面会进行专门的讲述。很多的时候,我们在建立数据库的时候,都采用了它的默认配置,即:将日志的增长方式设定为“自动增长”,这样会直接导致一个后果就是“文件碎片”,从而直接导致整个数据库的性能严重下降。那么,如何避免这种情况?如何识别碎片问题?如何解决问题?这就是我们本篇文章要讲述的内容了。

    首先,我们来看看什么是“虚拟日志文件”。


     

    我们知道,在正常的数据库操作中,SQL Server会以顺序的方式去写日志文件,记录DLLDML的操作的详细信息。每一个日志记录都有一个与之相关的逻辑序列号(LSN)。这些LSN处于不断增长的状态,这就是说LSN2的日志记录所代表的操作在LSN1之后进行。并且最近添加的日志记录的LSN号码最大。

    SQL Server内部,SQL Server将日志文件的空间划分为很多不同的“块”,也称之为“虚拟日志文件”(VLF)。看看到下面的一个图:

     

    SQL Server首先将会把事务的详细信息记录到第一个可用的VLF中,此时也就是写到VLF1中。并且,在写的过程中,日志记录是按照顺序写入的,也就是说首先会写满VLF1,然后写VLF2,以此类推。如果最后全部的VLF都写满了之后,日志会循环写入,也就说,日志会再在写入VLF1中,将VLF1中之前的日志记录覆盖,当然,这个写入是有条件的,即:只有在VLF1是可重用的情况下才能写入。


     

    到这里,大家可能会有很多的问题,其中一个就是:如何知道VLF1现在是否可被重用。先不急,接着看。

    为了使得大家对日志的写入有一个更好的理解,我们通过下面的一个图来说明:

     

    上面的图描述了一个简单的场景:一个事务T1T3已经提交,而T2T4处于运行状态,并且在LSN10的地方执行一个CheckPoint操作。

    现在我们的有4VLF文件,每一个VLF中都包含了4个事物日志记录。这些日志记录包含了四个事务的详细信息。在图中,LSN1表明这个事务T1开始的点,LSN2记录T1事务执行的一个Update操作的详细信息,LSN3记录了T1事务执行了Commit操作,LSN4,又是另外一个事务T2开始的点,以此类推。


     

    注意:完全可以存在一个事务的日志记录跨越多个VLF,道理很简单,大家自己想想


     

    从上面的图中可以看出,现在存在2个活动的事务(T2T4)。而LSN4是最先活动事务T2的开始点。

    在图中还有一个所谓的MinLSN,就是最先开始的一条活动的日志记录。执行CheckPoint的地方是MaxLSN,就是活动日志最后的点,因为后面还没有写入新的日志记录。其实所谓的活动日志,主要是因为这些日志有可能被用来执行回滚操作。


     

    在这里朋友们可能就要问了:在上图中,T3中的事务不是已经提交了吗,应该不属于活动日志啊


     

    确实,原本应该是这样的,但是在T3之后,又开始了T4,而且还没有提交,从而使得T3处于没有提交的事务T2T4之间,导致这一连串的都成为“活动的“。我们再把问题延伸一下:如果在LSN10后面又开始了新的事务,而且T2事务还没有提交,那么会导致活动日志的范围变得更大。所以希望这里大家可以明白我的意思。


     

    包含有活动日志的VLF就是处于活动的状态,图中的VLF1-3都是活动的,如果VLF是活动的,那么就不能被重用。什么意思呢

    我们现在试想一下:如果T2事务一直提交,而新的事务不断的在开启,那么最后的结果就是VLF1-4中都包含活动日志,使得所以的VLF都是活动的,如果VLF4已经空间写完,此时数据库发现它不能循环的写入,即不能再从VLF1开始写,因为VLF1是活动的,这个时候,数据库就分配新的空间,分配新的VLF,然后再写入。试想,如果总是这样,那么,势必会导致文件碎片。所以这也是为什么避免事务运行时间过长的原因之一。

    为了加深大家的理解,我们看到下面的一个图:

     

     

     

    在上图中,此时活动日志包含在VLF4中,而VLF1-3都是非活动的 ,所以如果日志不断写入导致VFL4写满,此时日志会再次写入VLF1,然后是VLF2,以此类推!


     

    今天就到这,明天开始讲述与日志相关的性能与设置问题。

     

    【数据库事务日志碎片原理分析与方案】-深入解析篇

     负载均衡详解第一篇:负载均衡的需求.pdf

    作者:小洋,燕洋天
    出处:http://yanyangtian.cnblogs.com/

    承接架构设计,性能优化(程序,数据库等方面)技术咨询

    高质量干货文章 

  • 相关阅读:
    python实现模拟登录
    python进阶八_警告和异常
    我的软考之路(六)——数据结构与算法(4)之八大排序
    Modern source-to-source transformation with Clang and libTooling
    heibernate增删改查总结一下自己的不足
    hibernate之增删改查demo
    前台之boostrap
    <input value="hidden">的作用
    Active Desktop--桌面字体背景被修改
    中文乱码问题解决方法总结
  • 原文地址:https://www.cnblogs.com/Leo_wl/p/2645221.html
Copyright © 2020-2023  润新知