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?
sumber
Jawaban:
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
INSERT
perintah tanpa transaksi eksplisit, itu akan membuka transaksi, masukkan data dan komit secara otomatis. Ini disebut transaksi autocommit.Ini juga mengapa Anda tidak bisa
INSERT
mengembalikan 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_dblog
yang dapat digunakan untuk melihat ke dalam log transaksi dari database yang diberikan.Untuk eksperimen sederhana ini, saya akan menggunakan database AdventureWorks:
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:
Yang merah adalah
INSERT
dalam transaksi autocommit dan yang biru adalahINSERT
dengan 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.
sumber
Saya akan menjelaskan cara kerja alat komersial, pada contoh Log ApexSQL
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:
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:
Perhatikan bahwa transaksi terikat pada kolom kunci Utama, bukan ke kolom yang digunakan dalam klausa asli tempat. Demikian pula, skrip undo akan menjadi:
Penafian: Saya bekerja untuk ApexSQL sebagai Support Engineer
sumber