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 次 |
最近记录: |