Sti*_*ijn 7 sql-server restore
我有一个 SQL Server 2005 数据库,其中包含一些具有时间戳(或 RowVersion)列的表。我需要知道当前时间戳的值,因此我使用以下查询:SELECT CAST(@@dbts AS BIGINT);
例如,这将返回10505。
紧接着,没有更新,插入,......任何事情,我执行 aBACKUP DATABASE和 aRESTORE DATABASE并SELECT再次运行查询。只是这一次,结果是14000,而表中的时间戳没有增加。
为什么/如何发生这种情况?
Mar*_*ith 13
的值dbi_maxDbTimestamp存储在数据库引导页上。(主要数据文件中的第 9 页)。
每次分配时间戳值时都不会写入此值。相反,SQL Server 一次保留几千个。
例如,如果@@DBTS是2000并且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)
在我的系统上,新创建的数据库@@dbts是2,000. DBCC PAGE上面的输出是

我已经突出显示了时间戳值。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但正在查看页面本身。

时间戳值已更改。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。
| 归档时间: |
|
| 查看次数: |
1687 次 |
| 最近记录: |