Kami menjalankan kueri penghapusan pada basis data dengan baris 1,8 miliar. Penghapusan ini akan menghapus baris 1,2 miliar.
Jika dipikir-pikir, kami akan memecah kueri ini menjadi 100 m pada satu waktu tetapi kami berada dalam posisi di mana ia telah berjalan selama 24 jam dan file log pada 2TB yang tampaknya merupakan ukuran maksimum yang diizinkan untuk file log.
Basis data dalam mode pemulihan SEDERHANA.
Apakah ada yang menyimpan kueri ini? Atau apakah kita perlu me-restart SQL Server dan melihat apa yang terjadi? Apakah basis data tidak dapat digunakan? Adakah yang bisa kita lakukan untuk membunuh ini sebersih mungkin?
sql-server
sql-server-2008-r2
delete
Graeme
sumber
sumber
Jawaban:
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
atausp_WhoIsActive
untuk menemukan spid, lalu lakukankill 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
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.
sumber
JANGAN RESTART SQL SERVER. Ini hanya akan memperpanjang penderitaan Anda karena pemulihan akan terjadi, yang akan mengembalikan atau mengulangi transaksi yang tidak selesai, termasuk penghapusan Anda.
Membunuh sesi yang menjalankan penghapusan akan menghasilkan rollback yang terjadi, yang juga membutuhkan waktu lama untuk diselesaikan.
Anda ingin melihat kueri berikut untuk melihat keadaan operasi:
The
percent_complete
kolom, dan orang-orang yang bergantung pada itu, sepertiestimated_completion_time
, hanya dihuni untuk operasi berikut:Jadi, Anda hanya akan melihat kolom itu bermakna jika Anda sudah membatalkan pernyataan penghapusan, dan itu bergulir kembali, atau jika Anda sudah memulai ulang SQL Server dan sedang dalam pemulihan.
Jika
blocking_session_id
kolom berisi angka, itu menunjukkan bahwa sesi lain memblokir operasi penghapusan. Jika sesi itu telah memblokir operasi penghapusan sejak dimulai, Anda mungkin dapat membatalkan operasi tanpa perlu mengembalikan.sumber