Giả sử cơ sở dữ liệu sử dụng mô hình khôi phục hoàn toàn, khi một bản ghi được ghi trong SQL Server (by INSERT
/ UPDATE
etc) ghi trước khi ghi sẽ đảm bảo thay đổi được ghi vào tệp nhật ký trước khi sửa đổi trang dữ liệu.
Cả hai mục nhật ký và trang dữ liệu đều được tạo trong RAM và được cam kết vào đĩa sau bởi Checkpoint.
Nếu xảy ra sự cố hệ thống (mất điện vì lý do tranh luận) thì điều gì sẽ xảy ra với các trang bẩn (dữ liệu IE bị thay đổi trong RAM nhưng không được cam kết vào đĩa) vì nội dung của RAM không tồn tại khi khởi động lại hệ thống, liệu dữ liệu này có bị mất không ?
BIÊN TẬP
Sau một số thử nghiệm, tôi có thể thấy các trang bẩn không bị mất, nhưng tôi không chắc tại sao:
sử dụng hướng dẫn này
tạo một cơ sở dữ liệu thử nghiệm
CREATE DATABASE DirtyPagesDB
GO
USE DirtyPagesDB
GO
tắt trạm kiểm soát tự động
DBCC TRACEON(3505, -1);
DBCC TRACESTATUS();
tạo một bảng, chèn một số dữ liệu và đưa ra một điểm kiểm tra:
CREATE TABLE t1 (Speaker_Bio CHAR(8000))
GO
INSERT INTO t1 VALUES ('SQL'),('Authority')
GO
CHECKPOINT
xác nhận không có trang bẩn
-- Get the rows of dirtied pages
SELECT
database_name = d.name,
OBJECT_NAME =
CASE au.TYPE
WHEN 1 THEN o1.name
WHEN 2 THEN o2.name
WHEN 3 THEN o1.name
END,
OBJECT_ID =
CASE au.TYPE
WHEN 1 THEN p1.OBJECT_ID
WHEN 2 THEN p2.OBJECT_ID
WHEN 3 THEN p1.OBJECT_ID
END,
index_id =
CASE au.TYPE
WHEN 1 THEN p1.index_id
WHEN 2 THEN p2.index_id
WHEN 3 THEN p1.index_id
END,
bd.FILE_ID,
bd.page_id,
bd.page_type,
bd.page_level
FROM sys.dm_os_buffer_descriptors bd
INNER JOIN sys.databases d
ON bd.database_id = d.database_id
INNER JOIN sys.allocation_units au
ON bd.allocation_unit_id = au.allocation_unit_id
LEFT JOIN sys.partitions p1
ON au.container_id = p1.hobt_id
LEFT JOIN sys.partitions p2
ON au.container_id = p2.partition_id
LEFT JOIN sys.objects o1
ON p1.OBJECT_ID = o1.OBJECT_ID
LEFT JOIN sys.objects o2
ON p2.OBJECT_ID = o2.OBJECT_ID
WHERE is_modified = 1
AND d.name = 'DirtyPagesDB'
AND
(
o1.name = 't1'
OR o2.name = 't1'
);
GO
xác nhận thời gian của điểm kiểm tra cuối
SELECT f1.[Checkpoint Begin], f2.[Checkpoint End]
FROM fn_dblog(NULL, NULL) f1
JOIN fn_dblog(NULL, NULL) f2
On f1.[Current LSN] = f2.[Previous LSN]
WHERE f2.Operation IN (N'LOP_BEGIN_CKPT', N'LOP_END_CKPT');
Thêm nhiều hàng
INSERT INTO t1 VALUES ('SQL'),('Authority')
Sử dụng truy vấn ở trên để xác nhận rằng có các trang bẩn
Giết nhiệm vụ SQL Server từ trình quản lý tác vụ để mô phỏng tắt nguồn.
Bắt đầu dịch vụ
Chạy lại lệnh ở trên để có thời gian điểm kiểm tra cuối cùng, nó cũng như vậy (IE không có điểm kiểm tra nào chạy ngoài lệnh chúng tôi đã làm thủ công)
CHỌN từ bảng t1 và tất cả bốn bản ghi đều ở đó