Bir SQL Server veritabanını çevrimdışı duruma getirirken aşırı bekleme süresi


278

Benim dev veritabanı üzerinde bazı çevrimdışı bakım (canlı veritabanı geri dev veritabanı geri yükleme) gerçekleştirmek için çalışıyorum, ancak SQL Server Management Studio üzerinden 'Çevrimdışı Al' komutu son derece yavaş performans - 30 dakika artı şimdi. Ben hemen hemen bitmek üzereyim ve hız sorununa neyin neden olabileceği veya nasıl düzeltileceği ile ilgili herhangi bir referans bulamıyorum.

Bazı siteler veritabanına açık bağlantıların bu yavaşlamaya neden olduğunu öne sürdü, ancak bu veritabanını kullanan tek uygulama geliştiricimin IIS örneği ve hizmet durduruldu - artık açık bağlantı yok.

Bu yavaşlamaya ne sebep olabilir ve hızlandırmak için ne yapabilirim?

Yanıtlar:


408

Bazı ek aramalardan sonra (gbn'nin cevabından ve u07ch'in KMike'ın cevabından ilham alan yeni arama terimleri) 2 saniye içinde başarıyla tamamlanan bunu buldum:

ALTER DATABASE <dbname> SET OFFLINE WITH ROLLBACK IMMEDIATE

(Güncelleme)

Bu yine de aşağıdaki hatayla başarısız olduğunda, bu blog gönderisinden esinlenerek düzeltebilirsiniz :

'Dbname' veritabanına kilit eklenemediğinden ALTER DATABASE başarısız oldu. Daha sonra tekrar deneyin.

veritabanınızda kimin kilitli olduğunu öğrenmek için aşağıdaki komutu çalıştırabilirsiniz:

EXEC sp_who2

Ve SPIDaşağıdaki komutta bulduklarınızı kullanın:

KILL <SPID>

Ardından ALTER DATABASEkomutu tekrar çalıştırın . Şimdi çalışmalı.


35
Bu işe yaramazsa (bir kilit yerleştirilemedi), çözümü stackoverflow.com/questions/4673065 adresinden de deneyin .
nalply

3
DB Çevrimdışı Al işlemi hala çalışıyorsa, dev makineleri için Görev Yöneticisi'nden öldürebilir ve yukarıdaki komutu çalıştırabilirsiniz.
Null Head

1
KILL komutunu çalıştırır ve "Kendi işleminizi öldürmek için KILL kullanılamaz."
Jarrod

129

Büyük olasılıkla bir yerden DB'ye bağlantı vardır (nadir bir örnek: eşzamansız istatistik güncellemesi )

Bağlantıları bulmak için sys.sysprocesses kullanın

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

Bağlantı kopmalarını zorlamak için GERİ DÖN

USE master
ALTER DATABASE MyDB SET SINGLE_USER WITH ROLLBACK IMMEDIATE

7
+1 çünkü işlem sorgusu bu veritabanına neyin bağlı olduğunu size bildirir. benim durumumda SSMS açık bir haydut çalışan oldu :)
MikeMurko

3
Benim durumumda bir sorgu analizörü penceresi açık olan
haydutum

1
Benim durumumda geliştiriciler, bir veri tabanına çok iyi bilinen banka işaret için bir üretim ana web sitesi ESKİ lebelled vardı
ZZ 9

3
ALTER DATABASE failed because a lock could not be placed on databaseKomutun KILL <SPID>yardımcı olacağını söylüyorsa
Muflix

28

Bu DB'ye bağlı açık SQL Server Management Studio pencereleriniz var mı?

Tek kullanıcı moduna getirin ve tekrar deneyin.


2
ALTER DATABASE <DBNAME>
SINGLE_USER

KMike - sahip olduğum tek bağlantı Çevrimdışı olmaya çalıştığım veritabanına değil, Ana veritabanına açık.
Erik Forbes

17

Benim durumumda, bitirmek için çok bekledikten sonra sabır ve sadece kapalı yönetim stüdyosu vardı. Çıkmadan önce başarı mesajını gösterdi, db çevrimdışı. Dosyalar yeniden adlandırılabilir.


7

saklı yordamı yürütmek sp_who2

Bu herhangi bir engelleme kilitleri olup olmadığını görmek için izin verecektir .. öldürmek onların düzeltmek gerekir.


5

SSMS'de: SQL Server simgesine, Activity Monitor'a sağ tıklayın. Açık İşlemler. Bağlı işlenenleri bulun. İşlemi sağ tıklayın, Kill.


4

bu tür bir şeyle karşılaştığınızda her zaman işlem günlüğünüzü düşünmelisiniz. Alback db deyimi hemen geri dönmeli ve durum böyle olur. Şuna bir göz atın: http://msdn.microsoft.com/en-us/library/ms189085.aspx

Kontrol noktalarında kemik vb. Günlüğünüzdeki işlemlerin kaydedilmeye değer olup olmadığına karar vermeniz ve ardından db'nizi buna göre çalıştırmak için modu seçmeniz gerekir. Gerçekten beklemeniz için bir neden yok, aynı zamanda veri kaybetmeniz için de hiçbir neden yok - her ikisine de sahip olabilirsiniz.


2
Adaçayı tavsiyesi - teşekkür ederim - ancak bu durumda veriler geri yüklenmekte olan bir geliştirme veritabanı olduğu için harcanabilir.
Erik Forbes

3

İsteğin yapıldığı SSMS (SQL Service Manager) örneğinin kapatılması sorunu benim için çözdü .....


3

Benim durumumda bu eylemi yürütmeden önce DB bazı tablolara bakmıştı. Kullanıcı hesabım SSMS'de bu DB ile etkin bir bağlantıya sahipti. SSMS'de sunucu bağlantısını kestikten sonra ('Veritabanını çevrimdışına al' iletişim kutusunu açık bırakarak) işlem başarılı oldu.


Benimle aynı. Daha sonra yeniden
bağlandım

2

Bu sorunu çözmek için, IIS'de db'ye bağlı olan web sitesini durdurdum ve hemen 'dondurulmuş' 'db'yi çevrimdışı al' paneli donmuş hale geldi.


2

Aşağıdaki tüm önerileri denedim ve hiçbir şey işe yaramadı.

  1. EXEC Instagram Hesabındaki Resim ve Videoları sp_who
  2. <SPID> öldür

  3. ALTER DATABASE SET SINGLE_USER GERİ DÖNÜYOR

    ALTER VERİTABANI ÇEVRİMİÇİ GERİ DÖNÜŞ İLE ÇEVRİMDIŞI

    Sonuç: Yukarıdaki komutların her ikisi de sıkışmıştı.

4. Veritabanını sağ tıklatın -> Özellikler -> Seçenekler Veritabanını Salt Okunur Olarak Ayarla iletişim kutusundaki 'Evet'i tıklatın SQL Server, veritabanına yapılan tüm bağlantıları kapatır.

Sonuç: Pencere yürütülürken takıldı.

Son çare olarak, SQL Server hizmetini yapılandırma yöneticisinden yeniden başlattım ve ALTER DATABASE SET ÇEVRİMDIŞI GERİ GERİ DÖNÜŞ İLE çalıştırdım. Bir cazibe gibi çalıştı


1

Ayrıca, söz konusu veritabanına bağlı açık olabilecek sorgu pencerelerini kapatın;)


1

SSMS'de, veritabanını salt okunur ve sonra geri olarak ayarlayın. Kilitler serbest kalan bağlantılar kapatılacaktır.

Benim durumumda, veritabanına açık bağlantıları olan bir web sitesi vardı. Bu yöntem yeterince kolaydı:

  1. Veritabanını sağ tıklayın -> Özellikler -> Seçenekler
  2. Database Read-OnlyDoğru olarak ayarla
  3. SQL Server veritabanına tüm bağlantıları kapatacak uyarısında 'Evet'i tıklatın.
  4. Seçenekleri yeniden açın ve salt okunur geri kapatın
  5. Şimdi veritabanını yeniden adlandırmayı veya çevrimdışı yapmayı deneyin.

0

Benim için İş Etkinliği İzleyicisi'ne gitmem ve işleyen iki şeyi durdurmam gerekiyordu. Sonra hemen çevrimdışı oldu. Benim durumumda olsa da, bu 2 sürecin ne olduğunu ve onları durdurmanın iyi olduğunu biliyordum.


0

Benim durumumda, veritabanı eski bir Sharepoint yüklemesi ile ilgiliydi. Sunucu yöneticisinde ilgili hizmetlerin durdurulması ve devre dışı bırakılması, 40 dakika boyunca süren çevrimdışı işlemi gerçekleştir "eylemini kaldır" ve hemen tamamlandı.

Şu anda veritabanını kullanan herhangi bir hizmetin olup olmadığını kontrol etmek isteyebilirsiniz.


1
sp_who2Hangi işlemlerin veritabanını kullandığını görmek için çalıştırın ve kill <PID>durdurmak için kullanın .
Eric Kigathi

0

Bir dahaki sefere Çevrimdışına Al iletişim kutusundan 'Tüm Etkin Bağlantıları Bırak' onay kutusunu işaretlemeyi unutmayın. Ayrıca bağlantısız yerel makinede SQL_EXPRESS'deydim, ancak bu onay kutusunu işaretlemezsem bu yavaşlama benim için oldu.


-1

Benim durumumda Tomcat sunucusunu durdurdum. hemen DB derhal çevrimdışı oldu.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.