Waktu tunggu ekstrem saat mengambil pangkalan data SQL Server offline

278

Saya mencoba melakukan pemeliharaan offline (pemulihan database dev dari cadangan langsung) pada database dev saya, tetapi perintah 'Ambil Offline' melalui SQL Server Management Studio berkinerja sangat lambat - pada urutan 30 menit plus sekarang. Saya hampir kehabisan akal dan sepertinya saya tidak dapat menemukan referensi online apa yang mungkin menyebabkan masalah kecepatan, atau bagaimana cara memperbaikinya.

Beberapa situs telah menyarankan bahwa koneksi terbuka ke database menyebabkan perlambatan ini, tetapi satu-satunya aplikasi yang menggunakan database ini adalah contoh IIS mesin dev saya, dan layanan dihentikan - tidak ada lagi koneksi terbuka.

Apa yang bisa menyebabkan perlambatan ini, dan apa yang bisa saya lakukan untuk mempercepatnya?

Erik Forbes
sumber

Jawaban:

408

Setelah beberapa pencarian tambahan (istilah pencarian baru yang terinspirasi oleh jawaban gbn dan komentar u07ch pada jawaban KMike) saya menemukan ini, yang berhasil diselesaikan dalam 2 detik:

ALTER DATABASE <dbname> SET OFFLINE WITH ROLLBACK IMMEDIATE

(Memperbarui)

Ketika ini masih gagal dengan kesalahan berikut, Anda dapat memperbaikinya karena terinspirasi oleh posting blog ini :

ALTER DATABASE gagal karena kunci tidak dapat ditempatkan pada database 'dbname' Coba lagi nanti.

Anda dapat menjalankan perintah berikut untuk mencari tahu siapa yang menjaga kunci di basis data Anda:

EXEC sp_who2

Dan gunakan apa pun yang SPIDAnda temukan dalam perintah berikut:

KILL <SPID>

Kemudian jalankan ALTER DATABASEperintah lagi. Sekarang seharusnya berfungsi.

Erik Forbes
sumber
35
Jika ini tidak berfungsi (kunci tidak dapat ditempatkan), coba juga solusi di stackoverflow.com/questions/4673065 .
nalply
3
Jika proses Take Offline Offline masih berjalan, untuk mesin dev Anda dapat membunuhnya dari Task Manager dan menjalankan perintah di atas.
Null Head
1
Jika Anda menjalankan perintah KILL dan mendapatkan pesan "Tidak dapat menggunakan KILL untuk membunuh proses Anda sendiri.", Pastikan Anda menggunakan database master untuk menjalankan perintah
Jarrod
129

Kemungkinan besar ada koneksi ke DB dari suatu tempat (contoh langka: pembaruan statistik asinkron )

Untuk menemukan koneksi, gunakan proses sys.sys

USE master
SELECT * FROM sys.sysprocesses WHERE dbid = DB_ID('MyDB')

Untuk memaksa pemutusan, gunakan ROLLBACK SEGERA

USE master
ALTER DATABASE MyDB SET SINGLE_USER WITH ROLLBACK IMMEDIATE
gbn
sumber
7
+1 karena kueri proses memberi tahu Anda apa yang terhubung ke database ini. dalam kasus saya itu adalah karyawan nakal dengan SSMS terbuka :)
MikeMurko
3
Dalam kasus saya, saya adalah bajingan dengan jendela penganalisis permintaan terbuka
dellyjm
1
Dalam kasus saya, para pengembang memiliki situs web utama produksi untuk bank yang sangat terkenal yang menunjuk pada sebuah database yang ditingkatkan OLD
ZZ9
3
Jika dikatakan ALTER DATABASE failed because a lock could not be placed on databaseperintah KILL <SPID>akan membantu
Muflix
28

Apakah Anda memiliki jendela SQL Server Management Studio terbuka yang terhubung ke DB ini?

Masukkan ke dalam mode pengguna tunggal, lalu coba lagi.

KM.
sumber
2
ALTER DATABASE <DBNAME> SET SINGLE_USER DENGAN Rollback Segera
u07ch
KMike - satu-satunya koneksi yang saya miliki terbuka ke database Master, bukan database yang saya coba untuk offline.
Erik Forbes
17

Dalam kasus saya, setelah menunggu begitu banyak sampai selesai saya tidak punya kesabaran dan hanya menutup studio manajemen. Sebelum keluar, itu menunjukkan pesan sukses, db sedang offline. File-file itu tersedia untuk diganti nama.

Rudy
sumber
7

jalankan prosedur tersimpan sp_who2

Ini akan memungkinkan Anda untuk melihat apakah ada kunci pemblokiran .. bunuh mereka harus memperbaikinya.

woodwa
sumber
5

Di SSMS: klik kanan pada ikon SQL server, Activity Monitor. Proses Terbuka. Temukan yang diproses terhubung. Klik kanan pada prosesnya, Kill.

nzeemin
sumber
4

kapan saja Anda mengalami hal semacam ini Anda harus selalu memikirkan log transaksi Anda. Statemen db alter dengan rollback langsung menunjukkan ini menjadi kasusnya. Lihat ini: http://msdn.microsoft.com/en-us/library/ms189085.aspx

Tulanglah pada pos pemeriksaan, dll. Anda perlu memutuskan apakah transaksi dalam log Anda layak disimpan atau tidak dan kemudian pilih mode untuk menjalankan db Anda sesuai. Tidak ada alasan bagi Anda untuk harus menunggu tetapi juga tidak ada alasan bagi Anda untuk kehilangan data - Anda dapat memiliki keduanya.

Belum ada yang lain
sumber
2
Nasihat bijak - terima kasih - tetapi dalam hal ini data dapat dihabiskan karena ini adalah database pengembangan yang sedang dipulihkan.
Erik Forbes
3

Menutup contoh SSMS (SQL Service Manager) dari mana permintaan dibuat memecahkan masalah bagi saya .....

Armand G.
sumber
3

Dalam kasus saya, saya telah melihat beberapa tabel dalam DB sebelum melakukan tindakan ini. Akun pengguna saya memegang koneksi aktif ke DB ini di SSMS. Setelah saya terputus dari server di SSMS (membiarkan kotak dialog 'Take database offline' terbuka) operasi berhasil.

Mie ramen
sumber
Sama denganku. Kemudian saya menghubungkan kembali, mengubah database aktif untuk menguasai dan menjalankan perintah berikut: ALTER DATABASE XXX SET OFFLINE DENGAN ROLLBACK SEGERA
cskwg
2

Untuk menyiasatinya, saya menghentikan situs web yang terhubung ke db di IIS dan segera panel 'beku' 'take db offline' menjadi tidak beku.

Dan
sumber
2

Saya mencoba semua saran di bawah ini dan tidak ada yang berhasil.

  1. EXEC sp_who
  2. Bunuh <SPID>

  3. ALTER DATABASE SET SINGLE_USER DENGAN Rollback Segera

    ALTER DATABASE SET OFFLINE DENGAN ROLLBACK SEGERA

    Hasil: Kedua perintah di atas juga macet.

4. Klik kanan database -> Properties -> Options Set Database Read-Only ke True Klik 'Yes' pada dialog peringatan SQL Server akan menutup semua koneksi ke database.

Hasil: Jendela macet saat dieksekusi.

Sebagai upaya terakhir, saya me-restart layanan SQL server dari manajer konfigurasi dan kemudian menjalankan ALTER DATABASE SET OFFLINE DENGAN ROLLBACK SEGERA. Itu bekerja seperti pesona

Viraj A
sumber
1

Juga, tutup semua jendela kueri yang mungkin Anda buka yang terhubung ke database yang dimaksud;)

Steve Woods
sumber
1

Di SSMS, atur database menjadi hanya-baca lalu kembali. Koneksi akan ditutup, yang membebaskan kunci.

Dalam kasus saya ada situs web yang memiliki koneksi terbuka ke database. Metode ini cukup mudah:

  1. Klik kanan database -> Properties -> Options
  2. Setel Database Read-Onlyke True
  3. Klik 'Ya' pada peringatan dialog SQL Server akan menutup semua koneksi ke database.
  4. Buka kembali Opsi dan matikan read-only back
  5. Sekarang cobalah mengubah nama database atau menjadikannya offline.
zacharydl
sumber
0

Bagi saya, saya hanya harus masuk ke Monitor Aktivitas Kerja dan menghentikan dua hal yang sedang diproses. Kemudian langsung offline. Dalam kasus saya, saya tahu apa 2 proses itu dan tidak masalah untuk menghentikannya.

craig
sumber
0

Dalam kasus saya, database terkait dengan instalasi Sharepoint lama. Menghentikan dan menonaktifkan layanan terkait di manajer server "unhung" mengambil tindakan offline, yang telah berjalan selama 40 menit, dan itu selesai segera.

Anda mungkin ingin memeriksa apakah ada layanan yang saat ini menggunakan database.

Jonathan
sumber
1
Jalankan sp_who2untuk melihat proses apa yang menggunakan database dan gunakan kill <PID>untuk menghentikannya.
Eric Kigathi
0

Lain kali, dari dialog Take Offline, ingatlah untuk mencentang kotak centang 'Jatuhkan Semua Koneksi Aktif'. Saya juga menggunakan SQL_EXPRESS di mesin lokal tanpa koneksi, tetapi perlambatan ini terjadi pada saya kecuali saya memeriksa kotak centang itu.

Brett Drake
sumber
-1

Dalam kasus saya, saya menghentikan server Tomcat. lalu segera DB menjadi offline.

Java Main
sumber