SQL Server Frozen Ghost Cleanup diperlukan

15

Saya punya beberapa tabel dengan jumlah baris antara 5M dan 1.5G

Setiap tabel memiliki bidang BLOB, yang ukurannya bervariasi dari 100 byte hingga 30 MB dan yang disimpan sebagai 'tipe nilai besar di luar baris' = ON

Tabel disimpan dalam grup-grup file berbeda dengan 3-4 file masing-masing pada disk yang berbeda @ LUN yang berbeda @ SAN yang sangat cepat

Setiap hari tabel ini tumbuh dengan ukuran 5-100 Gb dan dengan 600k - 1,5M baris

Setelah waktu tertentu , yang bervariasi dari 2 minggu hingga 6 bulan, beberapa baris dihapus atau dipindahkan ke arsip DB, jadi - tidak ada baris di meja kerja yang lebih dari 6 bulan.

Konfigurasi server saat ini:

  • Mesin server SQL adalah 2008 R2 SP1 Enterprise @ 24 core, @ 64Gb RAM
  • SQL Server berjalan dengan bendera startup tambahan:

-T 3640; (Menghilangkan pengiriman pesan DONE_IN_PROC ke klien untuk setiap pernyataan dalam prosedur tersimpan. Ini mirip dengan pengaturan sesi SET NOCOUNT ON, tetapi ketika ditetapkan sebagai tanda jejak, setiap sesi klien ditangani dengan cara ini)

-T 1118; (Mengalihkan alokasi dalam tempDB dari 1pg pada satu waktu (untuk 8 halaman pertama) ke satu tingkat.)

-T 2301; (Mengaktifkan optimisasi lanjutan yang khusus untuk permintaan dukungan keputusan. Opsi ini berlaku untuk pemrosesan dukungan keputusan dari kumpulan data besar)

-T 1117; (Tumbuhkan semua file data sekaligus, jika tidak bergantian)

-E; (Menambah jumlah luasan yang dialokasikan untuk setiap file dalam filegroup. Opsi ini mungkin berguna untuk aplikasi data warehouse yang memiliki jumlah pengguna terbatas yang menjalankan indeks atau pemindaian data)

-T 834; (Menyebabkan SQL Server menggunakan alokasi halaman besar Windows untuk memori yang dialokasikan untuk buffer pool, http://msdn2.microsoft.com/en-us/library/aa366720.aspx , http://support.microsoft. com / kb / 920093 )

  • SQL Server menggunakan ekstensi halaman besar
  • SQL Server menggunakan opsi inisialisasi file cepat
  • AUTOSHRINK MATI untuk semua basis data

Masalahnya adalah - bahwa mulai dari beberapa titik waktu server (dari beberapa hari hingga berbulan-bulan) GHOST CLEANUPproses menolak untuk melakukan pembersihan paksa dan hanya melakukan pekerjaan biasa - membersihkan beberapa halaman dalam beberapa detik ( which is seen thru Extended Events), yang tidak cocok , karena tidak dapat membersihkan semua baris yang dihapus

Masalahnya berlanjut dari masa SQL Server 2005 RTM Enterprise

Bagaimana saya mencoba menyelesaikan masalah:

  • Mencoba memaksa operasi SCAN pada indeks tabel yang berkerumun
  • Mencoba memaksa operasi SCAN, yang melibatkan semua konten kolom BLOB pada indeks berkerumun tabel
  • sistem sp_clean_db_free_space & sp_clean_db_file_free_space
  • cleanpage dbcc secara manual (@dbid, @fileid, @page) untuk semua file dan halaman di DB
  • indeks cluster dibangun kembali dan direorganisasi
  • membuat ulang basis data
  • FORCEGHOSTCLEANUP DBCC

  • Ketika saya menjalankan kueri:

    select * 
    from sys.dm_db_index_physical_stats(db_id(), object_id('ProblemTable'), 1, 0, 'detailed')

    Saya melihat jutaan dan puluhan juta catatan hantu, tetapi hanya untuk tipe unit alokasi LOB_DATA

Satu-satunya hal, yang membantu:

  • menghentikan server dengan perintah SHUTDOWN atau me-restart seluruh host - ini membantu, setelah memulai kembali proses GHOST CLEANUP berjalan beberapa jam dan benar-benar membersihkan semua catatan hantu
  • DBCC SHRINKFILE dengan opsi EMPTYFILE - memindahkan semua data dari satu file ke file lain atau yang baru dibuat membersihkan catatan hantu di file ini saja - masalahnya adalah bahwa saya benar-benar benci operasi menyusut. Dan ini membutuhkan 3-4 hari untuk SATU file

pertanyaannya - apakah ada cara terprogram (lebih disukai) atau pemeliharaan untuk memaksa GHOST CLEANUP tanpa server downtime sama sekali, karena server downtime biayanya terlalu banyak, bahkan tidak dapat diterima - dari ribuan hingga puluhan ribu $ per jam

Masalah yang diperhatikan sama seperti masalah saya ada di sini:

Dan hal yang sama ada di sini:

Oleg Dok
sumber

Jawaban:

12

Akhirnya, MS telah mengenali masalah ini sebagai bug: http://support.microsoft.com/kb/2622823

Secara singkat: Sudah diperbaiki di

  • Sql Server 2008 SP3 CU4
  • Sql Server 2008 R2 CU10
  • Sql Server 2008 R2 SP1 CU4

Di Sql Server 2012 SP1 saya tidak mengalami masalah selama lebih dari satu tahun runtime.

Oleg Dok
sumber
3

Ini adalah jenis pertanyaan yang harus masuk ke CSS sehingga mereka dapat mengatasi masalah dengan Anda. Anda mungkin memiliki jaminan perangkat lunak dan kontrak dukungan. Jika Anda tidak melakukan beberapa ratus dolar tidak akan menjadi masalah besar jika memulai kembali contohnya akan dikenakan biaya ribuan dolar per jam.

Sudahkah Anda mencoba mengizinkan database untuk ditutup dan kemudian dibawa online? Ini akan menyebabkan pemulihan crash berjalan dan mungkin menendang pembersihan hantu.

Apakah Anda sering menulis ke meja? Maksud saya sepanjang waktu?

Adapun MSKB 932115 apakah Anda melihat catatan hantu dibiarkan hanya di semua file, atau apakah itu membersihkan file pertama dalam grup file?

Mengapa menggunakan -T1117 dan file instan init?

mrdenny
sumber
1. Saya pasti akan pergi ke dukungan MS. 2. Jika saya menutup DB, ia menaikkan sekitar 10-30 menit untuk menggulir ke belakang dan ke depan, yang tidak dapat diterima. 3. GC IS berjalan, tetapi ia tidak memproses entri LOB yang dihapus dari baris yang dihapus. 4. Menulis ke tabel berkinerja konstan tergantung pada waktu hari dari 20 hingga 600 menulis per detik dan sepanjang waktu. 5. File pertama DB tidak digunakan - tidak memiliki tabel besar dan hanya digunakan sebagai penyimpanan sistem, jadi - tidak ada catatan hantu.
Oleg Dok
dengan -T1117 Saya hanya ingin menyebarkan semua beban di antara beberapa file, alih-alih ketika hanya ada satu file yang tersisa dari filegroup, di mana masih ada ruang kosong - ia mulai melambat pada LATCHE PFS, file instan init meminimalkan waktu pertumbuhan fileg, karena kenaikan diatur ke 10-50 Gb per putaran. Saya tidak bisa begitu saja mengatur file sebesar yang saya bisa, karena itu benar-benar tidak dapat diprediksi - file mana yang akan mendapatkan datanya hari ini dan dalam volume berapa. Lebih mudah untuk meminta admin SAN untuk menambahkan lebih banyak ruang, daripada memprediksi kepada siapa saya harus menambahkan ruang.
Oleg Dok