SINGLE USER modundan veritabanını MULTI USER olarak ayarla


189

SINGLE_USERModuna geri yüklenen bir veritabanı ayarlama konusunda yardıma ihtiyacım var MULTI_USER. Her koştuğumda

ALTER DATABASE BARDABARD
SET MULTI_USER;
GO

Bu hatayı alıyorum:

Durumda veya 'BARDABARD' 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ı.

Bu olmayan olması gerekir SINGLE_USERbaşka bir moda ayarlamak için mod, ama öyle ise herhangi başka bir modda veritabanı ayarlayamıyor SINGLE_USERmodu.

Yanıtlar:


114

“Kullanıcı şu anda ona bağlı” SQL Server Management Studio penceresinin kendisi olabilir. Ana veritabanını seçmeyi ve ALTERsorguyu yeniden çalıştırmayı deneyin .


1
Buna ekleme: Sorgu penceresi etkinken Kullanılabilir Veritabanları araç çubuğu açılır menüsünde başka bir veritabanı (örneğin master) seçilse bile veritabanına bir sorgu penceresinin eklenebileceği görülmektedir . Size baş ağrısı veriyorsa, diğer tüm sorgu pencerelerini kapatın ve bıraktığınız bir pencerede açılır menüde veya açılır menüde masum sistem veritabanını seçin . mastertempdb
17'de CVn

DB bağlantısını kesmeyi ve microsoft SQL sunucu yönetimi stüdyosunda tekrar bağlanmayı deneyin. Ardından komutu tekrar çalıştırın.
Isuru Madusanka

İlk yorum çok faydalıdır ve cevaba aslında eklenebilir. Diğer tüm sorguları kapatmadan önce sorguyu çalıştıramadım.
user2216

88

Bu hata iletisi genellikle DB'ye bağlı başka işlemler olduğu anlamına gelir. Hangilerinin bağlı olduğunu görmek için bunu çalıştırmayı deneyin:

exec sp_who

Bu size süreci geri döndürür ve daha sonra çalıştırabilmeniz gerekir:

kill [XXX]

Burada [xxx] spidöldürmeye çalıştığınız işlemdir.

Sonra yukarıdaki ifadenizi çalıştırabilirsiniz.

İyi şanslar.


kill [xxx] işlemden kurtulur, ancak komutumu çalıştırmayı denediğimde geri gelir!
19'da colmde

74

Değişikliğinizi hemen geri alma seçeneğini ekleyebilirsiniz.

ALTER DATABASE BARDABARD
SET MULTI_USER
WITH ROLLBACK IMMEDIATE
GO

1
ROLLBACK IMMEDIATETam olarak ne yapar ?
dakab

3
@dakab Bekleyen tüm işlemleri, işlemlerin geri dönmeye zorlamadan önce bitmesini bekleyen ya da beklemede olan hiçbir işlem kalmayana kadar süresiz olarak beklemenin ALTER DATABASEaksine , ifadenin işleminin başlangıcından hemen sonra geri dönmeye WITH ROLLBACK X SECONDSzorlar (varsayılan olduğunu düşünüyorum ancak şu anda dokümanda bulamıyorum). "Şu anda yaptığınız her şeyi durdurun ve bunu yapın" ile eşdeğerdir.
Bacon Bits

39

SQL Server 2012:

üzerine sağ tıklayın DB > Properties > Options > [Scroll down] State > RestrictAccess > select Multi_userve Tamam'a tıklayın.

İşte bu kadar!


5
Aslında değil, çözümünüzü denediğimde aldım: / "Veritabanı 'XXX' zaten açık ve aynı anda yalnızca bir kullanıcıya sahip olabilir. (Microsoft SQL Server, Hata: 924)"
Krzysztof Wolny

1
Ek olarak SQL 2008R2'de doğrulanmıştır.
codo-sapien

En iyi cevap, KILL ifadesini kullanma izniniz olmadığı durumlarda bile çalışmak
Marco Marsala


13

Bu benim için iyi çalıştı.

Adım 1. Veritabanı motoruna sağ tıklayın, aktivite izleyicisine tıklayın ve hangi işlemin bağlantıya sahip olduğunu görün. Söz konusu kullanıcıyı öldürün ve sorguyu hemen yürütün.

Adım 2.

USE [master];
GO
ALTER DATABASE [YourDatabaseNameHere] SET MULTI_USER WITH NO_WAIT;
GO  

ve veritabanını yenileyin.


9

Aslında benim db işlemlerim ve onlarla bir yarış durumu tarafından kilitli olduğu bir sorun vardı, bir komut yenilenmiş ve yenilenen onlar tekrar kilitlendiğinde ... Aşağıdaki komutları arka arkaya çalıştırmak zorunda kaldı SSMS'de ve beni çevrimdışına aldım ve oradan geri yüklememi yaptım ve tekrar çevrimiçi oldum, iki sorgu:

İlk koşulan:

USE master
GO

DECLARE @kill varchar(8000) = '';
SELECT @kill = @kill + 'kill ' + CONVERT(varchar(5), spid) + ';'
FROM master..sysprocesses 
WHERE dbid = db_id('<yourDbName>')

EXEC(@kill);

Sonra hemen sonra (ikinci sorgu penceresinde):

USE master ALTER DATABASE <yourDbName> SET OFFLINE WITH ROLLBACK IMMEDIATE

İhtiyacım olan şeyi yaptım ve tekrar çevrimiçi hale getirdim. Sorunumu birleştirip çözmem için bu parçaları yazan herkese teşekkürler.


7

SQL Management Studio kullanmak yerine doğrudan sunucuda oturum açmak en iyisi olabilir

Giriş yaptığınız hesabın, MULTI_USER olarak ayarlamak istediğiniz veritabanı için dbowner olduğundan emin olun. Mümkünse sa (SQL sunucu kimlik doğrulamasını kullanarak) olarak oturum açın

Veritabanınız IIS tarafından kullanılıyorsa, web sitesini ve onu kullanan uygulama havuzunu durdurun; bu, bağlı olan ve MULTI_USER olarak ayarlamanıza engel olan işlem olabilir

USE MASTER
GO

-- see if any process are using *your* database specifically

SELECT * from master.sys.sysprocesses
WHERE spid > 50 -- process spids < 50 are reserved by SQL - we're not interested in these
AND dbid=DB_ID ('YourDbNameHere')

-- if so, kill the process:

KILL n -- where 'n' is the 'spid' of the connected process as identified using query above

-- setting database to read only isn't generally necessary, but may help:

ALTER DATABASE YourDbNameHere
SET READ_ONLY;
GO

-- should work now:

ALTER DATABASE Appswiz SET MULTI_USER WITH ROLLBACK IMMEDIATE

Hâlâ sorun yaşıyorsanız buraya bakın:

http://www.sqlservercentral.com/blogs/pearlknows/2014/04/07/help-im-stuck-in-single-user-mode-and-can-t-get-out/

SON BİR ALTERNATİF OLARAK - Yukarıdaki her şeyi denediyseniz ve çaresiz kalıyorsanız, SQL sunucu örneğini durdurmayı ve yeniden başlatmayı deneyebilirsiniz


5

Sadece aşağıdaki adımları kullanarak sabitledim, size yardımcı olabilir.

Aşama 1

tek kullanıcı veritabanına sağ tıklayın


Adım 2

çevrimdışı ol


Aşama 3

Bağlantıyı kesin ve çevrimdışına alın


Adım: 4

Çevrimiçi olun


Adım 5

Sonra aşağıdaki sorguyu çalıştırın.

ALTER DATABASE YourDBName
SET MULTI_USER
WITH ROLLBACK IMMEDIATE
GO

Zevk almak...!


2

singleuserMod değiştirmek için kullanılan belirli SPID bilmiyordum aşağıdaki kod benim için çalıştı .

use master
GO

select 
    d.name, 
    d.dbid, 
    spid, 
    login_time, 
    nt_domain, 
    nt_username, 
    loginame
from sysprocesses p 
    inner join sysdatabases d 
        on p.dbid = d.dbid
where d.name = 'dbname'
GO

kill 52 -- kill the number in spid field
GO

exec sp_dboption 'dbname', 'single user', 'FALSE'
GO

1
  1. Her şeyin işe yaramadığını denedim
  2. Tüm bağlantıları öldüreceğimiz için bu sunucuya uzaktan giriş yapın
  3. tamamlanıncaya kadar aşağıdaki kodu bir kereden fazla çalıştırın ve artık "öldürme işlemi" testi yok
  4. Aşağıdaki kodun altındaki kodu kullanarak tekrar etkinleştirin

master GO declare @sql değişkenini varchar (20), @spid int olarak kullan

master..sysprocesses öğesinden @spid = min (spid) öğesini seçin; burada dbid = db_id ('DB_NAME') ve spid! = @@ spid

(@spid boş değil) yazdırmaya başla 'Killing process' + cast (@spid varchar olarak) + '...' set @sql = 'kill' + cast (@spid varchar olarak) exec (@sql)

select 
    @spid = min(spid)  
from 
    master..sysprocesses  
where 
    dbid = db_id('DB_NAME') 
    and spid != @@spid end

sonra tekrar canlandırmak

ALTER DATABASE DB_NAME SETİ MULTI_USER; GİT


1

Bu benim için iyi çalıştı

  1. Bir yedek al
  2. Yeni veritabanı oluşturun ve yedeklemeyi ona geri yükleyin
  3. Ardından Özellikler> Seçenekler> [Aşağı kaydır] Durum> RestrictAccess> Çoklu Kullanıcı'yı seçin ve Tamam'ı tıklayın.
  4. Eski veritabanını sil

Umarım bu çalışma herkese teşekkürler Ramesh Kumar


1

Yukarıdakiler işe yaramazsa, spid'in oturum açma adını bulun ve Güvenlik - Oturum Açma'da devre dışı bırakın


1

Bu veritabanını tekli modda yapamazsınız. Her şeyden önce şunu bilmelisiniz: sql yönetim stüdyosunu açtığınızda veritabanındaki herhangi bir kullanıcıyı tanımıyor, ancak veritabanını tıkladığınızda tek bir kullanıcı ve komutunuzun çalışmadığını düşünüyoruz. Sadece şunu yapın: Yönetim stüdyosunu kapatın ve tekrar açın. herhangi bir veritabanı seçmeden yeni sorgu penceresi komut komut dosyasını yazın.

USE [master];
GO
ALTER DATABASE [tuncayoto] SET MULTI_USER WITH NO_WAIT;
GO 

f5 wolla'yı herşey yolunda yap!


0

Problemi kolayca çözdüm

  1. Veritabanı adına sağ tıklayın ve yeniden adlandırın

  2. Değiştirdikten sonra, veritabanı adına sağ tıklayın -> özellikler -> seçenekler -> kaydırma kısıtlamasının altına gidin RestrictAccess (SINGLE_USER - MULTI_USER)

  3. Şimdi veritabanını eski adınız olarak yeniden adlandırabilirsiniz.


0

SQL Server 2014 ile çalışan 3'ten fazla kez, hiçbir şeyi değiştirmeden Tek Kullanıcı moduna dönüştürmek için bir veritabanı aldım. Bir şekilde veritabanı oluşturulurken oluşmuş olmalıdır. Veritabanının tek kullanıcı modunda olduğu ve bağlanamadığı bir hata aldığım için yukarıdaki yöntemlerin hiçbiri işe yaramadı.

Çalışmam gereken tek şey SQL Server Windows Hizmeti'ni yeniden başlatmaktı. Bu, veritabanına bağlanmamı ve gerekli değişiklikleri yapmamı veya veritabanını silmemi ve baştan başlamamı sağladı.


0

veritabanı özelliklerine gidin ve TEK KULLANICI modunu ÇOK KULLANICI olarak değiştirin

resim açıklamasını buraya girin

Not: onun için işe yaramazsa o zaman Db yedek almak ve tekrar geri ve yukarıdaki yöntemi tekrar yapmak

* Bekar = SINGLE_USER

Çoklu = MULTI_USER

Kısıtlı = RESTRICTED_USER


Bu OP'nin kullandığı sorgudan farkı nedir?
Squazz

evet her ikisi de aynı çalışacaktır, bu tablo yapmak için sql sunucusu GUI Tablo Tasarımcısı kullandığımız CREATE Tablo sorgusu kullanmak gibi aynı, BTS her ikisi de aynı çalışacak, biri sorgu yöntemi ve diğer GUI yöntemidir. ne istersen onu kullan.
Hassan Saeed

OP, hes sorgusunun bir hatayla sonuçlandığını açıkça belirtiyor.
Söylediğiniz

0

Tek Kullanıcı moduna girdikten sonra, istemci SQL Server ile yalnızca BİR bağlantı kurabilir, "Nesne Gezgini" nin (ayrı) bir bağlantı aldığını unutmayın, bu nedenle bir sorguda Çok Kullanıcılı deyimi çalıştırmayı deniyorsanız penceresinde, Tek Kullanıcı modunda başka bir bağlantı kuramayacağınız hatası alırsınız.

Benim için bu sorun değildi, ancak benim durumumda, sürekli olarak (birkaç saniyede bir) bağlantı kuran birkaç otomatik süreç vardı, bu yüzden DB'yi Tek Kullanıcılı moda alıp bağlantıyı kestikten hemen sonra, süreçler bağlantıyı kurdu / işgal etti (Geri Yükleme işlemimi başlatmadan önce). Bu bağlantıları öldürür öldürmez - yeniden bağlanırlar ve Geri Yükle komutunu çalıştırdığımda, bağlantının zaten meşgul olduğu hatasını alırım.

Bunu çözmek için killifadeleri, ifadeleri değiştirmek User-ModeveRestore işlemleri tek bir sorgu penceresinde ve hepsini tek seferde çalıştırdığımda, voila !!! işe yaradı.

Umarım bu başkalarına yardımcı olur.


0

Yerel bir DB ile sorun yaşıyordum.

SQL Server'ı durdurup SQL sunucusunu başlatarak ve sonra da DB özelliklerini Multi_User olarak değiştirmek için SSMS kullanıcı arabirimini kullanarak bu sorunu çözmeyi başardım.

Bir yedeklemeyi geri yüklemeye çalışırken DB "Tek Kullanıcı" Moduna girdi. Geri yüklemeye çalışmadan önce hedef veritabanının yedeğini oluşturmamıştım (SQL 2017). bu her seferinde seni alacak.

SQL Server'ı durdurun, SQL Server'ı başlatın, ardından yukarıdaki Komut Dosyalarını çalıştırın veya kullanıcı arayüzünü kullanın.


0

Bir süre çözüm aradım ve sonunda aşağıdaki çözümü buldum,

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. (Bunu aşağıdaki kod şablonunda EXEC (@kill) ile yaptım .)

Sonra,

Veritabanını MULTI_USER moduna ayarlamak için aşağıdaki SQL'i ç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

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

ALTER DATABASE [<Your_DB_Name>] SET SINGLE_USER

Bu çalışmalı. Mutlu kodlama !!

Teşekkürler!!

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.