网站建设.龙兵,wordpress注册页面更改,无锡微盟网络科技有限公司,2019个人建网站前言:说都数据库的事务日志#xff0c;可以说我们是再熟悉不过的了。一般而言#xff0c;我们都没有必 要去关心事务日志中的虚拟日志文件的个数。这里提到的“虚拟日志文件”的概念#xff0c;我们 后面会进行专门的讲述。很多的时候#xff0c;我们在建立数据库的时候可以说我们是再熟悉不过的了。一般而言我们都没有必 要去关心事务日志中的虚拟日志文件的个数。这里提到的“虚拟日志文件”的概念我们 后面会进行专门的讲述。很多的时候我们在建立数据库的时候都采用了它的默认配置 即:将日志的增长方式设定为“自动增长”这样会直接导致一个后果就是“文件碎片” 从而直接导致整个数据库的性能严重下降。那么如何避免这种情况?如何识别碎片问题? 如何解决问题?这就是我们本篇文章要讲述的内容了。
首先我们来看看什么是“虚拟日志文件”。
我们知道在正常的数据库操作中SQL Server 会以顺序的方式去写日志文件记录 DLL 和 DML 的操作的详细信息。每一个日志记录都有一个与之相关的逻辑序列号(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 操作。
现在我们的有 4 个 VLF 文件每一个 VLF 中都包含了 4 个事物日志记录。这些日志记录包 含了四个事务的详细信息。在图中LSN1 表明这个事务 T1 开始的点LSN2 记录 T1 事务 执行的一个 Update 操作的详细信息LSN3 记录了 T1 事务执行了 Commit 操作LSN4 又是另外一个事务 T2 开始的点以此类推。
注意:完全可以存在一个事务的日志记录跨越多个 VLF道理很简单大家自己想想。
从上面的图中可以看出现在存在 2 个活动的事务(T2T4)。而 LSN4 是最先活动事务 T2 的开始点。
在图中还有一个所谓的 MinLSN就是最先开始的一条活动的日志记录。执行 CheckPoint 的地方是 MaxLSN就是活动日志最后的点因为后面还没有写入新的日志记录。其实所 谓的活动日志主要是因为这些日志有可能被用来执行回滚操作。
在这里朋友们可能就要问了:在上图中,T3 中的事务不是已经提交了吗应该不属于活动 日志啊?
确实原本应该是这样的但是在 T3 之后又开始了 T4而且还没有提交从而使得 T3 处于没有提交的事务 T2 和 T4 之间导致这一连串的都成为“活动的“。我们再把问题 延伸一下:如果在 LSN10 后面又开始了新的事务而且 T2 事务还没有提交那么会导致 活动日志的范围变得更大。所以希望这里大家可以明白我的意思。
包含有活动日志的 VLF 就是处于活动的状态图中的 VLF1-3 都是活动的如果 VLF 是活 动的那么就不能被重用。什么意思呢?
我们现在试想一下:如果 T2 事务一直提交而新的事务不断的在开启那么最后的结果 就是 VLF1-4 中都包含活动日志使得所以的 VLF 都是活动的如果 VLF4 已经空间写完 此时数据库发现它不能循环的写入即不能再从 VLF1 开始写因为 VLF1 是活动的这个 时候数据库就分配新的空间分配新的 VLF然后再写入。试想如果总是这样那么 势必会导致文件碎片。所以这也是为什么避免事务运行时间过长的原因之一。
为了加深大家的理解我们看到下面的一个图:
在上图中此时活动日志包含在 VLF4 中而 VLF1-3 都是非活动的 所以如果日志不断写 入导致 VFL4 写满此时日志会再次写入 VLF1然后是 VLF2以此类推!