Tại sao @@ dbts tăng sau khi sao lưu / khôi phục?


7

Tôi có cơ sở dữ liệu SQL Server 2005, chứa một số bảng có cột Dấu thời gian (hoặc RowVersion). Tôi cần biết giá trị của dấu thời gian hiện tại, vì vậy tôi sử dụng truy vấn sau:SELECT CAST(@@dbts AS BIGINT);

Điều này sẽ trở lại, ví dụ, 10505 .

Ngay lập tức sau đó, không cập nhật, chèn, ... bất cứ điều gì, tôi làm BACKUP DATABASEmột RESTORE DATABASEvà tôi chạy lại SELECTtruy vấn. Chỉ lần này, kết quả là 14000 , trong khi không có dấu thời gian nào trong các bảng tăng lên.

Tại sao / làm thế nào điều này xảy ra?


Microsoft chỉ đảm bảo rằng @@ DBTS sẽ là duy nhất ; nó không đưa ra bất kỳ lời hứa nào về những gì có thể hoặc không thể xảy ra với giá trị sau khi sao lưu / khôi phục hoặc bất kỳ hoạt động cấp cơ sở dữ liệu nào khác. Bạn đang sử dụng giá trị này để làm gì? Tại sao bạn quan tâm nếu nó thay đổi? Bạn không thể thiết lập đường cơ sở của mình từ lần khôi phục thành công cuối cùng và đặt lại bất cứ khi nào bạn làm như vậy? Nó không giống như một cơ sở dữ liệu sản xuất nên thường xuyên đi theo trình tự này ...
Aaron Bertrand

Câu trả lời:


13

Giá trị cho dbi_maxDbTimestampđược lưu trữ trên trang khởi động cơ sở dữ liệu. (trang 9 trong tệp dữ liệu chính).

Điều này không được ghi vào mỗi lần giá trị dấu thời gian được phân bổ. Thay vào đó, SQL Server dự trữ vài nghìn mỗi lần.

Ví dụ nếu @@DBTS2000dbi_maxDbTimestampcũng là 2000sau đó SQL Server cập nhật các giá trị văn bản trong trang khởi động để 6000lần sau nó cần một giá trị dấu thời gian.

Các giá trị từ 2001 - 5999được phân bổ trong bộ nhớ và "mất" nếu cơ sở dữ liệu được đặt ngoại tuyến và sau đó trực tuyến lại.

Bản sao lưu chứa bản sao của trang khởi động đã được cập nhật 6000. Vì vậy, khi khôi phục nó, các giá trị dấu thời gian sẽ bắt đầu từ số này. Nó không biết gì về bất kỳ giá trị trung gian bị mất.

Để thấy điều này

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)

Trên hệ thống của tôi cho một cơ sở dữ liệu mới được tạo ra @@dbts2,000. Đầu DBCC PAGEra từ phía trên là

DBCC Trang 1

Tôi đã nhấn mạnh giá trị dấu thời gian. 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)

Bây giờ @@dbtsđược báo cáo như 2001nhưng nhìn vào trang chính nó.

DBCC Trang 2

giá trị dấu thời gian đã thay đổi. CAST(CAST(REVERSE(0x7017000000000000) AS BINARY(8)) AS BIGINT)= 6000.

Đang chạy

DBCC DBTABLE('DbtsTest')

tại thời điểm này để xem DBTABLEcấu trúc hiển thị cả hai giá trị

dbt_maxDbTimestamp = 6000           
dbt_dbTimestamp = 2001

Cuối cùng

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

Sau đó nhìn vào bản sao lưu cho thấy nó là con số 6.000 được viết.

nhập mô tả hình ảnh ở đây

Khôi phục cơ sở dữ liệu và SELECT CAST(@@DBTS AS BIGINT)trả về truy vấn 6,000như mong đợi.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.