Apa yang Terjadi pada halaman kotor jika sistem gagal sebelum pos pemeriksaan berikutnya?

8

Dengan asumsi database menggunakan model pemulihan penuh, ketika catatan ditulis dalam SQL Server (oleh INSERT/ UPDATEetc) menulis logging terlebih dahulu akan memastikan perubahan ditulis ke file log sebelum memodifikasi halaman data.

Entri log dan halaman data dibuat dalam RAM dan dikomit ke disk nanti oleh Checkpoint.

Jika ada crash sistem (kehilangan daya karena argumen) apa yang akan terjadi pada halaman kotor (data IE yang diubah dalam RAM tetapi tidak berkomitmen untuk disk) karena isi RAM tidak bertahan hidup sistem restart, apakah data ini hilang ?

EDIT

Setelah beberapa pengujian, saya dapat melihat halaman kotor tidak hilang, tetapi saya tidak yakin mengapa:

menggunakan tutorial ini

buat database uji

CREATE DATABASE DirtyPagesDB
GO
USE DirtyPagesDB
GO

matikan pos pemeriksaan otomatis

DBCC TRACEON(3505, -1);
DBCC TRACESTATUS();

buat tabel, masukkan beberapa data dan berikan pos pemeriksaan:

CREATE TABLE t1 (Speaker_Bio CHAR(8000))
GO
INSERT INTO t1 VALUES ('SQL'),('Authority')
GO
CHECKPOINT

konfirmasi tidak ada halaman yang kotor

-- Get the rows of dirtied pages
SELECT
database_name = d.name,
OBJECT_NAME =
CASE au.TYPE
WHEN 1 THEN o1.name
WHEN 2 THEN o2.name
WHEN 3 THEN o1.name
END,
OBJECT_ID =
CASE au.TYPE
WHEN 1 THEN p1.OBJECT_ID
WHEN 2 THEN p2.OBJECT_ID
WHEN 3 THEN p1.OBJECT_ID
END,
index_id =
CASE au.TYPE
WHEN 1 THEN p1.index_id
WHEN 2 THEN p2.index_id
WHEN 3 THEN p1.index_id
END,
bd.FILE_ID,
bd.page_id,
bd.page_type,
bd.page_level
FROM sys.dm_os_buffer_descriptors bd
INNER JOIN sys.databases d
ON bd.database_id = d.database_id
INNER JOIN sys.allocation_units au
ON bd.allocation_unit_id = au.allocation_unit_id
LEFT JOIN sys.partitions p1
ON au.container_id = p1.hobt_id
LEFT JOIN sys.partitions p2
ON au.container_id = p2.partition_id
LEFT JOIN sys.objects o1
ON p1.OBJECT_ID = o1.OBJECT_ID
LEFT JOIN sys.objects o2
ON p2.OBJECT_ID = o2.OBJECT_ID
WHERE is_modified = 1
AND d.name = 'DirtyPagesDB'
AND
(
o1.name = 't1'
OR o2.name = 't1'
);
GO

konfirmasi waktu dari pos pemeriksaan terakhir

SELECT  f1.[Checkpoint Begin], f2.[Checkpoint End]
FROM    fn_dblog(NULL, NULL) f1
        JOIN fn_dblog(NULL, NULL) f2
             On f1.[Current LSN] = f2.[Previous LSN]
WHERE   f2.Operation IN (N'LOP_BEGIN_CKPT', N'LOP_END_CKPT');

Tambahkan lebih banyak baris

INSERT INTO t1 VALUES ('SQL'),('Authority')

Gunakan kueri di atas untuk mengonfirmasi bahwa ada halaman yang kotor

Bunuh tugas SQL Server dari task manager untuk mensimulasikan pematian daya.

Mulai layanan

Jalankan kembali perintah di atas untuk mendapatkan waktu pos pemeriksaan terakhir, itu sama (yaitu tidak ada pos pemeriksaan yang berjalan selain yang kami lakukan secara manual)

DIPILIH dari tabel t1 dan keempat catatan ada di sana

SEarle1986
sumber

Jawaban:

15

Entri log dan halaman data dibuat dalam RAM dan dikomit ke disk nanti oleh Checkpoint.

Pernyataan ini tidak sepenuhnya benar. Benar bahwa halaman data ditulis ke disk oleh Checkpoint (dan Lazy Writer). Catatan log, bagaimanapun, secara fisik ditulis ke disk ketika transaksi dilakukan untuk menjamin ketahanan transaksi. Data transaksi yang berkomitmen tidak akan pernah hanya menjadi residen memori (kecuali daya tahan tertunda).

Semua modifikasi data pertama-tama ditulis ke log (log -write logging ) dan halaman-halaman kotor ditulis sesudahnya. Halaman dan catatan log dapat menyertakan data pada disk yang berkomitmen dan tidak dikomit.

Terlepas dari model pemulihan, SQL Server memindai log selama pemulihan crash ke pos pemeriksaan terakhir, memutar semua modifikasi data dari titik itu, dan akhirnya memutar kembali transaksi yang tidak dikomit.

Dan Guzman
sumber
@ SEarle1986, senang jawaban ini membantu pemahaman Anda. Terkubur dalam dokumentasi yang saya referensikan adalah poin-poin kunci yang saya rangkum: "SQL Server memiliki logika yang mencegah halaman yang kotor agar tidak dihapus sebelum catatan log terkait ditulis. Catatan log ditulis ke disk saat transaksi dilakukan."
Dan Guzman
Dengan operasi yang ditebang minimal, alokasi ruang (perubahan pada struktur IAM, PFS, dan GAM) digulirkan ke depan dan kemudian digulirkan kembali jika tidak dilakukan sehingga operasi itu semua atau tidak sama sekali. Perubahan yang dilakukan pada halaman data dengan memasukkan massal tidak perlu digulirkan ke depan karena itu ditulis secara fisik selama operasi (yang berbeda dari operasi yang biasanya dicatat di mana file data IO tidak sinkron melalui lazywriter dan pos pemeriksaan).
Dan Guzman