CHECKPOINT atau COMMIT menulis ke disk?

12

Katakanlah, untuk SQLServer2008R2 dan lebih tinggi, dengan basis data mode pemulihan penuh.

Saya selalu berpikir:

  1. Ketika suatu transaksi dilakukan (COMMIT), transaksi tersebut ditulis ke dalam transaksi log in RAM.

  2. Ketika CHECKPOINT terjadi (setelah beberapa waktu dan / atau beberapa transaksi dan kriteria lainnya), transaksi antara CHECKPOINT terakhir dan saat ini ditulis ke disk.

  3. Ketika LOG CADANGAN terjadi, data ditulis ke file MDF.

Apakah saya benar? Beberapa kolega saya mengatakan saya salah, dan sulit untuk menemukan jawaban yang benar, bahkan dengan BOL.

Terima kasih!

Patator
sumber

Jawaban:

20

Sayangnya ada sejumlah kesalahan dalam jawaban sejauh ini sehubungan dengan cara kerja COMMIT, jadi saya akan menambahkan satu lagi. Lihat Cara Kerjanya: Presentasi I / O SQL Server Bob Dorr untuk detail dan Dasar-Dasar I / O SQL Server 2000 . Inilah cara kerjanya:

  • Semua penulisan data yang sepenuhnya tercatat (perubahan) terjadi dalam urutan yang persis sama (lihat Memahami Bagaimana SQL Server mengeksekusi Kueri: Menulis Data ):

    • Halaman data terkunci secara eksklusif
    • Catatan log yang menjelaskan perubahan ditambahkan ke log, dalam memori. Catatan log baru menghasilkan LSN baru, lihat Apa itu LSN: Nomor Urutan Log .
    • Halaman data dimodifikasi (catatan data dan last_update_lsn pada halaman). Halaman ini sekarang dimodifikasi ('kotor').
    • Kait halaman data dilepaskan
    • tidak ada yang ditulis ke disk secara langsung sebagai hasil dari pembaruan
  • KOMIT melakukan hal berikut

    • menambahkan catatan log baru yang menggambarkan COMMIT ke log, dalam memori
    • semua catatan log tidak memerah ke disk, hingga dan termasuk yang dihasilkan di atas, memerah (ditulis ke disk)
    • utas blok menunggu hingga OS melaporkan penulisan di atas sebagai tahan lama (IO selesai)
    • Pernyataan KOMIT (atau pernyataan DML dengan komit implisit) selesai
  • CHECKPOINT melakukan yang berikut (disederhanakan), lihat Bagaimana cara kerja pos pemeriksaan dan apa yang dicatat :

    • Semua halaman kotor dalam memori ditulis ke disk
      • Untuk setiap halaman kotor, sebelum mulai menulis ke disk, log ke dan termasuk LSN yang merupakan last_update_lsn pada halaman itu memerah (ditulis ke disk). Perhatikan bahwa flushin pada setiap LSN yang menyiratkan semua LSN sebelumnya juga memerah, jadi untuk halaman yang paling kotor ini adalah no-op karena itu last_update sendiri kemungkinan sudah memerah.
    • catatan log yang menggambarkan pos pemeriksaan ditulis ke log dan dibilas
    • halaman boot basis data diperbarui dengan LSN dari catatan yang dihasilkan di atas

Menulis bekerja secara berbeda untuk operasi yang dicatat minimal, lihat Operasi yang Dapat Dicatat Minimal . Secara kasar operasi yang ditebang secara minimal bertindak sebagai berikut (disederhanakan):

  • Sebelum menyisipkan baris dalam halaman sebagai bagian dari operasi yang dicatat minimal, catatan log yang menggambarkan fakta bahwa halaman yang berpartisipasi dalam operasi yang dicatat minimal sedang dibuat dan ditambahkan ke log (dalam memori)
  • Halaman yang dicatat secara minimal sedang diperbarui, karena banyak sisipan yang sedang ditulis sesuai dengan kebutuhan. Tidak ada yang dicatat, nothign ditulis ke disk.
  • Ketika operasi yang dicatat secara minimal dilakukan, sebelum melakukan itu diperlukan bahwa semua halaman yang berpartisipasi dalam operasi yang dicatat dalam transaksi tersebut ditulis ke disk. Onyl setelah penulisan ini selesai, catatan log COMMIT dapat ditambahkan ke log (dalam memori) dan dan log, hingga dan termasuk catatan log komit yang baru ditambahkan ini, dihapus (tertulis) ke disk.
Remus Rusanu
sumber
8

Ketika suatu transaksi dilakukan (COMMIT), transaksi tersebut ditulis ke dalam transaksi log in RAM.

Transaksi ditulis ke log transaksi bahkan sebelum mengubah halaman atau data seperti yang diminta oleh permintaan. Ini disebut write ahead logging (WAL). Jika SQL Server lumpuh saat halaman sedang diperbarui dalam memori, WAL memastikan bahwa mesin DB dapat membaca log transaksi dan mengembalikan transaksi. Ini adalah properti ACID dari RDBMS.

Ketika CHECKPOINT terjadi (setelah beberapa waktu dan / atau beberapa transaksi dan kriteria lainnya), transaksi antara CHECKPOINT terakhir dan saat ini ditulis ke disk.

Sebuah pos pemeriksaan membersihkan halaman-halaman kotor dari buffer ke disk. Berperilaku sedikit berbeda untuk tempdb . Halaman kotor adalah halaman yang telah berubah sejak dibaca dari disk. Proses pos pemeriksaan ini menciptakan tanda di log transaksi hingga pada titik di mana transaksi telah dilakukan. Setelah gagal, pemulihan tahu bahwa semua transaksi hingga tanda itu telah dilakukan. Anda dapat menerbitkan pos pemeriksaan secara manual dengan perintah TSQL.

Ketika LOG CADANGAN terjadi, data ditulis ke file MDF.

Tidak, ketika log cadangan terjadi SQL Server menyalin informasi log transaksi dari file log database ke disk tempat Anda menulis cadangan. Operasi cadangan membaca data dari disk dan menulis data pada disk.

Saya ingin Anda membaca tautan di bawah ini

Memahami Logging dan pemulihan di SQL Server Sudah ditunjukkan oleh Mark

SQL Server 2008 Internal dan Buku pemecahan masalah

Arsitektur dan Manajemen Log Transaksi

Shanky
sumber
Ok, sepertinya jelas. Hanya untuk memastikan: ketika suatu KOMIT terjadi, Anda mengatakan itu ditulis ke log transaksi; maksud Anda buffer atau disk (LDF)?
Patator
Itu akan selalu ditulis untuk log cache terlebih dahulu dan kemudian dibilas ke log transaksi pada disk. Saya telah menambahkan tautan manajemen log transaksi, silakan merujuknya untuk cara kerja WAL
Shanky
"Jika SQL Server lumpuh saat halaman sedang diperbarui dalam memori WAL memastikan bahwa mesin DB dapat membaca log transaksi dan mengembalikan transaksi." Ini hanya benar jika transaksi tidak dilakukan. Jika sudah berkomitmen tidak ada yang bisa dibatalkan. Informasi dalam log transaksi digunakan untuk memperbarui file data. Bahkan jika buffer tidak ditulis ke file data sebelum crash.
miracle173
@ Miracle: Saya kira jika halaman sedang diperbarui yang terkait dengan transaksi tertentu tentu saja transaksi tidak akan dilakukan.
Shanky
4

Di bawah ini akan menjelaskan hal-hal untuk Anda:

Ketika suatu transaksi dilakukan (COMMIT), transaksi tersebut ditulis ke dalam transaksi log in RAM.

  • COMMIT (atau BEGIN) tidak ada hubungannya dengan model pemulihan. Itu di tingkat transaksi. Transaksi harus sepenuhnya selesai atau gagal ( ingat properti ACID ). Jadi intinya, suatu KOMIT akan menandai akhir dari transaksi yang berhasil (baik implisit atau eksplisit). Pernyataan COMMIT akan menjamin bahwa semua modifikasi transaksi dijadikan bagian permanen dari basis data.
  • Untuk membuat perubahan apa pun, SQL Server akan menggunakan WAL (Write-ahead Logging) di mana ia akan terlebih dahulu menjelaskan dalam log setiap perubahan yang akan dibuat, sebelum memodifikasi data.

Ketika CHECKPOINT terjadi (setelah beberapa waktu dan / atau beberapa transaksi dan kriteria lainnya), transaksi antara CHECKPOINT terakhir dan saat ini ditulis ke disk.

Ketika LOG CADANGAN terjadi, data ditulis ke file MDF.

Mengacu pada :

Kin Shah
sumber