Điều gì xảy ra với các trang bẩn nếu hệ thống bị lỗi trước điểm kiểm tra tiếp theo?


8

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/ UPDATEetc) 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 ở đó

Câu trả lời:


15

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.

Tuyên bố này không hoàn toàn đúng. Đúng là các trang dữ liệu được ghi vào đĩa bởi Checkpoint (và Lazy Writer). Tuy nhiên, các bản ghi nhật ký được ghi vào đĩa khi giao dịch được cam kết đảm bảo độ bền của giao dịch. Dữ liệu giao dịch đã cam kết sẽ không bao giờ chỉ là bộ nhớ cư trú (cấm độ bền chậm).

Tất cả các sửa đổi dữ liệu trước tiên được ghi vào nhật ký (ghi nhật ký trước ) và các trang bẩn được viết sau đó. Các trang và bản ghi nhật ký có thể bao gồm cả dữ liệu đã cam kết và không cam kết trên đĩa.

Bất kể mô hình khôi phục nào, SQL Server sẽ quét nhật ký trong quá trình khôi phục sự cố đến điểm kiểm tra cuối cùng, chuyển tiếp tất cả các sửa đổi dữ liệu từ thời điểm đó trở đi và cuối cùng khôi phục các giao dịch không được cam kết.


@ SEarle1986, rất vui vì câu trả lời này đã giúp bạn hiểu. Chôn trong tài liệu mà tôi tham chiếu là những điểm chính tôi đã tóm tắt: "SQL Server có logic ngăn không cho trang bẩn bị xóa trước khi bản ghi nhật ký liên quan được ghi. Bản ghi nhật ký được ghi vào đĩa khi giao dịch được thực hiện."
Dan Guzman

Với các hoạt động được ghi nhật ký tối thiểu, các phân bổ không gian (thay đổi cấu trúc IAM, PFS và GAM) được cuộn về phía trước và sau đó được khôi phục nếu không được cam kết để hoạt động hoàn toàn hoặc không. Các thay đổi được thực hiện cho các trang dữ liệu bằng cách chèn số lượng lớn không cần phải được chuyển tiếp vì chúng được ghi bằng vật lý trong quá trình hoạt động (khác với các hoạt động được ghi thông thường trong đó tệp dữ liệu IO không đồng bộ thông qua lười biếng và điểm kiểm tra).
Dan Guzman
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.