Dengan asumsi database menggunakan model pemulihan penuh, ketika catatan ditulis dalam SQL Server (oleh INSERT
/ UPDATE
etc) 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