Terjebak tugas di studio manajemen, bagaimana Anda menanganinya?

12

Setelah mengklik "Ambil basis data offline" di studio manajemen, pesan ini tetap hang dan tidak akan ditutup jika Anda mengklik tutup.

https://i.imgur.com/KD6AROv.png

Apa cara yang baik untuk menangani pekerjaan macet seperti ini di studio manajemen? Bisakah Anda membunuh mereka melalui monitor aktivitas? Haruskah saya mencari proses apa yang menghentikan pekerjaan ini agar tidak lewat dan menghentikannya?

A_V
sumber
4
Cari tahu apa yang menghalangi itu, pertama. Anda dapat memperoleh informasi ini dari sys.dm_exec_requests. Juga pekerjaan Anda dapat melakukan ini dengan cara itu tidak diblokir, misalnya dengan menerbitkan ALTER DATABASE foo SET SINGLE_USER WITH ROLLBACK IMMEDIATE;pertama ... kalau tidak, hanya duduk dan menunggu, dan untuk database yang sibuk, itu bisa selamanya.
Aaron Bertrand
Pengaturan database di single_user menyelesaikan masalah, saya seharusnya sudah menebak ... SQLserver selalu membutuhkan single_user untuk hal semacam ini.
A_V

Jawaban:

12

Saya akan mengatakan jangan pernah menggunakan hal "Ambil Offline" di GUI kecuali Anda tahu fakta bahwa database tidak digunakan. Apa saja. Itu sulit diketahui tanpa melakukan kerja keras, jadi mengapa tidak menyimpan skrip ini di suatu tempat dan selalu menggunakan ini?

USE [master];
GO
ALTER DATABASE $dbname$ SET SINGLE_USER WITH ROLLBACK IMMEDIATE;
GO
ALTER DATABASE $dbname$ SET OFFLINE;

Dan kemudian kebalikannya tentu saja:

ALTER DATABASE $dbname$ SET ONLINE;
GO
ALTER DATABASE $dbname$ SET MULTI_USER;

Alasan Anda perlu mengaturnya SINGLE_USERterlebih dahulu adalah untuk menendang keluar setiap pengguna yang ada (ada opsi untuk melakukannya pada dialog lepaskan, tetapi tidak mengambil dialog luring), karena SQL Server memerlukan akses eksklusif ke database untuk mengambil itu offline. Sekarang, Anda mungkin ingin melakukan kerja keras tambahan untuk melihat siapa yang saat ini menggunakan database, seolah-olah Anda melakukan ini di tengah operasi cadangan besar atau pekerjaan ETL atau apa pun, yang mungkin bermasalah.

EDIT : Saya telah mengajukan saran tentang Connect tentang ini (lihat Hubungkan # 2687832 ) dan juga telah mempostingnya ke Trello (diajukan di bawah "Object Explorer").

Aaron Bertrand
sumber
Dan bagaimana jika menetapkan satu pengguna juga gagal karena tidak dapat memperoleh kunci pada basis data?
StackOverthrow
@ user560822 Anda harus menunggu sampai Anda bisa mendapatkan kunci pada basis data. Jika itu berarti Anda harus memulai sesi pembunuhan ...
Aaron Bertrand
7

Ketika Anda sudah dalam situasi menggantung, jangan lupa Anda dapat mencari koneksi terbuka di server

sp_who2  

di database lain, seperti master.
Memindai hasil untuk setiap tempat di mana database adalah yang Anda coba luring.
Perhatikan nilai kolom spid (proses id) dari baris tersebut.

Satu per satu, jalankan

kill  ##

di mana "##" adalah spid.

Tentu berhati-hati untuk memastikan bahwa proses-proses itu tidak penting untuk tetap berjalan ... mereka akan dihentikan tanpa bahkan menyelesaikan perintah terbaru dan tanpa peringatan.

Mike M
sumber
1
Jawaban yang diterima tidak membantu saya. Gagal pada perintah pertama. Jawaban ini berfungsi dengan baik. Terima kasih
Cheburek
itu bagus :) Ya, jawaban yang diterima benar-benar untuk menghindari masalah ... jika Anda sudah digantung, Anda perlu sesuatu seperti ini untuk membunuhnya
Mike M