Bagaimana cara menghentikan transaksi SQL Server yang ditangguhkan menunggu IO_COMPLETION?

8

Kami memiliki transaksi yang telah berjalan selama lebih dari 5 jam. Kami kehabisan ruang disk. Sesi telah terbunuh tetapi masih menunggu IO_COMPLETION. Sebenarnya wait_type baru saja berubah menjadi PAGEIOLATCH_EX. Bagaimana saya bisa menghentikan transaksi SQL Server yang ditangguhkan? Saya tidak khawatir kehilangan data karena semua itu bisa diisi ulang.

session_id: 54
STATUS: suspended
blocked by: 0
wait_type: PAGEIOLATCH_EX
Elapsed Time (in Sec): 19750.420000
open_transaction_count: 2
Tarzan
sumber
3
Biarkan selesai .. lain jika Anda melakukan sesuatu yang brengsek menarik keluar catu daya atau memulai kembali layanan server sql, itu akan membutuhkan waktu untuk kembalikan. Karena Anda tidak khawatir kehilangan data, bagaimana kalau Anda mengembalikan database dari cadangan terakhir dan kemudian mengisi kembali data? Selain itu, Anda dapat menggunakan KILL 54 WITH STATUSONLYuntuk mengetahui berapa lama waktu yang dibutuhkan untuk mengembalikan.
Kin Shah
Saya menjalankan KILL 54 DENGAN STATUSONLY dan menerima ini: SPID 54: transaksi rollback sedang berlangsung. Perkiraan penyelesaian rollback: 0%. Perkiraan sisa waktu: 0 detik. Saya tidak percaya bagian 0 detik.
Tarzan
2
Rollback adalah operasi berulir tunggal, jadi misalnya jika transaksi asli Anda berjalan dengan 8 thread paralel hingga terbunuh, rollback dapat memakan waktu 8 kali lebih lama.
James Z
@ Tarzan KILL .. WITH STATUSONLYtidak akurat dan saya mengerti maksud Anda. Bisakah kamu mencoba Alter database .. set OFFLINE or single_User WITH ROLLBACK IMMEDIATE?
Kin Shah
2
Saya akhirnya membiarkannya berjalan semalam. Akhirnya selesai. Woo hoo! Terima kasih telah berkomentar.
Tarzan

Jawaban:

1

Lain kali hal ini terjadi, jalankan sp_WhoIsActive( unduh / dokumentasi ) dan lihat siapa yang menjalankan apa dan lihat logikanya. Periksa untuk melihat apakah TSQL dapat dioptimalkan untuk berjalan lebih cepat atau mungkin memotongnya menjadi transaksi yang lebih kecil.

Saya pernah memiliki kasus di mana log transaksi dari kueri buruk oleh penulis laporan, pemuat data, dll. Akan menumbuhkan log transaksi lebih besar dari ukuran file data, dan biasanya kueri yang berkinerja buruk dan ditulis dengan buruk yang tidak dioptimalkan atau dipotong ke dalam transaksi yang lebih kecil untuk mengembalikan ruang kosong begitu transaksi selesai - ini juga merupakan SIMPLEbasis FULLdata model pemulihan - database model pemulihan perlu memiliki cadangan log transaksi yang selesai untuk memungkinkan penggunaan kembali ruang log transaksi dari transaksi yang dilakukan.

Masalah root kemungkinan adalah query sehingga menentukan siapa yang melakukan apa dan menjangkau mereka dan melaporkan masalah dengan temuan Anda akan memberi tekanan pada mereka untuk memperbaiki logika mereka untuk tidak menyemprotkan ruang disk server untuk partisi disk tersebut - semoga saja bukan logika Anda, tetapi jika ya, lihat mengoptimalkan logika untuk mencari kinerja.

Pimp Juice
sumber