Nội dung của tệp nhật ký giao dịch chi tiết hơn


11

Tôi có một câu hỏi liên quan đến nhật ký giao dịch (hãy gọi ngắn gọn là nội dung LDF). Tôi giả sử một cơ sở dữ liệu với mô hình phục hồi đầy đủ.

Tôi đã đọc rằng tệp LDF chứa (nhật ký) từng hoạt động cho cơ sở dữ liệu (ở chế độ khôi phục hoàn toàn). Làm thế nào nó khác với đăng nhập trong thời gian BEGIN TRAN; COMMAND(s); COMMIT? Tôi đang hỏi vì rõ ràng bạn có thể khôi phục các giao dịch, nhưng bạn không thể khôi phục các lệnh tiêu chuẩn (trong chế độ khôi phục hoàn toàn).

Tôi đoán rằng trong quá trình giao dịch, nội dung được đăng nhập vào tệp LDF khác với ghi nhật ký khôi phục hoàn toàn thông thường. Có đúng không? Nó khác biệt như thế nào? Có phải nó chỉ bao gồm các hoạt động của Undo mà thôi cho mỗi hành động?

Trên một lưu ý liên quan, tôi đã nghe nói rằng có các công cụ thương mại để "khôi phục / hoàn tác" các truy vấn tiêu chuẩn bằng cách sử dụng tệp LDF khôi phục đầy đủ. Họ làm nó như thế nào? Họ có phân tích nội dung LDF và cố gắng đưa ra các hoạt động nghịch đảo / hoàn tác không?


Câu trả lời:


11

Sự khác biệt là những gì bạn gọi là "lệnh tiêu chuẩn" có giao dịch ngầm (như trong "không rõ ràng" và không phải là giao dịch ngầm thực sự có nghĩa là gì đó khác nhau ), vì vậy mỗi khi bạn phát INSERTlệnh mà không có giao dịch rõ ràng, nó sẽ mở một giao dịch, chèn dữ liệu và tự động cam kết. Đây được gọi là một giao dịch tự động.

Đây cũng là lý do tại sao bạn không thể quay lại điều này INSERT: nó đã được cam kết. Vì vậy, quy tắc cũng giống như các giao dịch rõ ràng: bạn không thể quay lại một khi chúng đã được cam kết .

Bạn có thể thấy những gì tôi muốn nói trực tiếp từ bên trong SQL Server.

Microsoft gửi SQL Server với DMF được gọi sys.fn_dblogcó thể được sử dụng để xem bên trong nhật ký giao dịch của cơ sở dữ liệu đã cho.

Đối với thử nghiệm đơn giản này, tôi sẽ sử dụng cơ sở dữ liệu AdventureWorks:

USE AdventureWorks2008;
GO

SELECT TOP 10 *
FROM dbo.Person;
GO

INSERT INTO dbo.Person (FirstName, MiddleName, LastName, Gender, Date)
VALUES ('Never', 'Stop', 'Learning', 'M', GETDATE());
COMMIT;

BEGIN TRAN;
INSERT INTO dbo.Person (FirstName, MiddleName, LastName, Gender, Date)
VALUES ('Never', 'Stop', 'Learning', 'M', GETDATE());
COMMIT;
GO

SELECT *
FROM sys.fn_dblog(NULL, NULL);
GO

Ở đây tôi đang thực hiện hai lần chèn: một với và một không có giao dịch rõ ràng.

Trong tệp nhật ký, bạn có thể thấy rằng hoàn toàn không có sự khác biệt giữa hai:

Autocommit vs Giao dịch rõ ràng

Màu đỏ là INSERTgiao dịch tự động và màu xanh là INSERTgiao dịch rõ ràng.

Đối với các công cụ của bên thứ 3 mà bạn đề cập, có, họ phân tích nhật ký cơ sở dữ liệu và tạo mã T-SQL bình thường để "hoàn tác" hoặc "làm lại" các hoạt động. Bình thường, ý tôi là họ không làm gì đặc biệt ngoài việc tạo một tập lệnh sẽ có tác dụng làm chính xác điều ngược lại với những gì trong tệp nhật ký.


7

Tôi sẽ giải thích cách các công cụ thương mại hoạt động, trên ví dụ Nhật ký ApexSQL

Và trên lưu ý liên quan, tôi đã nghe nói rằng có các công cụ thương mại đối với các truy vấn tiêu chuẩn của rollback / hoàn tác lại bằng cách sử dụng tệp LDF khôi phục đầy đủ. Họ làm nó như thế nào? Họ có phân tích nội dung LDF và cố gắng đưa ra các hoạt động nghịch đảo / hoàn tác không?

Có, họ đọc tệp LDF (trực tuyến hoặc tách rời) và tệp trn (sao lưu nhật ký giao dịch), tìm giao dịch nào đã xảy ra và tạo một tập lệnh sẽ thực hiện tương tự hoặc ngược lại.

Tuy nhiên, xin lưu ý rằng tập lệnh hoàn tác và làm lại không nhất thiết phải giống hệt với tập lệnh được thực thi, nhưng hiệu ứng sẽ hoàn toàn giống nhau.

Ví dụ: nếu tập lệnh được thực thi là:

DELETE FROM [Person].[AddressType] WHERE Name  = 'New Loc22'

Nhật ký giao dịch sẽ ghi lại rằng hàng trong bảng có các giá trị cột 9, 'Loc22 mới', '41BC2FF6-F0FC-475F-8EB9-CEC1805AA0F6' và '2002/06/01 00: 00: 00.000' đã bị xóa. Từ cấu trúc bảng, công cụ sẽ đọc rằng Khóa chính là cột Địa chỉ và sẽ tạo tập lệnh làm lại sau:

DELETE FROM [Person].[AddressType] WHERE [AddressTypeID] = 9

Lưu ý rằng giao dịch được gắn với cột khóa Chính, không gắn với cột được sử dụng trong mệnh đề where gốc. Tương tự, tập lệnh hoàn tác sẽ là:

INSERT INTO [Person].[AddressType] ([AddressTypeID], [Name], [rowguid], [ModifiedDate]) VALUES (9, N'New loc22' COLLATE SQL_Latin1_General_CP1_CI_AS, '41bc2ff6-f0fc-475f-8eb9-cec1805aa0f6', '20020601 00:00:00.000')

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

Tuyên bố miễn trừ trách nhiệm: Tôi làm việc cho ApexSQL với tư cách là Kỹ sư hỗ trợ

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.