Bagaimana mencegah log transaksi menjadi penuh selama indeks direorganisasi?

19

Kami memiliki beberapa mesin di mana kami telah mengalokasikan ukuran log transaksi untuk 50GB. Ukuran tabel yang saya coba reorganisasi adalah 55 - 60 gb tetapi akan terus meningkat. Alasan utama saya ingin mengatur ulang adalah untuk mendapatkan kembali ruang dan manfaat kinerja karena itu adalah bonus tambahan.

Tingkat fragmentasi tabel adalah 30 - 35%. Pada beberapa mesin ini saya mendapatkan kesalahan "log transaksi penuh" dan mengatur ulang gagal. Ukuran log transaksi mencapai hingga 48GB. Apa cara yang baik untuk mengatasi ini? Kami tidak memiliki kenaikan otomatis diaktifkan dan saya enggan melakukannya.

Saya bisa meningkatkan ukuran log ke nilai yang lebih besar tetapi karena ukuran tabel meningkat di masa mendatang, nilainya mungkin tidak cukup. Juga mengalahkan tujuan melakukan reorganisasi untuk mendapatkan kembali ruang jika saya akan meningkatkan ukuran log sama. Adakah ide tentang bagaimana saya dapat mengatasi ini secara efektif? Menggunakan mode bulked bukan pilihan karena kehilangan data tidak dapat diterima.

Paul White mengatakan GoFundMonica
sumber

Jawaban:

7

Praktik terbaik adalah di REORGANIZEbawah sekitar 30% fragmentasi dan di REBUILDatas ini. Cukup, REBUILDbuat salinan bersih, REORGANIZEapakah itu in-situ.

Periksa apa yang sebenarnya Anda lakukan: Anda tidak memiliki rencana pemeliharaan melakukan keduanya, bukan?

Pada tabel yang lebih besar (meja 50GB sudah sampai di sana) Saya telah melihat REORGANIZEmengkonsumsi semua ruang log transaksi jika Anda mengikuti aturan ini. Tidak sering: hanya satu sistem dengan pola beban tertentu. The REORGANIZEhanya berlari sampai log diperluas dan dikonsumsi semua ruang disk.

Kami beralih ke REBUILDbukan tanpa masalah lagi, tetapi mengabaikan fragmentasi di bawah 25%. Ini bekerja lebih baik untuk kami: Anda harus melihat apakah itu bekerja untuk Anda.

REBUILDdapat mempengaruhi kinerja lebih dari REORGANIZEproduksi, tetapi ini kadang-kadang dapat dikurangi dengan ONLINEopsi (diperlukan Edisi Perusahaan).

gbn
sumber
Angka-angka aturan praktis dan berbicara dalam istilah kualitatif dan kuantitatif sangat membantu.
Robino
6

REORGANIZE (seperti pada ALTER INDEX ... REORGANIZE) adalah operasi yang sangat cepat (yah, sebagian besar ...), yang memerlukan sejumlah kecil log, dapat diinterupsi kapan saja dan dilanjutkan kemudian, dan bekerja secara internal dalam transaksi batch kecil :

defragmentasi dilakukan sebagai serangkaian transaksi pendek, jadi log yang besar tidak perlu jika cadangan log sering dilakukan atau jika pengaturan model pemulihan SEDERHANA.

Apakah Anda yakin tidak sedang membicarakan pembangunan kembali ? Indeks REBUILD lambat, mahal, mengkonsumsi sejumlah besar log (jika tidak offline dan tidak dapat ditebang secara minimal , rekondisi online tidak dapat ditebang secara minimal), adalah transaksi raksasa tunggal dan tidak dapat diinterupsi tanpa kehilangan semua pekerjaan.

Sepertinya saya melakukan pembangunan kembali, yang merupakan operasi yang sangat luar biasa yang tidak boleh Anda lakukan kecuali Anda memiliki alasan yang dipikirkan dengan sangat baik. Reklamasi ruang apa yang Anda lakukan? Adakah yang DBCC CLEANTABLEtidak akan menangani? Sudahkah Anda memeriksa struktur fisik tabel, apakah sudah melayang dari struktur logis (lihat kolom tabel SQL Server di bawah tenda untuk detailnya)?

Jika Anda benar - benar harus membangun kembali tabel maka saya khawatir Anda tidak punya pilihan selain menggigit peluru dan mengalokasikan log yang diperlukan. Jangan biarkan itu tumbuh secara otomatis, itu hanya akan memperlambat proses. Pra-tumbuh hingga 2,5 kali ukuran tabel.

Jika tabel dipartisi maka Anda dapat membangun kembali offline (dan mengatur ulang) satu partisi sekaligus. Rekondisi online hanya dapat dilakukan di seluruh level tabel.

Remus Rusanu
sumber
2
saya melakukan reorganisasi. model pemulihan penuh dan saya melihat ukuran log transaksi besar. alasan kegagalan adalah salah satu dari dua 1. mirroring. log harus didorong ke sekunder sebelum ruang dapat direklamasi 2. cadangan log. Meskipun kami mengambil cadangan setiap 15 menit, terkadang gagal karena alasan ini.
Situasi yang sama di sini, 2008R2, indeks mengatur ulang (tidak membangun kembali), dan bahkan dalam mode sederhana (!) Tlog tumbuh lebih dari ukuran tabel terbesar yaitu> 40 GB. Ketika dalam mode pemulihan penuh, melakukan backup tlog 5 menit juga tidak membantu, hanya satu file backup TRN besar yang dihasilkan selama indeks reorg. Tampaknya tidak masuk akal tetapi perilaku yang sama pada dua server yang berbeda. Adakah yang tahu bagaimana sebenarnya membagi ini dalam transaksi batch kecil seperti yang didokumentasikan?
realMarkusSchmidt
5

Saya pernah mengalami masalah ini sebelumnya.

  • Anda memiliki database besar dan drive log kecil. Anda ingin mengatur ulang (karena berbagai alasan).
  • Ketika Anda mencoba ini pada tabel terfragmentasi besar log mengisi sampai drive log penuh dan kemudian perintah dibatalkan.
  • Jika dalam mode sederhana transaksi lain mungkin gagal sampai log dihapus di pos pemeriksaan berikutnya, dan jika dalam mode penuh transaksi lain mungkin gagal sampai cadangan log berikutnya. Padam!
  • Jika Anda dalam mode penuh Anda meningkatkan frekuensi cadangan log Anda tetapi itu tidak membantu menghindari masalah karena reorganisasi dilakukan dalam transaksi implisit, log tidak menghapus sampai transaksi selesai atau dibatalkan atau dihentikan.
  • Dan Anda BENAR-BENAR ingin agar reorganisasi berjalan hingga selesai.

Itu sedikit kontra-intuitif karena Anda tahu jika Anda membatalkan reorganisasi itu bisa berlanjut dari tempat sebelumnya, hanya saja sebuah aborsi melakukan transaksi daripada memutar balik.

Inilah yang Anda lakukan. Ini agak panjang tapi langsung.

  • Pra-tumbuh file log Anda ke ukuran yang relatif besar, tetapi tidak maksimal. Pada dasarnya Anda ingin menyisakan cukup ruang untuk melakukan pekerjaan yang bermanfaat, ditambah untuk beberapa pertumbuhan kecil jika terjadi, sehingga operasi normal tidak akan berhenti.
  • Buat pekerjaan untuk menjalankan indeks Anda mengatur ulang ('Atur Ulang').
  • Buat agen WMI alert ('Reorganize Relief Valve') pada kondisi kinerja.

    • Objek: SQLServer: Database
    • Penghitung: Log Persen Digunakan
    • Instance: (nama database besar Anda)
    • Peringatan jika penghitung naik di atas: 80
    • Tanggapan: Jalankan pekerjaan ('Periksa Pengaturan Ulang')
  • Buat pekerjaan ('Atur Ulang Pemeriksaan')

    • Dalam pekerjaan, periksa aktivitas msdb.dbo.sysjob untuk melihat apakah pekerjaan 'Reorganisasi' berjalan. Dan jika itu ...
    • Hentikan pekerjaan dan polling sampai berhenti. Ini bisa memakan waktu beberapa detik.
    • (Jika Anda dalam mode penuh) Memicu pekerjaan cadangan log Anda dan konfirmasi ketika selesai.
    • Periksa kembali sys.dm_os_performance_counters bahwa penghitung ruang bebas log Anda telah berkurang di bawah ambang batas Anda.
    • Mulai pekerjaan 'Atur Ulang'.
  • Uji semua ini di suatu tempat, bahkan kotak pasir pengembangan, untuk memastikannya berfungsi dengan baik sebelum menempelkannya ke server produksi Anda.

Apa yang akan Anda lihat adalah pekerjaan 'Reorganisasi' dimulai dan mulai mengisi log. Ketika log mencapai satu persen penuh, memicu peringatan WMI (dalam waktu sekitar 30-an) yang menjalankan pekerjaan Anda yang lain yang melihat bahwa pekerjaan 'Reorganisasi' sedang berjalan dan kemungkinan besar salah. Kemudian berhenti 'Atur Ulang', lakukan pencadangan, konfirmasi ruang bebas log kembali ke nilai yang masuk akal, kemudian mulai pekerjaan 'Atur Ulang' Anda lagi yang akan mengambilnya dari tempat sebelumnya.

Sehingga Anda dapat alasan Anda melakukan pra-ukuran log Anda ke angka yang masuk akal dalam skenario ini adalah untuk mengurangi jumlah pertumbuhan / pemicu / pekerjaan / berhenti / restart, sehingga bisa lebih efisien, dan juga menjaga ruang yang cukup untuk pertumbuhan sesekali yang tidak terjebak dalam waktu.

Ini semacam skenario aneh. Saya cukup yakin saya akan dibohongi ini beberapa tahun yang lalu dan jelas ada masalah mendasar yang mendasar di sini. Tetapi jika Anda berurusan dengan ratusan server, beberapa kasus tepi seperti ini akan muncul yang tidak dapat ditangani dengan cara apa pun, untuk alasan bisnis apa pun, kecuali dengan MacGyvering solusi sementara yang menyelesaikan pekerjaan.

Selama aman, logis, teruji, dan terdokumentasi dengan baik, seharusnya tidak ada masalah.

Cody Konior
sumber
1

Inilah yang biasanya saya lakukan (saya juga punya beberapa tabel dengan masing-masing 80 + GB besar) untuk indeks reorg (karena indeks reorg dapat dihentikan kapan saja tanpa kehilangan pekerjaan reorg sebelumnya).

  1. Selama indeks reorg saya akan meningkatkan cadangan tlog dari frekuensi 30 menit reguler saya menjadi setiap frekuensi 10 menit
  2. Saya memiliki sesi lain melakukan cek ruang kosong tlog setiap 1 menit, dan jika ruang kosong tlog di bawah ambang batas, saya akan menghentikan sesi indeks reorg dan memulai (atau menunggu) cadangan tlog. Kemudian restart indeks reorg.

Dalam kerangka pemeliharaan indeks saya, saya mengkategorikan indeks menjadi dua kelompok, satu untuk membangun kembali indeks dan satu lagi untuk indeks reorg. Untuk indeks membangun kembali, saya akan menggunakan pendekatan yang agak berbeda karena saya tidak ingin menghentikan sesi pembangunan kembali indeks (yang akan menyebabkan kemunduran dan kehilangan semua pekerjaan sebelumnya). Selama indeks dibangun kembali, jika sesi pemantauan saya memperhatikan skenario ruang kosong file tlog, sesi pemantauan akan secara otomatis meningkatkan file tlog, dan dalam skenario terburuk (mis. Disk penuh), sesi pemantauan saya akan membuat file log lain ( tetapi nanti saya akan menjatuhkannya) di drive lain (drive cadangan)

jyao
sumber
1

Saya memiliki masalah yang sama dengan penulis pertanyaan, dan melihat komentarnya, saya dapat mengatakan saya memiliki pengaturan yang sama. Ketika saya mencoba untuk melakukan REORGANIZE, log tumbuh penuh, terlepas dari ukuran, bahkan beberapa kali ukuran seluruh tabel.

Masalahnya disebabkan oleh replikasi transaksional . Rupanya, log tidak dapat dicadangkan hingga REORGANIZEoperasi selesai. Saya membaca di suatu tempat bahwa itu adalah masalah yang diketahui oleh Microsoft, tapi saya tidak yakin di mana.

Setelah saya menonaktifkan replikasi transaksional, cadangan log berfungsi normal kembali, dan melakukan pencadangan log setiap 30 detik sambil mengatur ulang bekerja dengan baik untuk saya.

IUmpierrez
sumber
0

Saya berasumsi Anda menjalankan sesuatu seperti:

ALTER INDEX TENTANG REORGANISASI

Sayangnya, tidak ada cara untuk menjalankan pengaturan parsial (cara Anda dapat mengecilkan sebagian file log misalnya). Cara saya dapat memikirkan masalah ini adalah:

1) mengatur database ke mode pemulihan sederhana saat Anda menjalankan reorganisasi, tetapi Anda mengatakan itu tidak dapat diterima

2) mempartisi indeks - jika dapat memikirkan cara untuk mempartisi indeks untuk mendapatkan partisi berukuran kira-kira sama, Anda kemudian dapat mengatur ulang (atau membangun kembali dengan opsi online) setiap partisi secara mandiri dan dengan demikian membatasi pertumbuhan file log

Saya yakin Anda melakukan ini, tetapi jika tidak, Anda mungkin ingin memulai cadangan file log sebelum dan setelah Anda melakukan optimasi indeks apa pun, yang akan memungkinkannya untuk mendapatkan kembali ruang yang digunakan.


sumber