Pada artikel ini, kita akan berbicara tentang SQL Server Checkpoints.
Untuk meningkatkan kinerja, SQL Server menerapkan modifikasi ke halaman database di memori. Seringkali, memori ini disebut buffer cache atau buffer pool. SQL Server tidak menyiram halaman ini ke disk setelah setiap perubahan. Sebaliknya, mesin database melakukan operasi pos pemeriksaan pada setiap database dari waktu ke waktu. POKOK PERIKSA operasi menulis halaman kotor (halaman yang dimodifikasi dalam memori saat ini) dan juga menulis detail tentang log transaksi.
SQL Server mendukung empat jenis pos pemeriksaan:
1. Otomatis — Jenis pos pemeriksaan ini terjadi di belakang layar dan bergantung pada konfigurasi server interval pemulihan. Nilai diukur dalam menit, dan nilai default adalah 1 menit (tidak dapat diatur lebih rendah). Pos pemeriksaan akan selesai dalam waktu yang meminimalkan dampak terhadap kinerja.
EXEC sp_configure 'recovery interval', 'seconds'
Di bawah model pemulihan SEDERHANA, pos pemeriksaan otomatis juga dipicu saat log transaksi 70% penuh.
2. Tidak Langsung — Jenis pos pemeriksaan ini juga terjadi di belakang layar sesuai dengan pengaturan waktu pemulihan basis data yang ditentukan pengguna. Mulai dari SQL Server 2016 CTP2 nilai default untuk jenis pos pemeriksaan ini adalah 1 menit. Ini berarti bahwa database akan menggunakan pos pemeriksaan tidak langsung. Untuk versi SQL Server yang lebih lama, defaultnya adalah 0. Ini berarti bahwa database akan menggunakan pos pemeriksaan otomatis, yang frekuensinya bergantung pada pengaturan interval pemulihan contoh SQL Server. Microsoft merekomendasikan 1 menit untuk sebagian besar sistem.
ALTER DATABASE … SET TARGET_RECOVERY_TIME = target_recovery_time { SECONDS | MINUTES }
Saat mengatur ini, pertimbangkan kemampuan subsistem I/O yang mendasarinya. Mungkin masuk akal untuk menyetel ini lebih rendah untuk subsistem I/O yang lebih cepat (mis. SSD). Hati-hati, setelan ini tetap ada melalui pencadangan dan pemulihan, sehingga pemulihan ke perangkat keras yang lebih lambat dapat menyebabkan masalah kinerja karena terlalu banyak memuat I/O.
3. Petunjuk — Terjadi saat menjalankan perintah T-SQL CHECKPOINT.
CHECKPOINT [ checkpoint_duration ]
checkpoint_duration adalah bilangan bulat yang digunakan untuk menentukan jumlah waktu di mana pos pemeriksaan harus diselesaikan. Parameter ini juga mengatur berapa banyak sumber daya yang ditetapkan untuk operasi pos pemeriksaan. Jika parameter tidak ditentukan, pos pemeriksaan akan selesai dalam waktu yang meminimalkan dampak terhadap kinerja.
4. Internal — Beberapa operasi SQL Server mengeluarkan jenis pos pemeriksaan ini untuk memastikan bahwa gambar disk cocok dengan status log transaksi saat ini. Ini adalah pos pemeriksaan yang dilakukan saat operasi tertentu terjadi:
- File data ditambahkan atau dihapus
- Penonaktifan basis data terjadi (untuk alasan apa pun)
- Cadangan atau snapshot basis data telah dibuat
- Sebuah perintah DBCC dijalankan yang membuat snapshot database tersembunyi (atau misalnya DBCC_CHECKDB, DBCC_CHECKTABLE).
Mengapa pos pemeriksaan berguna?
Pos pemeriksaan mengurangi waktu pemulihan kerusakan. Ini terjadi karena halaman file data tidak ditulis ke disk pada saat yang sama dengan catatan log. Ada halaman file data di memori yang lebih mutakhir daripada halaman file data di disk.
Pos pemeriksaan mengurangi I/O ke disk dan meningkatkan kinerja. Alasan bahwa halaman file data tidak ditulis ke disk pada saat transaksi dilakukan adalah untuk mengurangi jumlah operasi I/O. Bayangkan beberapa ribu transaksi UPDATE ke satu halaman data. Lebih efisien untuk menulis halaman data ke disk hanya sekali, selama pos pemeriksaan, daripada setelah setiap perubahan.
Halaman bersih dan kotor
Kumpulan buffer mempertahankan sejumlah halaman data di dalam memori. Ada dua jenis laman data:bersih dan kotor . Halaman bersih adalah halaman yang belum diubah sejak terakhir kali dibaca dari disk atau ditulis ke disk. Halaman kotor adalah halaman yang telah diubah dan perubahan tersebut belum ditulis ke disk. Pos pemeriksaan mengacu pada “halaman kotor”.
Informasi tentang halaman dapat dilihat menggunakan sys.dm_os_buffer_descriptors . Mari kita lihat apa yang dikembalikan oleh fungsi ini:
SELECT * FROM sys.dm_os_buffer_descriptors dobd; GO
Setiap halaman memiliki struktur kontrol yang terkait dengannya yang melacak status halaman:
- Basis data yang memiliki datdabase_id 32767 adalah Database Resource hanya-baca yang berisi semua objek sistem.
- id_file , page_id , allocation_unit_id halaman itu milik.
- Apa jenis halamannya:apakah halaman data atau halaman indeks.
- Jumlah baris pada halaman.
- Ruang kosong di halaman
- Apakah halaman kotor atau tidak
- Node_numa yang dimiliki halaman tertentu
- Beberapa info tentang algoritme Terakhir-Baru-Baru Ini Digunakan
Mari kita gabungkan informasi ini berdasarkan database menggunakan kode berikut:
SELECT *, [DirtyPageCount] * 8 / 1024 AS [DirtyPageMB], [CleanPageCount] * 8 / 1024 AS [CleanPageMB] FROM (SELECT (CASE WHEN ([database_id] = 32767) THEN N'Resource Database' ELSE DB_NAME([database_id]) END) AS [DatabaseName], SUM(CASE WHEN ([is_modified] = 1) THEN 1 ELSE 0 END) AS [DirtyPageCount], SUM(CASE WHEN ([is_modified] = 1) THEN 0 ELSE 1 END) AS [CleanPageCount] FROM sys.dm_os_buffer_descriptors GROUP BY [database_id]) AS [buffers] ORDER BY [DatabaseName] GO
Mekanisme pos pemeriksaan
Ketika pos pemeriksaan terjadi, ia menulis semua halaman kotor ke disk. Halaman yang ditandai sebagai kotor segera setelah memiliki beberapa perubahan. Tidak masalah apakah transaksi yang membuat perubahan dilakukan atau tidak dilakukan pada saat pos pemeriksaan. Setelah halaman ditulis ke disk, bit "kotor" dihapus. Ketika pos pemeriksaan terjadi, tindakan berikut terjadi:
- Catatan log baru menunjukkan dimulainya pos pemeriksaan
- Catatan log tambahan muncul dengan informasi pos pemeriksaan (seperti status log transaksi pada saat pos pemeriksaan dimulai)
- Semua halaman kotor ditulis ke disk
- Tandai LSN dari pos pemeriksaan di halaman boot database (di dbi_checkptLSN), ini penting untuk pemulihan kerusakan
- Jika model pemulihan SEDERHANA digunakan, coba hapus log
- Catatan log terakhir menunjukkan bahwa pos pemeriksaan telah selesai
Ada kemungkinan pos pemeriksaan dari beberapa basis data terjadi secara paralel. SQL Server 2000 terbatas pada satu pos pemeriksaan pada satu waktu. Ketika manajer buffer menulis sebuah halaman, ia mencari halaman kotor yang berdekatan yang dapat dimasukkan dalam satu operasi pengumpulan-tulis. Juga, kumpulan buffer akan mencoba memastikan bahwa itu tidak membebani sub-sistem I/O. Itu melacak berapa lama waktu yang dibutuhkan untuk I/O untuk menyelesaikan. Jika latensi tulis melebihi 20 ms selama pos pemeriksaan, latensi akan mencekik sendiri. Selama shutdown, ambang batas pelambatan meningkat menjadi 100 ms. Anda dapat menemukan penjelasan lebih rinci di sini. Anda dapat menggunakan opsi pengaktifan “-kXX” yang tidak berdokumen untuk menyetel laju I/O pos pemeriksaan pada XX MB/dtk.
Ketika halaman file data ditulis ke disk oleh sebuah pos pemeriksaan, write-ahead logging menjamin bahwa semua catatan log yang mempengaruhi halaman tersebut harus ditulis ke log transaksi pada disk terlebih dahulu. Semua catatan log hingga dan termasuk yang terakhir yang memengaruhi halaman ditulis, terlepas dari transaksi mana mereka menjadi bagiannya. Catatan log ditulis dalam tiga cara:
- Saat ada transaksi yang dilakukan atau dibatalkan
- Saat halaman file data ditulis ke disk
- Saat blok log mencapai ukuran maksimum 60KB dan diakhiri secara paksa
Catatan log pos pemeriksaan
Pos pemeriksaan menulis beberapa catatan log di log transaksi:
- LOP_BEGIN_CKPT — menandakan bahwa pos pemeriksaan dimulai
- LOP_XACT_CKPT dengan konteks NULL (hanya jika ada transaksi yang tidak terikat pada saat pos pemeriksaan dimulai) — berisi hitungan jumlah transaksi yang tidak terikat. Ini juga mencantumkan LSN dari catatan log LOP_BEGIN_XACT dari transaksi yang tidak dikomit.
- LOP_BEGIN_CKPT dengan konteks LOP_BOOT_PAGE_CKPT (hanya SQL Server 2012) — menandakan bahwa halaman boot telah diperbarui.
- LOP_END_CKPT — menandakan akhir dari pos pemeriksaan.
Pemantauan pos pemeriksaan
Akan berguna untuk mengkorelasikan pos pemeriksaan yang terjadi dengan lonjakan I/O sehingga perubahan dapat dibuat ke database tertentu (untuk subsistem I/O) untuk mengurangi lonjakan I/O jika membebani subsistem I/O. Misalnya, melakukan lebih sering, pos pemeriksaan manual, atau mengonfigurasi interval pemulihan yang lebih rendah di SQL Server 2012 dengan pos pemeriksaan tidak langsung. Ini akan menghasilkan beban I/O yang lebih konstan tanpa lonjakan tinggi yang membebani subsistem I/O. Namun, akar penyebabnya mungkin lebih banyak I/O yang dilakukan karena perubahan di suatu tempat, jadi jangan hanya menerima peningkatan aktivitas pos pemeriksaan yang tiba-tiba tanpa menyelidiki mengapa hal itu terjadi.
Penghitung Buffer Manager/Checkpoint pages/sec bukan database khusus sehingga mengidentifikasi database mana yang terlibat memerlukan tanda pelacakan atau peristiwa yang diperluas.
Lacak bendera 3502 menulis pesan ke log kesalahan tentang pos pemeriksaan basis data mana yang terjadi.
Lacak bendera 3504 menulis informasi yang lebih detail tentang berapa banyak halaman yang ditulis dan latensi penulisan rata-rata.
Bendera jejak ini aman digunakan dalam produksi untuk kapur terbatas. Yang mereka lakukan hanyalah mencetak pesan di log kesalahan.
Jika Anda ingin menggunakan acara yang diperluas, ada dua acara yang dapat Anda gunakan:checkpoint_begin dan checkpoint_end.
Ringkasan
Dalam artikel ini, kita telah berbicara tentang pos pemeriksaan di SQL Server — mekanisme utama untuk menulis halaman file data ke disk setelah diubah.