Ich habe eine SQL Server 2005-Datenbank, die einige Tabellen enthält, die eine Timestamp- (oder RowVersion-) Spalte haben. Ich muss den Wert des aktuellen Zeitstempels kennen, daher verwende ich die folgende Abfrage:SELECT CAST(@@dbts AS BIGINT);
Dies gibt beispielsweise 10505 zurück .
Unmittelbar danach, ohne zu aktualisieren, einzufügen, ... irgendetwas, mache ich a BACKUP DATABASE
und a RESTORE DATABASE
und führe die SELECT
Abfrage erneut aus. Nur dieses Mal ist das Ergebnis 14000 , während keiner der Zeitstempel in den Tabellen erhöht wurde.
Warum / wie passiert das?
sql-server
restore
Stijn
quelle
quelle
Antworten:
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
is2000
und thedbi_maxDbTimestamp
is ist,2000
aktualisiert SQL Server den auf der Startseite geschriebenen Wert auf6000
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
Auf meinem System für eine neu erstellte Datenbank
@@dbts
ist2,000
. DieDBCC PAGE
Ausgabe von oben istIch habe den Zeitstempelwert hervorgehoben.
CAST(CAST(REVERSE(0xD007000000000000) AS BINARY(8)) AS BIGINT)
=2000
Jetzt wird das
@@dbts
als2001
aber auf die Seite selbst schauend gemeldet .Der Zeitstempelwert hat sich geändert.
CAST(CAST(REVERSE(0x7017000000000000) AS BINARY(8)) AS BIGINT)
=6000
.Laufen
Zu diesem Zeitpunkt zeigt die
DBTABLE
Struktur beide Werte anSchließlich
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)
Retouren6,000
wie erwartet.quelle