เนื้อหาของไฟล์บันทึกธุรกรรมโดยละเอียด


11

ฉันมีคำถามเกี่ยวกับการทำธุรกรรม (ขอเรียกสั้น ๆ ว่า LDF) เนื้อหา ฉันสมมติว่าฐานข้อมูลพร้อมกับแบบจำลองการกู้คืนเต็มรูปแบบ

ฉันได้อ่านว่าไฟล์ LDF มี (บันทึก) การดำเนินการแต่ละรายการและทุกครั้งไปยังฐานข้อมูล (ที่อยู่ในโหมดการกู้คืนเต็ม) มันแตกต่างจากการล็อกระหว่างBEGIN TRAN; COMMAND(s); COMMITอะไร ฉันถามเพราะเห็นได้ชัดว่าคุณสามารถย้อนกลับธุรกรรม แต่คุณไม่สามารถย้อนกลับคำสั่งมาตรฐาน (ในโหมดการกู้คืนเต็ม)

ฉันเดาว่าระหว่างการทำธุรกรรมเนื้อหาที่ถูกบันทึกลงในไฟล์ LDF นั้นแตกต่างจากการบันทึกการกู้คืนแบบเต็มปกติ นั่นถูกต้องใช่ไหม? แตกต่างกันอย่างไร เป็นเพียงการรวมการดำเนินงาน "เลิกทำ" สำหรับแต่ละการกระทำหรือไม่

ในบันทึกที่เกี่ยวข้องฉันได้ยินมาว่ามีเครื่องมือเชิงพาณิชย์สำหรับ "การย้อนกลับ / เลิกทำ" คำสั่งมาตรฐานโดยใช้ไฟล์ LDF สำหรับการกู้คืนแบบเต็ม พวกเขาทำมันได้อย่างไร? พวกเขาวิเคราะห์เนื้อหาของ LDF หรือไม่และพยายามทำสิ่งที่ตรงกันข้าม / เลิกทำหรือไม่?


ที่เกี่ยวข้อง: วิธีการดูบันทึกธุรกรรมใน SQL Server 2008บน Stack Overflow
Vadzim

คำตอบ:


11

ความแตกต่างคือสิ่งที่คุณเรียกว่า "คำสั่งมาตรฐาน" มีการทำธุรกรรมโดยนัย (ใน "ไม่ชัดเจน" และไม่ใช่ธุรกรรมโดยนัยจริงซึ่งหมายถึงสิ่งที่แตกต่าง ) ดังนั้นทุกครั้งที่คุณออกINSERTคำสั่งโดยไม่มีธุรกรรมที่ชัดเจนมันจะเปิดธุรกรรม แทรกข้อมูลและกระทำโดยอัตโนมัติ สิ่งนี้เรียกว่าธุรกรรม autocommit

นี่คือสาเหตุที่คุณไม่สามารถย้อนกลับได้INSERT: มันได้กระทำไปแล้ว ดังนั้นกฎจึงเหมือนกับการทำธุรกรรมที่ชัดเจน: คุณไม่สามารถย้อนกลับเมื่อพวกเขาได้รับมอบหมายแล้ว

คุณสามารถดูสิ่งที่ฉันหมายถึงโดยตรงจากภายใน SQL Server

Microsoft จัดส่ง SQL Server ด้วย DMF ที่เรียกsys.fn_dblogว่าสามารถใช้เพื่อดูภายในบันทึกธุรกรรมของฐานข้อมูลที่กำหนด

สำหรับการทดลองอย่างง่ายนี้ฉันจะใช้ฐานข้อมูล 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

ที่นี่ฉันทำสองแทรก: หนึ่งกับและหนึ่งโดยไม่ต้องทำธุรกรรมที่ชัดเจน

ในล็อกไฟล์คุณจะเห็นว่าไม่มีความแตกต่างระหว่างสองอย่างนี้:

Autocommit vs ธุรกรรมที่ชัดเจน

สีแดงคือINSERTธุรกรรมภายใน autocommit และสีฟ้านั้นINSERTเป็นธุรกรรมที่มีความชัดเจน

สำหรับเครื่องมือของบุคคลที่สามที่คุณพูดถึงใช่พวกเขาวิเคราะห์บันทึกฐานข้อมูลและสร้างรหัส T-SQL ปกติเพื่อ "เลิกทำ" หรือ "ทำซ้ำ" การดำเนินการ ตามปกติฉันหมายความว่าพวกเขาจะไม่ทำอะไรเป็นพิเศษนอกจากสร้างสคริปต์ที่จะมีผลต่อการทำตรงข้ามกับสิ่งที่อยู่ในล็อกไฟล์


7

ฉันจะอธิบายว่าเครื่องมือเชิงพาณิชย์ทำงานอย่างไรในตัวอย่าง ApexSQL Log

และในบันทึกย่อที่เกี่ยวข้องฉันเคยได้ยินว่ามีเครื่องมือทางการค้าเพื่อ "ย้อนกลับ / เลิกทำ" คำสั่งมาตรฐานโดยใช้ไฟล์ LDF สำหรับการกู้คืนแบบเต็ม พวกเขาทำมันได้อย่างไร? พวกเขาวิเคราะห์เนื้อหาของ LDF หรือไม่และพยายามทำสิ่งที่ตรงกันข้าม / เลิกทำหรือไม่?

ใช่พวกเขาอ่านไฟล์ LDF (ออนไลน์หรือแยกออก) และไฟล์ trn (สำรองข้อมูลบันทึกธุรกรรม) ค้นหารายการที่เกิดขึ้นและสร้างสคริปต์ที่จะทำแบบเดียวกันหรือตรงกันข้าม

อย่างไรก็ตามโปรดทราบว่าสคริปต์การเลิกทำและทำซ้ำไม่จำเป็นต้องเหมือนกับสคริปต์ที่เรียกใช้ แต่ผลจะเหมือนกันทุกประการ

ตัวอย่างเช่นหากสคริปต์ที่ดำเนินการคือ:

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

บันทึกธุรกรรมจะบันทึกว่าแถวในตารางที่มีค่าคอลัมน์ 9, 'New Loc22', '41BC2FF6-F0FC-475F-8EB9-CEC1805AA0F6' และ '2002/06/01 00: 00.000 00.000' จะถูกลบ จากโครงสร้างตารางเครื่องมือจะอ่านว่าคีย์หลักคือคอลัมน์ AddressType และจะสร้างสคริปต์การทำซ้ำต่อไปนี้:

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

โปรดทราบว่าการทำธุรกรรมจะเชื่อมโยงกับคอลัมน์คีย์หลักไม่ใช่กับคอลัมน์ที่ใช้ในต้นฉบับซึ่งเป็นส่วนคำสั่ง สคริปต์เลิกทำจะเป็นดังนี้:

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')

ป้อนคำอธิบายรูปภาพที่นี่

คำเตือน: ฉันทำงานให้กับ ApexSQL ในฐานะวิศวกรสนับสนุน

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.