it-swarm.asia

Bagaimana mencegah log transaksi menjadi penuh selama indeks direorganisasi?

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 kembali 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 hal ini secara efektif? Menggunakan mode bulked bukan pilihan karena kehilangan data tidak dapat diterima.

19

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 di transaksi batch kecil :

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

Apakah Anda yakin tidak sedang berbicara tentang rekondisi ? Indeks REBUILD lambat, mahal, mengkonsumsi sejumlah besar log (jika tidak offline dan tidak dapat log minimal , membangun kembali online tidak dapat log minimal), adalah transaksi raksasa tunggal dan tidak dapat diganggu tanpa kehilangan semua pekerjaan.

Menurut saya Anda sedang 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? Semuanya yang DBCC CLEANTABLE tidak 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 sungguh 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.

7
Remus Rusanu

Praktik terbaik adalah untuk REORGANIZE di bawah sekitar 30% fragmentasi dan REBUILD di atas ini. Cukup, REBUILD membuat salinan bersih, REORGANIZE melakukannya di situ.

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

Pada tabel yang lebih besar (tabel 50GB sudah sampai di sana) Saya telah melihat REORGANIZE mengkonsumsi semua ruang log transaksi jika Anda mengikuti aturan ini. Tidak sering: hanya satu sistem dengan pola beban tertentu. REORGANIZE baru berjalan hingga log diperluas dan menghabiskan semua ruang disk.

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

REBUILD dapat memengaruhi kinerja lebih dari REORGANIZE dalam produksi, tetapi ini kadang-kadang dapat dikurangi dengan opsi ONLINE (diperlukan Edisi Perusahaan).

7
gbn

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 dapat 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, plus 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 Pengorganisasian')
  • Buat pekerjaan ('Periksa Pengorganisasian')

    • 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 kapan 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 Edge 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.

6
Cody Konior

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 pembangunan 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)

1
jyao

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

Masalahnya disebabkan oleh replikasi transaksional. Rupanya, log tidak dapat dicadangkan hingga operasi REORGANIZE selesai. Saya membaca di suatu tempat bahwa itu adalah masalah yang diketahui oleh Microsoft, tetapi 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.

1
IUmpierrez

Saya berasumsi Anda menjalankan sesuatu di sepanjang baris:

ALTER INDEX TENTANG REORGANISASI

Sayangnya, tidak ada cara untuk menjalankan sebagian pengaturan (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 kurang lebih sama, Anda akan 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 sesudah Anda melakukan optimasi indeks apa pun, yang akan memungkinkannya untuk mendapatkan kembali ruang yang digunakan.

0
voutmaster