为什么备份/恢复后@@dbts 会增加?

Sti*_*ijn 7 sql-server restore

我有一个 SQL Server 2005 数据库,其中包含一些具有时间戳(或 RowVersion)列的表。我需要知道当前时间戳的值,因此我使用以下查询:SELECT CAST(@@dbts AS BIGINT);

例如,这将返回10505

紧接着,没有更新,插入,......任何事情,我执行 aBACKUP DATABASE和 aRESTORE DATABASESELECT再次运行查询。只是这一次,结果是14000,而表中的时间戳没有增加。

为什么/如何发生这种情况?

Mar*_*ith 13

的值dbi_maxDbTimestamp存储在数据库引导页上。(主要数据文件中的第 9 页)。

每次分配时间戳值时都不会写入此值。相反,SQL Server 一次保留几千个。

例如,如果@@DBTS2000并且dbi_maxDbTimestamp也是,2000那么 SQL Server6000会将写入引导页的值更新为下次需要时间戳值时。

2001 - 5999如果数据库设置为脱机然后再次联机,则来自的值在内存中分配并“丢失”。

备份包含已更新为6000. 所以在恢复它时,时间戳值将从这个数字开始。它对任何丢失的中间值一无所知。

看到这个

CREATE DATABASE DbtsTest

GO

USE DbtsTest

GO

DBCC TRACEON(3604);

CREATE TABLE T (X ROWVERSION)

SELECT CAST(@@dbts AS BIGINT);

DBCC PAGE(DbtsTest,1,9,1)
Run Code Online (Sandbox Code Playgroud)

在我的系统上,新创建的数据库@@dbts2,000. DBCC PAGE上面的输出是

DBCC 第 1 页

我已经突出显示了时间戳值。CAST(CAST(REVERSE(0xD007000000000000) AS BINARY(8)) AS BIGINT)=2000

INSERT INTO T DEFAULT VALUES

SELECT CAST(@@dbts AS BIGINT);
DBCC PAGE(DbtsTest,1,9,1)
Run Code Online (Sandbox Code Playgroud)

现在@@dbts报告为2001但正在查看页面本身。

DBCC 第 2 页

时间戳值已更改。CAST(CAST(REVERSE(0x7017000000000000) AS BINARY(8)) AS BIGINT)= 6000.

跑步

DBCC DBTABLE('DbtsTest')
Run Code Online (Sandbox Code Playgroud)

此时查看DBTABLE结构显示两个值

dbt_maxDbTimestamp = 6000           
dbt_dbTimestamp = 2001
Run Code Online (Sandbox Code Playgroud)

最后

BACKUP DATABASE [DbtsTest] TO  
DISK = N'C:\Program Files\Microsoft SQL Server\MSSQL11.SQL2012\MSSQL\Backup\DbtsTest.bak' 
WITH NOFORMAT, 
     NOINIT,  
     NAME = N'DbtsTest-Full Database Backup', 
     SKIP, 
     NOREWIND, 
     NOUNLOAD,  
     STATS = 10
Run Code Online (Sandbox Code Playgroud)

然后查看备份显示它是写入的 6,000 数字。

在此处输入图片说明

恢复数据库并按预期查询SELECT CAST(@@DBTS AS BIGINT)返回6,000