Pertama-tama, periksa SQL errorlog untuk melihat apakah itu benar-benar mencapai ukuran maksimal untuk log. Jika ya, maka kueri tidak memiliki harapan untuk menyelesaikan, itu mungkin sudah dalam keadaan rollback.
Bahkan jika ya, saya selalu lebih suka membunuh spid secara manual (gunakan sp_who2
atau sp_WhoIsActive
untuk menemukan spid, lalu lakukan kill 59
atau apa pun). Anda juga tidak dapat memeriksa status rollback kecuali jika Anda melakukan KILL eksplisit, lihat utas terkait ini .
Karena ini adalah penghapusan, dan bukan pembaruan atau penyisipan, Anda mungkin sangat beruntung dan menemukannya segera kembali. Jika tidak, mungkin diperlukan selama (atau lebih lama) untuk memutar kembali seperti yang dilakukan untuk sampai ke titik ini.
Untuk melihat status rollback, gunakan
kill 59 with statusonly
Sayangnya, saya menemukan ini sering tidak menunjukkan sesuatu yang berguna, hanya "0% selesai". Dalam hal ini, Anda harus menggunakan sp_who2
dan menonton IO dan CPU untuk melihat apakah masih melakukan sesuatu.
Mengenai reboot, ini adalah risiko besar. Jika spid diaktifkan kembali secara aktif (CPU dan IO berubah), maka restart SQL hanya akan membuat database offline sepenuhnya sampai rollback sepenuhnya selesai (jam dan jam). Tetapi , jika CPU dan IO tidak bergerak, maka itu mungkin akan langsung menghapusnya. Bagaimanapun, itu adalah risiko.
Satu opsi terakhir, jika semuanya sangat mengerikan: Jika Anda memiliki cadangan tepat sebelum penghapusan dimulai (dan belum ada pembaruan lain untuk db) , maka cara tercepat untuk memulihkan mungkin dengan hanya menjatuhkan DB, mulai ulang SQL, dan pulihkan dari cadangan.
Jika Anda tidak dapat menjatuhkan DB (atau jika Anda telah memulai kembali instance dan sql errorlog memperkirakan waktu pemulihan 24 jam), kemudian matikan layanan SQL, hapus file MDF dan LDF dari disk, mulai SQL, drop database (hantu), dan pulihkan dari cadangan.
Jelas Anda hanya akan mencoba jika ini adalah database pemrosesan back-end yang tidak berinteraksi dengan pengguna.