Tek kullanıcı modundan çıkma


208

Şu anda, veritabanım Tek Kullanıcı modunda. Veritabanını genişletmeye çalıştığımda bir hata alıyorum:

'My_db' veritabanına erişilemiyor. (ObjectExplorer)

Ayrıca, veritabanını silmeye çalıştığımda hatayı alıyorum:

Durum veya 'my_db' veritabanı seçeneklerinde değişiklik şu anda yapılamıyor. Veritabanı tek kullanıcı modunda ve şu anda bir kullanıcı ona bağlı.

Tek kullanıcı modundan nasıl çıkarım? Bu veritabanını kullanan herhangi bir kullanıcım yok.

Sitemi IIS ile taramaya çalıştığımda, aldığım hata:

Geçerli web isteğinin yürütülmesi sırasında işlenmeyen bir özel durum oluşturuldu. Kural dışı durumun kaynağı ve yeri ile ilgili bilgiler aşağıdaki kural dışı durum yığını izlemesi kullanılarak tanımlanabilir.

Tek kullanıcılı mod buna neden oluyormuş gibi hissediyorum.

Yanıtlar:


381

SSMS genel olarak perde arkasındaki veritabanına birkaç bağlantı kullanır.

Erişim modunu değiştirmeden önce bu bağlantıları öldürmeniz gerekir.

İlk olarak, nesne gezgininin master gibi bir sistem veritabanına yönlendirildiğinden emin olun.

İkinci olarak, bir sp_who2 yürütün ve 'my_db' veritabanına tüm bağlantıları bulun. KILL { session id }Oturum kimliğinin SPIDlistelendiği yeri yaparak tüm bağlantıları öldürün sp_who2.

Üçüncü olarak, yeni bir sorgu penceresi açın.

Aşağıdaki kodu yürütün.

-- Start in master
USE MASTER;

-- Add users
ALTER DATABASE [my_db] SET MULTI_USER
GO

Benim Bkz blog makalesinde veritabanı dosyaları yönetmeye. Bu, dosyaları taşımak için yazılmıştır, ancak kullanıcı yönetimi aynıdır.


2
'Sp_who2' komutunu kullandığımda, 'my_db' dosyasına bağlı herhangi bir DBName görmedim, bu bağlantılardan hiçbirini öldürmedim. Komutları çalıştırdıktan sonra aynı hatayı alıyorum = [: 'Durum ya da' my_db 'veritabanı seçeneklerinde değişiklikler şu anda yapılamıyor. Veritabanı tek kullanıcı modunda ve şu anda bir kullanıcı ona bağlı. Msg 5069, Seviye 16, Durum 1, Satır 1 ALTER DATABASE deyimi başarısız oldu '
Liondancer

2
Master'da olduğunuzdan emin oldunuz mu, sp_who2, database = my_db ile herhangi bir satır göstermez ve nesne gezgini my_db üzerinde değildir.
CRAFTY DBA

1
SSMS'yi ayırmayı ve bağlantısını kesmeyi deneyin. Bu veritabanına bir şey bağlanmalıdır. Diğer seçenek, özel yönetici konsoluna (DAC) bağlanmaktır. Bu sizin bir sistem yöneticisi olduğunuzu varsayar. Sonra rahatsız edici örümcek öldürmek.
CRAFTY DBA

1
Ayrıca, usp_who2 betiğimi aşağı yükle ( craftydba.com/wp-content/uploads/2011/09/usp-who2.txt ). Onu çalıştır. Yardımcı programı msdb.dbo.usp_who2 içine yerleştirir. Sp_who2 sonuçlarını kullanıcı kimliğiniz altında tempdb içinde bir tabloya kaydeder, veritabanı adına göre filtreler. Bize daha fazla yardımcı olmak için hatanın resmini gönderin. İyi şanslar.
CRAFTY DBA

3
SPID'yi bulun, aşağıdakileri kullanın: 100'ü öldürün. 100, oturumun (SPID) sayısıdır.
CRAFTY DBA

45

İlk KILLolarak, şu anda çalışmakta olan tüm işlemleri bulun .

Ardından, T-SQLveritabanını MULTI_USERmoda ayarlamak için aşağıdakileri çalıştırın .

USE master
GO
DECLARE @kill varchar(max) = '';
SELECT @kill = @kill + 'KILL ' + CONVERT(varchar(10), spid) + '; '
FROM master..sysprocesses 
WHERE spid > 50 AND dbid = DB_ID('<Your_DB_Name>')
EXEC(@kill);

GO
SET DEADLOCK_PRIORITY HIGH
ALTER DATABASE [<Your_DB_Name>] SET MULTI_USER WITH NO_WAIT
ALTER DATABASE [<Your_DB_Name>] SET MULTI_USER WITH ROLLBACK IMMEDIATE
GO

Ben sorgu master..sysprocesses, birkaç satır görünmesini, ama sonra satırlar verilen veritabanı tek kullanıcı modunda vs. olduğuna dair bir hata mesajı ile değiştirilecek olursa Bu çözüm SQL Server 2016 tarihinde benim için işe yaramaz
youcantryreachingme

@ youcantryreachingme, lütfen SQL Server 2016'da aldığınız hata mesajını sağlayın, böylece ben / başka biri çözmenize yardımcı olabilir.
Sathish

OP ile aynı: 'my_db' veritabanının durumunda veya seçeneklerinde değişiklik şu anda yapılamıyor. Veritabanı tek kullanıcı modunda ve şu anda bir kullanıcı ona bağlı.
youcantryreachingme

25

Tek Kullanıcı modundan çıkmak için şunu deneyin:

ALTER DATABASE [my_db] SET MULTI_USER

Tek Kullanıcı moduna geri dönmek için şunları kullanabilirsiniz:

ALTER DATABASE [my_db] SET SINGLE_USER


1
Şu hatayı alıyorum: 'Durum veya veritabanı seçeneklerinde değişiklikler' my_db 'şu anda yapılamıyor. Veritabanı tek kullanıcı modunda ve şu anda bir kullanıcı ona bağlı. Msg 5069, Seviye 16, Durum 1, Satır 1 ALTER DATABASE deyimi başarısız oldu. '
Liondancer

1
Veritabanını durdurabilir ve yeniden başlatabilir misiniz (açıkçası bu, diğer kullanıcıları etkileyecek bir üretim sistemi değilse) ve ardından komutu yeniden deneyebilir misiniz? @CRAFTYDBA'nın belirttiği gibi, komutun ana veritabanından yürütülmesi gerekir.
rsbarro

1
'Sistem Veritabanları'nı genişlettik ve' master'ı sağ tıklayıp 'Yeni Sorgu'yu seçtim ve hem sizin hem de @ CRAFTYDBA'nın platformlarında denedim. Aynı hata = [
Liondancer

1
Varolan bağlantıyı öldürmek için veritabanını durdurmayı ve yeniden başlatmayı denediniz mi? Burada ayrıca bir veritabanına bağlantıları öldürmek için daha fazla yol
arayabilirsiniz

2
Sol bölmedeki sunucuya sağ tıklayın ve 'Bağlantıyı Kes'e tıklayın. Veritabanınızda yalnızca bir SSMS sekmesi açık olduğundan emin olun (sağ tıklayın ve 'Diğer bağlantıların bağlantısını kes'i seçin) ve ardından ifadeyi yürütün. Her sekme ve nesne gezgini bir bağlantıdır; veritabanına yalnızca bir bağlantınız olabilir (bu nedenle, 'tek kullanıcılı mod'). Tek kullanıcı 'tek bağlantı' olmalıdır :) İyi şanslar
tommy_o

20
  1. Veritabanları bölümünde veritabanınızı sağ tıklayın
  2. "Özellikler" i seçin
  3. "Seçenekler" sayfasını seçin
  4. "Diğer seçenekler" in aşağı kaydırın ve "Erişimi kısıtla" alanını değiştirin

sql server seçenekler sayfasının ekran görüntüsü


1
Bu çözüm, SQL Server 2016'da benim için çalışmaz. Özelliklere erişmeye çalışmak, veritabanının tek kullanıcı modunda ve zaten bağlı bir kullanıcı bulunduğunu gösterir.
youcantryreachingme


8

Aynı sorunu vardı ve öldürmek için session_id bu sorguyu kullanarak bulundu:

Select request_session_id From sys.dm_tran_locks Where resource_database_id=DB_ID('BI_DB_Rep');

Bu mükemmeldi. Sinir bozucu SPID bulundu ve DB çevrimiçi tekrar var. Çok teşekkürler!
Russell Speight

8

CTRL + 1 tuşlarına basın

veritabanınızı kilitleyen işlemi bulun. Db'niz için dbname sütununa bakın ve spid'i not edin. Şimdi bu ifadeyi yürütmelisiniz:

kill <your spid>
ALTER DATABASE <your db> SET MULTI_USER;

CTRL + 1 bilmediğim çok kullanışlı bir kısayoldur!
Tyler Forsythe

7

Aşağıdakiler benim için çalıştı:

USE [master]
SET DEADLOCK_PRIORITY HIGH
exec sp_dboption '[StuckDB]', 'single user', 'FALSE';
ALTER DATABASE [StuckDB] SET MULTI_USER WITH NO_WAIT
ALTER DATABASE [StuckDB] SET MULTI_USER WITH ROLLBACK IMMEDIATE

7

Başka bir seçenek:

  • veritabanını çevrimdışına al; SMSS'de, veritabanına sağ tıklayın ve Çevrimdışına Al'ı seçin, 'Tüm bağlantıları bırak' seçeneğini işaretleyin
  • Çalıştırmak ALTER DATABASE [Your_Db] SET MULTI_USER

Mine çevrimdışı yapmama izin vermedi, sadece tek kullanıcı modunda olduğunu ve bir kullanıcının bağlı olduğunu söylemeye devam etti! (evet, "tüm bağlantıları bırak" seçeneğini işaretledim). Bunun yerine veritabanının ayrılması sona erdi!
TabbyCool

Bağlı kullanıcı olmadığından bu seçeneği kullanmak zorunda kaldım ve KILL komutu sa bağlantısında çalışmaz.
Derek K

6

Birisi bu iş parçacığına takılırsa, burada TEK KULLANICI MODUNDA sıkışmış SQL Server için kurşun geçirmez bir çözüm var

- Öldürmeniz gereken bağlantının işlem kimliğini (spid) alın
- 'DBName'i DB'nin gerçek adıyla değiştirin

SELECT sd.[name], sp.spid, sp.login_time, sp.loginame 
FROM sysprocesses sp 
INNER JOIN sysdatabases sd on sp.dbid = sd.dbid  
WHERE sd.[name] = 'DBName'

Alternatif olarak, açık bağlantının “spid” ini almak için “sp_who” komutunu da kullanabilirsiniz:

- Veya bunun yerine bu SP'yi kullanın

exec sp_who

- Ardından aşağıdakileri yürütün ve [spid] ve [DBName] değerlerini doğru değerlerle değiştirin

KILL SpidToKillGoesHere
GO

SET DEADLOCK_PRIORITY HIGH
GO

ALTER DATABASE [DBName] SET MULTI_USER WITH ROLLBACK IMMEDIATE
GO

Ek bilgi için teşekkürler, büyük bir fark yarattı!
Daniel

5

Bunun kimseye yardım edip etmediğinden emin değilim, ama aynı sorunu yaşadım ve beni tutan süreci bulamadım. SSMS'yi kapattım ve yerel yönetim ortamına isabet eden tüm hizmetleri durdurdum. Sonra bir kez geri gittim ve exec sp_who2 çalıştırdı, bana suçlu gösterdi. Süreci öldürdüm ve Multi_User'ın çalışmasını sağladım, sonra hizmetleri yeniden başlattım. IIS'yi belirli paketleri ararken birkaç dakikada bir vurduk.


3

Bu sabah aynı meseleyle karşılaştım. Basit bir sorun olduğu ortaya çıktı. Nesne gezgininde tek kullanıcı veritabanına ayarlanmış bir sorgu penceresi açtım. Sp_who2 saklı yordamı sonra bağlantı göstermedi. Bir kez kapadım,


3

Daha da etkili olmak için Jespers cevabına eklemek :

SET DEADLOCK_PRIORITY 10;-- Be the top dog.

SET DEADLOCK_PRIORITY HIGHkullanan DEADLOCK_PRIORITY5.

Olan şey, diğer süreçlerin veritabanında bir çatlak elde etmesidir ve eğer işleminiz daha düşükse DEADLOCK_PRIORITY, yarışı kaybeder.

Bu, diğer cismin bulunmasını ve öldürülmesini engeller (birkaç kez yapılması gerekebilir).

ALTER DATABASEBirden fazla koşmanız gerekebilir (ancak Jesper bunu yapar). Değiştirilmiş kod:

USE [master]
SET DEADLOCK_PRIORITY HIGH
exec sp_dboption '[StuckDB]', 'single user', 'FALSE';
ALTER DATABASE [StuckDB] SET MULTI_USER WITH NO_WAIT
ALTER DATABASE [StuckDB] SET MULTI_USER WITH ROLLBACK IMMEDIATE

3

Bu Betiği Kullan

exec sp_who

Dbname ve spid sütununu bulun

şimdi yürüt

kill spid 
go
ALTER DATABASE [DBName]
SET MULTI_USER;

2

Bugün aynı sorunla karşı karşıya kaldım ve veritabanımın Çok Kullanıcılıdan Tek Kullanıcılı moduna geçtiği ve sonunda veritabanı yayınlamamın durduğu bir yerde karşılaştım.

Bu sorunu gidermek için, tüm Visual Studio örneklerini kapatmak ve Sql Server sorgu penceresinde aşağıdaki komutu çalıştırmak zorunda kaldım -

USE [Your_Database_Name]; ALTER DATABASE [Your_Database_Name] SET MULTI_USER GO

Bu komut DB'yi Tek Kullanıcıdan Çok Kullanıcıya değiştirdi ve daha sonra başarıyla yayınlayabildim.


1

Hatta aynı sorunla karşılaşıyorum, onu öldürmek için my_db'ye aktif bağlantılar bulamıyorum ama yine de aynı hatayı gösteriyor. Sunucudaki herhangi bir veritabanı için olası tüm SSMS bağlantılarının bağlantısını keserim, SSMS'den yeni bir bağlantı oluşturur ve bunu Çoklu kullanıcı olarak değiştiririm.

-- Actual Code to change my_db to multi user mode
USE MASTER;
GO
ALTER DATABASE [my_db] SET MULTI_USER

Not: Bu SQL Server 2005'te olası bir hata gibi görünüyor!


1

Bunu SQL 2012'de yeni deneyimledik. Özgün oturumu tek kullanıcı olarak ayarladığımızda bir çoğaltma işlemi atladı. Ancak sp_who2, DB'ye eklenen yeni işlemin gösterilmedi. SSMS'nin kapatılması ve yeniden açılması, bu işlemi veritabanında görmemize izin verdi ve sonra onu öldürebilir ve hemen çok kullanıcılı moda geçebiliriz ve bu işe yaradı.

Bunun arkasındaki mantığı çözemiyorum, ancak SSMS'de bir hata gibi görünüyor ve hala SQL 2012'de kendini gösteriyor.


0

usta kullan

GİT

d.name, d.dbid, spid, login_time, nt_domain, nt_username, sysprocesses p internal join sysdatabases d üzerinde p.dbid = d.dbid seçin; burada d.name = 'veritabanı adı'

568 öldür - örümcek öldür

ALTER DATABASE veritabanı adı '

SET MULTI_USER git

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.