Der Wert für dbi_maxDbTimestamp
wird auf der Datenbankstartseite gespeichert. (Seite 9 in der Primärdatendatei).
Dies wird nicht jedes Mal geschrieben, wenn ein Zeitstempelwert zugewiesen wird. Stattdessen reserviert SQL Server jeweils einige Tausend.
Wenn beispielsweise @@DBTS
is 2000
und the dbi_maxDbTimestamp
is ist, 2000
aktualisiert SQL Server den auf der Startseite geschriebenen Wert auf 6000
das nächste Mal, wenn ein Zeitstempelwert benötigt wird.
Die Werte von 2001 - 5999
werden im Speicher zugewiesen und "verloren", wenn die Datenbank offline und dann wieder online gesetzt wird.
Die Sicherung enthält die Kopie der Startseite, auf die aktualisiert wurde 6000
. Nach dem Wiederherstellen beginnen die Zeitstempelwerte mit dieser Zahl. Es weiß nichts über verlorene Zwischenwerte.
Um das zu sehen
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)
Auf meinem System für eine neu erstellte Datenbank @@dbts
ist 2,000
. Die DBCC PAGE
Ausgabe von oben ist
Ich habe den Zeitstempelwert hervorgehoben. 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)
Jetzt wird das @@dbts
als 2001
aber auf die Seite selbst schauend gemeldet .
Der Zeitstempelwert hat sich geändert. CAST(CAST(REVERSE(0x7017000000000000) AS BINARY(8)) AS BIGINT)
= 6000
.
Laufen
DBCC DBTABLE('DbtsTest')
Zu diesem Zeitpunkt zeigt die DBTABLE
Struktur beide Werte an
dbt_maxDbTimestamp = 6000
dbt_dbTimestamp = 2001
Schließlich
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
Ein Blick auf das Backup zeigt dann, dass es sich um die 6.000-Zahl handelt, die geschrieben wurde.
Das Wiederherstellen der Datenbank und das Abfragen von SELECT CAST(@@DBTS AS BIGINT)
Retouren 6,000
wie erwartet.