Isi file log transaksi lebih terinci

11

Saya memiliki pertanyaan tentang log transaksi (sebut saja LDF). Saya mengasumsikan database dengan model pemulihan penuh.

Saya telah membaca bahwa file LDF berisi (log) masing-masing dan setiap operasi ke database (yang dalam mode pemulihan penuh). Apa bedanya dengan logging selama BEGIN TRAN; COMMAND(s); COMMIT? Saya bertanya karena ternyata Anda dapat memutar kembali transaksi, tetapi Anda tidak dapat memutar kembali perintah standar (dalam mode pemulihan penuh).

Saya kira selama transaksi konten yang sedang login ke file LDF berbeda dari pada logging pemulihan penuh biasa. Apakah itu benar? Apa bedanya? Apakah hanya dimasukkannya operasi "undo" untuk setiap tindakan?

Pada catatan terkait, saya telah mendengar bahwa ada alat komersial untuk "mengembalikan / membatalkan" kueri standar menggunakan file LDF pemulihan penuh. Bagaimana mereka melakukannya? Apakah mereka menganalisis konten LDF dan mencoba membuat operasi invers / undo?

Jangan berhenti belajar
sumber
Terkait: Cara melihat log transaksi di SQL Server 2008 di Stack Overflow.
Vadzim

Jawaban:

11

Perbedaannya adalah bahwa apa yang Anda sebut "perintah standar" memiliki transaksi implisit (seperti pada "tidak eksplisit" dan bukan transaksi implisit nyata yang berarti sesuatu yang berbeda ), jadi setiap kali Anda mengeluarkan INSERTperintah tanpa transaksi eksplisit, itu akan membuka transaksi, masukkan data dan komit secara otomatis. Ini disebut transaksi autocommit.

Ini juga mengapa Anda tidak bisa INSERTmengembalikan ini : sudah berkomitmen. Jadi aturannya sama dengan transaksi eksplisit: Anda tidak dapat mengembalikan setelah dilakukan .

Anda dapat melihat apa yang saya maksud langsung dari dalam SQL Server.

Microsoft mengirimkan SQL Server dengan DMF yang disebut sys.fn_dblogyang dapat digunakan untuk melihat ke dalam log transaksi dari database yang diberikan.

Untuk eksperimen sederhana ini, saya akan menggunakan database 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

Di sini saya melakukan dua sisipan: satu dengan dan satu tanpa transaksi eksplisit.

Dalam file log Anda dapat melihat bahwa sama sekali tidak ada perbedaan antara keduanya:

Transaksi Autocommit vs Eksplisit

Yang merah adalah INSERTdalam transaksi autocommit dan yang biru adalah INSERTdengan transaksi eksplisit.

Adapun alat pihak ke-3 yang Anda sebutkan, ya mereka menganalisis log basis data dan menghasilkan kode T-SQL normal untuk "membatalkan" atau "mengulang" operasi. Secara normal saya maksudkan mereka tidak melakukan sesuatu yang khusus selain menghasilkan skrip yang akan memiliki efek melakukan kebalikan dari apa yang ada di file log.

ivanmp
sumber
7

Saya akan menjelaskan cara kerja alat komersial, pada contoh Log ApexSQL

Dan pada catatan terkait saya telah mendengar bahwa ada alat komersial untuk "rollback / undo" kueri standar menggunakan file LDF pemulihan penuh. Bagaimana mereka melakukannya? Apakah mereka menganalisis konten LDF dan mencoba membuat operasi invers / undo?

Ya, mereka membaca file LDF (online atau terpisah) dan trn file (backup log transaksi), menemukan transaksi apa yang telah terjadi, dan membuat skrip yang akan melakukan hal yang sama, atau sebaliknya.

Namun perlu dicatat, bahwa script undo dan redo tidak harus persis sama dengan yang dieksekusi, tetapi efeknya akan persis sama.

Misalnya, jika skrip yang dijalankan adalah:

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

Log transaksi akan mencatat bahwa baris dalam tabel dengan nilai kolom 9, 'Loc22 Baru', '41BC2FF6-F0FC-475F-8EB9-CEC1805AA0F6', dan '2002/06/01 00: 00: 00.000' dihapus. Dari struktur tabel, alat akan membaca bahwa kunci utama adalah kolom AddressType, dan akan membuat skrip pengulangan berikut:

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

Perhatikan bahwa transaksi terikat pada kolom kunci Utama, bukan ke kolom yang digunakan dalam klausa asli tempat. Demikian pula, skrip undo akan menjadi:

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

masukkan deskripsi gambar di sini

Penafian: Saya bekerja untuk ApexSQL sebagai Support Engineer

Milena Petrovic
sumber