是否有可能用完日志序列号?

Sco*_*red 6 sql-server transaction-log

我一直想知道为事务日志记录生成日志序列号的算法,我担心如果工作负载足够大,可能会用完日志序列号。

在这种情况下会发生什么?

Sco*_*red 12

我从Paul Randal写的一篇文章中找到了以下答案。

是否有可能用完日志序列号?

保罗写道:

无需担心,因为出于所有实际目的,不可能用完日志序列号。作为背景知识,日志序列号是用于唯一标识事务日志记录的三部分编号——由包含日志记录的虚拟日志文件 (VLF) 的序列号、虚拟日志中的日志块号构成。日志文件,以及日志块内的日志记录号。

这并不重要,但重要的是 VLF 序列号是 64 位数字。每当在事务日志中重用 VLF 时,VLF 序列就会增加 1。所以让我们做一些数学计算。

想象一个有 65,536 个 VLF 的事务日志,每个大小为 1/4MB(这不是荒谬的情况,这取决于您的事务日志的管理方式—有关此内容和事务日志内部结构的更多详细信息,请参阅 “正确事务日志大小管理的重要性” ." . 每次日志用完并回绕到开始时,VLF 序列号将增加65,536,即2 的16 次方(2^16)。

一个 64 位数字可以支持 2^64 个值。为了能够用尽 2^64 个可能的 VLF 序列号,我们的示例事务日志必须包装 2^64 / 2^16 = 2^48 次。这是很多日志包装。但这相当于多少事务日志?

我们的示例日志大小为 65,536 x 1/4MB,即 16GB。要将该日志包装 2^48 次,您需要生成 2^48 x 16GB 的事务日志,这相当于 40 亿 PB(1 PB = 1024 TB)的事务日志——这是一项艰巨的任务!

即使能够将该日志写入能够持续 600MBps 的固态驱动器 (SSD),也需要 40 亿 PB / 600 兆字节 = 大约 2.4 亿年才能生成 40 亿 PB 的事务日志。如您所见,没有人会面临日志序列号用完的危险!