Apakah mencadangkan basis data mengecilkan ukuran log transaksi?

8

Saya mencoba untuk mengumpulkan beberapa pengetahuan tentang database SQL dan saya punya beberapa pertanyaan tentang file log transaksi (LDF).

Pertama, ketika Anda membuat database, Anda harus menentukan Ukuran File Awal untuk database dan file log. Dari apa yang saya lihat, setelah file dibuat pada disk, mereka akan memiliki ukuran yang ditentukan terlepas dari apakah ada data aktual dalam database atau jika telah ada transaksi (log).

Pemahaman saya adalah bahwa membuat cadangan database:

  1. Memotong log transaksi, dan
  2. Kecilkan ukurannya

dari file LDF pada disk dengan "mengosongkan" log di dalamnya.

Sekarang sepertinya saya tidak memahami ini dengan benar karena file log tampaknya berukuran tetap. Pertanyaan saya yang sebenarnya seperti ini:

Apa yang sebenarnya dilakukan pemotongan log ke file log (LDF)? Proses ini seharusnya mencegah disk menjadi penuh.

Harap perbaiki saya jika saya tidak memahami beberapa konsep dengan benar.

Terima kasih!

Anthony
sumber

Jawaban:

20

File log transaksi (LDF) terdiri dari banyak file log virtual (VLF) di dalamnya. Anggap saja seperti kabinet dengan beberapa laci tarik. Anda dapat memilih kabinet besar, atau yang kecil - tetapi masih akan menjadi ukuran tetap dengan jumlah laci yang berbeda.

Ketika SQL Server berfungsi, itu menempatkan transaksi Anda ke dalam laci (VLFs.) Dimulai di salah satu ujung kabinet Anda, mengisi laci pertama, kemudian ketika ruang di laci itu habis, ia pindah ke laci berikutnya.

Saat Anda mencadangkan log transaksi, yang sebenarnya Anda lakukan adalah:

  • Menemukan laci pertama yang memiliki transaksi di dalamnya yang belum didukung
  • Menyalin transaksi tersebut di tempat lain
  • Jika laci itu tidak lagi aktif digunakan (karena SQL Server telah pindah ke laci berikutnya), maka Anda menandai laci itu sebagai tersedia untuk digunakan kembali (menganggapnya sebagai membuang semua konten keluar)

Cadangan tidak mengubah ukuran kabinet Anda (file log).

Brent Ozar
sumber
Hai Brent, terima kasih telah menjelaskannya untuk saya, hargai itu! Jadi pada dasarnya, Anda tidak dapat mengurangi ukuran "kabinet", Anda hanya dapat mengosongkan laci. Sekarang saya membaca banyak posting orang yang berbicara tentang mengecilkan ukuran log. Apakah itu merujuk pada penyusutan ukuran VLF (konten laci) dan benar-benar mengecilkan ukuran file LDF pada disk? Dari apa yang sekarang bisa saya mengerti, Anda tidak dapat mengecilkan "kabinet". Terima kasih!
Anthony
@Anthony ya, Anda dapat mengurangi ukuran kabinet dengan mengecilkan ukuran file log, tetapi secara umum, itu ide yang sangat buruk (untuk alasan yang sudah Anda baca.)
Brent Ozar
Saya akan memveto pernyataan bahwa menyusutkan TLog itu buruk. Akses tlog cukup seq. di alam. Tidak ada reorganisasi data yang diperlukan saat menyusutkan log (seperti untuk file data. Anda hanya dapat melepaskan ruang melewati pointer aktif terakhir). Jadi ini tidak menyebabkan fragmentasi sama sekali.
Heiko Hatzfeld
1
@ HeikoHatzfeld menumbuhkannya kembali adalah operasi pemblokiran dan tidak memanfaatkan Inisialisasi File Instan, jadi ini sangat lambat. Veto ditimpa. ;-)
Brent Ozar
Ini bukan apa-apa yang Anda lakukan secara teratur tetapi hanya sekali setelah Anda menyadari bahwa Anda tidak menyiapkan rencana cadangan yang benar ... Dan faktor pertumbuhan harus berupa ukuran yang konstan dan masuk akal. Dalam kondisi seperti itu lumayan.
Heiko Hatzfeld
6

Pencocokan dan Pencampuran

Mencadangkan log transaksi tidak sama dengan memotong file log transaksi, dan memotong file log transaksi tidak sama dengan menyusutkan file log transaksi. Oh ya, dan mencadangkan file log transaksi tidak harus memicu pemotongan. Tergantung pada beban saat ini, mesin database mungkin memutuskan untuk menetapkan pos pemeriksaan, tetapi menunggu sedikit dengan pemotongan.

Menjelaskan

File log transaksi adalah tempat mesin database menyimpan modifikasi yang dibuat untuk data dalam database, terlepas dari apakah database dalam model pemulihan SEDERHANA atau dalam model pemulihan LENGKAP. (Penting)

Sekarang file log transaksi database bukan hanya satu wadah penyimpanan kontinu, tetapi kumpulan File Log Virtual (VLF) yang dibuat dalam urutan berurutan di dalam file Transaction Log (TLog). Ukuran VLF bervariasi tergantung pada versi SQL Server yang saat ini Anda gunakan dan juga pada ukuran awal yang Anda pilih selama pembuatan file TLog dan juga ukuran yang Anda pilih (jika ada) untuk pengaturan pertumbuhan otomatis File TLog.

Referensi:
- Perubahan penting pada algoritma pembuatan VLF di SQL Server 2014 (SQLSkills.com)
- Nomor urut VLF awal dan ukuran file log default (SQLSkills.com)
- Di dalam Mesin Penyimpanan: Lebih lanjut tentang sifat melingkar dari log (SQLSkills. com)
... dan mungkin dalam urutan terbalik

Ketika data dimodifikasi dalam database, Mesin Database akan menulis perubahan ini ke dalam TLog dari database yang sesuai untuk menegakkan konsistensi transaksional. Ini juga dikenal sebagai ACID - Atomicity, Consistency, Isolasi, Durability . Transkripsi aktual dari perubahan ini disimpan dalam VLFs dari TLog (file). Ketika VLF penuh, transaksi terbaru akan disimpan dalam VLF berikutnya yang tersedia secara berurutan.

Pengecualian

Namun jika akhir file TLog tercapai, modifikasi akan disimpan dalam VLF pertama di awal file TLog. (dijelaskan dalam Inside the Storage Engine: Lebih lanjut tentang sifat melingkar dari log )

Ketika tidak ada VLF tersedia untuk menyimpan transaksi baru dan jika pengaturan pertumbuhan otomatis dikonfigurasi, Mesin Database akan menumbuhkan file TLog dengan jumlah yang ditentukan dan membuat VLF tambahan tergantung pada ukuran yang ditentukan dalam pengaturan pertumbuhan otomatis dan formula dijelaskan dalam perubahan penting pada algoritma penciptaan VLF di SQL Server 2014 . Transaksi selanjutnya dapat disimpan di VLF berikutnya di dalam file TLog.

Mencadangkan File TLog

Ketika Anda memicu cadangan file TLog semua yang Anda lakukan adalah memberitahu mesin database untuk

  • lihat file TLog
  • menentukan kapan pencadangan log transaksi terakhir terjadi (LSN: Log Sequence Number; untuk penelitian lebih lanjut)
  • mengatur Checkpoint di file TLog ( Database Checkpoints (SQL Server) )
  • menyimpan salinan cadangan dari file TLog pada disk / tape sambil melacak LSN sebelumnya dan yang dilakukan LSN tepat sebelum cadangan selesai
  • transfer semua modifikasi ke "database"
  • tandai VLFs sebagai dapat digunakan kembali

Sejauh ini tidak ada ruang yang telah dirilis di dalam file TLog untuk Mesin database untuk digunakan kembali ...

Pemotongan Otomatis File TLog

... tetapi jika Mesin Basis Data memiliki beberapa siklus untuk cadangan dan tidak berada di bawah tekanan yang sangat berat itu kadang-kadang akan melihat file TLog, perhatikan Pos Pemeriksaan dan lepaskan VLF untuk digunakan kembali. Ruang di dalam file TLog masih digunakan oleh VLF (ukuran yang sama, lokasi yang sama) tetapi mereka bebas untuk digunakan kembali.

Ini didokumentasikan dalam Pemotongan Log Transaksi :

Kecuali ketika tertunda karena alasan tertentu, pemotongan log terjadi secara otomatis sebagai berikut: - Di bawah model pemulihan sederhana, setelah pos pemeriksaan.

  • Di bawah model pemulihan penuh atau model pemulihan yang dicatat secara massal, setelah cadangan log, jika pos pemeriksaan telah terjadi sejak cadangan sebelumnya. Untuk informasi lebih lanjut, lihat "Pemotongan log di bawah model pemulihan log penuh dan massal," nanti dalam topik ini.

Ada beberapa kasus ketika ini tidak terjadi:

Meskipun otomatis, pemotongan log dapat ditunda oleh berbagai faktor. Untuk informasi tentang apa yang dapat menunda pemotongan log, lihat Faktor-faktor yang Dapat Menunda Pemotongan log .

Visualisasi pemotongan log

Pemotongan log dapat diamati ketika Anda meminta ukuran TLog menggunakan pernyataan SQL atau laporan Space Database di UI SSMS. Anda mungkin mengamati bahwa ruang yang digunakan di dalam file TLog mungkin hanya 1% dari ukuran file TLog yang tersedia.

Menyusut atau Tidak Menyusut

Rekomendasi umum adalah untuk tidak mengecilkan file TLog, karena itu tumbuh karena alasan tertentu dan mungkin akan tumbuh lagi ke ukuran dulu. Tapi itu cerita untuk posting lain. Ada beberapa alasan bagus, salah satunya adalah ketika Anda membuat kembali ukuran VLF di dalam file TLog Anda.

Menjawab pertanyaan Anda

Sebaris tepat di bawah asumsi dan pertanyaan Anda

Pemahaman saya adalah bahwa membuat cadangan database:

  • Memotong log transaksi, dan

Ini anggapan yang salah. Mencadangkan basis data Anda (LENGKAP, BERBEDA) tidak melakukan apa-apa dengan file TLog. Cadangan LENGKAP akan membuat keadaan konsisten dari basis data Anda bersama dengan transaksi yang dilakukan dari file TLog. Cadangan DIFF akan membuat status yang konsisten dari semua cadangan TLog sebelumnya sejak cadangan LENGKAP terakhir dari basis data Anda.

Namun, Cadangan TLOG akan membuat cadangan dari transaksi yang dilakukan dari file TLog, menetapkan pos pemeriksaan dan mungkin (saat tidak sedang dalam beban berat) melepaskan VLF untuk digunakan kembali.

  • Kecilkan ukurannya

Tidak, saat mempertimbangkan cadangan FULL dan DIFF. Tidak, ketika mempertimbangkan cadangan TLOG, tetapi akan membebaskan VLF di dalam file TLog, jika mesin database memiliki waktu luang.

Apa yang sebenarnya dilakukan pemotongan log ke file log (LDF)? Proses ini seharusnya mencegah disk menjadi penuh.

Memotong log memungkinkan VLF digunakan kembali. Itu saja.

Proses ini dapat bermanfaat mencegah file TLog dari menumbuhkan pengaturan pertumbuhan otomatis JIKA telah ditetapkan.

Jika tidak ada pengaturan pertumbuhan otomatis yang telah ditetapkan , karena proses rekayasa persyaratan Anda menentukan bahwa file TLog akan memiliki ukuran tetap, maka kasus terburuk di sini adalah bahwa TLog terisi karena tidak ada cadangan TLog yang terjadi dan karenanya tidak ada VLF yang dibebaskan. TLog tidak dapat tumbuh dan VLF tidak dibebaskan untuk memungkinkan transaksi lebih lanjut ditulis ke file TLog (atau VLF secara internal).

John alias hot2use
sumber
4

Sementara Brent Ozar telah memberi Anda penjelasan tentang bagaimana file log transaksi terlihat seperti saya akan fokus pada pertanyaan-pertanyaan tertentu Anda

Pemahaman saya adalah bahwa membuat cadangan database:

  • Memotong log transaksi, dan
  • Kecilkan ukurannya

Cadangan penuh tidak melakukan apa pun pada log transaksi dalam model pemulihan apa pun. Dalam model pemulihan penuh ketika Anda mengambil cadangan log transaksi kemudian memotong log. Harap dicatat jika transaksi berjalan lama masih ada memegang VLF atau sesuai penjelasan Brent masih membutuhkan laci transaksi lain tidak dapat memanfaatkan kembali laci atau dalam istilah teknis tidak akan terpotong sehingga dapat digunakan kembali.

Itu juga tidak menyusutkan log transaksi. Untuk menyusutkan log, Anda harus menggunakan dbcc shrinkfileperintah

Apa yang sebenarnya dilakukan pemotongan log ke file log (LDF)? Proses ini seharusnya mencegah disk menjadi penuh.

Itu membuat file log dapat digunakan kembali sehingga transaksi lain dapat menggunakannya atau sesuai analogi Brent, orang lain dapat menggunakan laci untuk menyimpan barang-barang di sana.

Setelah melalui jawaban saya sangat menyarankan Anda untuk membaca tentang log transaksi di SQLSKILLS.com

Shanky
sumber
Terima kasih Shanky, sangat menghargai penjelasan Anda! Jadi, ketika cadangan memotong log, mereka sebenarnya tidak mengurangi ukuran file LDF, mereka hanya "memberi ruang" untuk transaksi lain yang akan diproses di dalam file log itu. Apakah saya benar dalam menganggap ini? Terima kasih!
Anthony
Anda benar sekali.
Shanky