Apakah log SQL Server merekam operasi yang tidak dikomit?

12

Saya sering melihat pernyataan seperti catatan log server sql setiap transksi dan opeation.

Tapi saya bingung tentang apa yang terjadi ketika transaksi akhirnya digulung kembali .

Katakanlah transaksi eksplisit memiliki 3 pernyataan: statement A, statement B, statement C, dan akhirnya rollback statement D.

Sekarang katakan ketika eksekusi belum mencapai rollback statement D, akankah modifikasi yang dihasilkan dari statements A through Cdicatat ke log server sql?

Memahami 1 :

Pernyataan A sampai D semuanya direkam. SQL Server merekam semuanya, apa pun yang terjadi.

Memahami 2 : Modifikasi hanya disimpan di suatu tempat dalam memori, dan hanya direkam untuk dicatat ketika SQL Server melihat commitpernyataan. Jika ternyata menjadi rollbackpernyataan, SQL Server mengabaikan transacrion, tidak ada penulisan yang terjadi karena tidak ada tujuan. Dengan kata lain, SQL Server mencatat kapan ada hasil bersih sebelum dan sesudah transaksi.

Keduanya tampak logis, setidaknya bagi saya tetapi keduanya tidak benar. Terima kasih atas bantuannya.

John Smith
sumber
Hai, Coba [ systoolsgroup.com/sql-log-analyzer.html] (SQL Log Analyzer) untuk menganalisis apa yang terjadi di file log. Anda dapat mencoba versi gratis SysTools SQL Log Analyzer untuk hanya melihat pratinjau Data Log SQL. Semoga ini berhasil untuk Anda.
Rylan08

Jawaban:

13

Memahami 1 benar. SQL Server mencatat setiap operasi yang mengubah data ke log transaksi. Kembalikan adalah perubahan data sehingga juga mencatat itu ke log transaksi juga. Sebagai pernyataan A jalankan itu akan menulis data ke log transaksi dan juga akan memesan data dalam log transaksi jika pernyataan A perlu digulirkan kembali. Hal yang sama berlaku untuk B dan C. Ketika Anda mengembalikan transaksi, informasi lebih lanjut akan ditulis ke log.

Ada banyak cara untuk melihat ini dalam aksi jadi di bawah ini adalah demo cepat. Berikut adalah kueri yang akan saya gunakan untuk melihat apa yang ditulis ke log:

SELECT 
  COUNT(*) transaction_count
, SUM(database_transaction_log_bytes_used) used_bytes
, SUM(database_transaction_log_bytes_reserved) reserved_bytes
FROM sys.dm_tran_database_transactions
where database_id = 10;

Meja saya:

create table TLOGDEMO (FLUFF VARCHAR(1000));

BEGIN TRANSACTION

Kueri A menggunakan pencatatan minimum:

INSERT INTO TLOGDEMO WITH (TABLOCK)
SELECT REPLICATE('A', 1000)
FROM master..spt_values t1
CROSS JOIN master..spt_values t2;

Setelah:

╔═══════════════════╦════════════╦════════════════╗
 transaction_count  used_bytes  reserved_bytes 
╠═══════════════════╬════════════╬════════════════╣
                 1    24006640       175429451 
╚═══════════════════╩════════════╩════════════════╝

Kueri B tidak menggunakan pencatatan minimum:

INSERT INTO TLOGDEMO
SELECT REPLICATE('B', 1000)
FROM master..spt_values t1
CROSS JOIN master..spt_values t2;

Setelah B:

╔═══════════════════╦════════════╦════════════════╗
 transaction_count  used_bytes  reserved_bytes 
╠═══════════════════╬════════════╬════════════════╣
                 1  7352935708      1613986255 
╚═══════════════════╩════════════╩════════════════╝

Kueri C mengubah lebih sedikit data:

INSERT INTO TLOGDEMO
SELECT REPLICATE('C', 1000)
FROM master..spt_values c;

Setelah C:

╔═══════════════════╦════════════╦════════════════╗
 transaction_count  used_bytes  reserved_bytes 
╠═══════════════════╬════════════╬════════════════╣
                 1  7355821748      1614545331 
╚═══════════════════╩════════════╩════════════════╝

Sekarang saya akan mengeluarkan ROLLBACKdan meminta DMV sementara rollback terjadi. Di bawah ini adalah tabel dari beberapa foto:

╔═══════════════════╦════════════╦════════════════╗
 transaction_count  used_bytes  reserved_bytes 
╠═══════════════════╬════════════╬════════════════╣
 1                  7393305528  1573797677     
 1                  7458767420  1502635737     
 1                  7682482356  1259440979     
 1                  7803881368  1127471233     
 ...                ...         ...            
╚═══════════════════╩════════════╩════════════════╝

Selama ROLLBACK, byte yang digunakan meningkat dan jumlah byte yang dipesan berkurang. Itu karena SQL Server menggunakan ruang yang disisihkan sebelumnya untuk membatalkan transaksi. Untuk membatalkan transaksi itu harus mengubah data sehingga menulis lebih banyak data ke log.

Joe Obbish
sumber
8

Modifikasi ke tabel database ditulis pertama kali ke file log, kemudian ke tabel itu sendiri, pertama dalam memori dan kemudian, dengan proses asinkron yang disebut CHECKPOINT, ke disk. Mekanisme ini dikenal sebagai WAL (Write-Ahead Logging) dan umum untuk semua database relasional.

Log itu sendiri pertama kali ditulis ke memori (ke buffer log, tepatnya) dan kemudian ke disk, tetapi tidak ada yang tersentuh pada tabel database sampai log telah ditulis ke disk.

Mekanisme ini memungkinkan pengguliran ke depan untuk transaksi yang dilakukan dan untuk memutar kembali ke beberapa transaksi yang tidak berkomitmen selama proses pemulihan. Mengenai contoh Anda, jika sesuatu yang buruk terjadi setelah statement Cdan Anda memiliki commitalih - alih rollback(Anda tidak dapat mengetahui hal ini sebelumnya), tanpa menyimpan setiap langkah dalam transaksi, RDBMS tidak akan memiliki cara untuk memulihkan database secara konsisten cara dan transaksi tidak akan memenuhi D(daya tahan) di ACID.

Ketika beberapa operasi dibatalkan, itu adalah file data yang menerima perubahan bersih (via CHECKPOINT), bukan file log.

spaghettidba
sumber
5

Memahami 1 adalah benar, dan spaghettidba dan Joe memiliki penjelasan yang bagus.

Jika Anda tertarik menguji sendiri (pada contoh uji coba), Anda dapat menggunakan skrip di bawah ini:

--create a database and table for testing
USE master
GO
CREATE DATABASE tranlogtest
GO
USE tranlogtest
GO
CREATE TABLE t1
(junk char(1))

CHECKPOINT
GO

BEGIN TRAN
INSERT t1 VALUES ('a')
INSERT t1 VALUES ('b')
INSERT t1 VALUES ('c')

ROLLBACK
INSERT t1 VALUES ('d')

SELECT *
FROM fn_dblog(NULL,NULL)

Anda akan melihat bahwa SQL Server merekam semuanya, bahkan langkah-langkah yang diambil untuk membatalkan operasi.

Forrest
sumber