データベースをSINGLE USERモードからMULTI USERに設定します


188

SINGLE_USERモードで復元されたデータベースをに設定する方法を教えてくださいMULTI_USER。走るたびに

ALTER DATABASE BARDABARD
SET MULTI_USER;
GO

私はこのエラーを受け取ります:

現在、データベース「BARDABARD」の状態またはオプションを変更することはできません。

データベースはシングルユーザーモードであり、ユーザーは現在データベースに接続しています。

それSINGLE_USERを別のモードに設定するには、非モードにする必要がありますが、モード中にデータベースを別のモードに設定することはできませんSINGLE_USER

回答:


113

「ユーザーは現在それに接続しています」は、SQL Server Management Studioウィンドウ自体である可能性があります。マスターデータベースを選択して、ALTERクエリを再実行してください。


1
これに追加:クエリウィンドウがアクティブなときに、[ 利用可能なデータベース]ツールバーのドロップダウンで他のデータベース(などmaster)が選択されていても、クエリウィンドウがデータベースにアタッチされている可能性があります。それは、あなたが頭痛近い与え続けた場合は、すべての他のクエリウィンドウを、とのようないくつかの無実のシステムデータベースを選択するmasterか、tempdbあなたが残っている一つのウィンドウのドロップダウンに。
CVn 2017年

DBを切断して、Microsoft SQL Server Management Studioで再度接続してみてください。その後、コマンドを再度実行してください。
Isuru Madusanka

最初のコメントは非常に役に立ち、実際に回答に追加できます。他のすべてのクエリを閉じる前に、クエリを実行できませんでした。
user2216

87

このエラーメッセージは通常、DBに接続されている他のプロセスがあることを意味します。これを実行して、接続されているものを確認してください。

exec sp_who

それはあなたにプロセスを返し、それからあなたは走ることができるはずです:

kill [XXX]

[xxx]は、spid強制終了しようとしているプロセスです。

その後、上記のステートメントを実行できます。

幸運を。


kill [xxx]はプロセスを取り除きますが、コマンドを実行しようとすると、プロセスが戻ってきます!
colmde

73

変更をすぐにロールバックするオプションを追加できます。

ALTER DATABASE BARDABARD
SET MULTI_USER
WITH ROLLBACK IMMEDIATE
GO

1
ROLLBACK IMMEDIATE正確には何をしますか?
ダカブ2016年

3
@dakab保留中のトランザクションがなくなるまで無期限に待機するのではなく、ALTER DATABASEステートメントのトランザクションの開始時点で、保留中のすべてのトランザクションをWITH ROLLBACK X SECONDS強制的にロールバックします。現在のところ、ドキュメントに記載されていないようです)。これは、「現在実行中のすべてを停止して、これを実行する」ことと同じです。
ベーコンビット

39

SQL Server 2012:

を右クリックし、DB > Properties > Options > [Scroll down] State > RestrictAccess > select Multi_user[OK]をクリックします。

出来上がり!


5
そうでもない、これはあなたのソリューションをしようとしたときに私が受け取ったものです:/「データベース『XXXは、』は既に開かれており、一度に一人のユーザーを持つことができます(Microsoft SQL Server、エラー:924)。」
クシシュトフWolny

1
SQL 2008R2で追加確認済み。
codo-sapien

ベストアンサー、KILLステートメントを使用する権限がない場合でも機能
Marco Marsala


13

これでうまくいきました。

手順1.データベースエンジンを右クリックし、アクティビティモニターをクリックして、どのプロセスが接続しているかを確認します。その特定のユーザーを強制終了し、クエリをすぐに実行します。

ステップ2。

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

データベースを更新します。


9

実際に、プロセスと競合状態によってdbがかなりロックされるという問題がありました。1つのコマンドをリフレッシュして実行すると、再度ロックされました...次のコマンドを続けて実行する必要がありました。 SSMSでオフラインにして、そこから復元を実行して、オンラインで問題なく復帰しました。

最初の実行:

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);

その後すぐに(2番目のクエリウィンドウで):

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

必要なことをしてから、オンラインに戻しました。私の問題を組み合わせて解決するために私がこれらの作品を書いたすべての人に感謝します。


7

SQL Management Studioを使用するのではなく、サーバーに直接ログオンすることをお勧めします

ログインするアカウントが、MULTI_USERに設定するデータベースのdbownerであることを確認してください。可能な場合は、saとしてログイン(SQLサーバー認証を使用)

データベースがIISによって使用されている場合、Webサイトとそれを使用するアプリプールを停止します -これは接続されているプロセスであり、MULTI_USERへの設定をブロックしている可能性があります

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

それでも問題が解決しない場合は、ここを参照してください。

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

最後の代替案として -上記のすべてを試して必死になっている場合は、SQLサーバーインスタンスを停止して再起動してみてください。


5

次の手順を使用して修正したところ、解決する場合があります。

ステップ1

シングルユーザーデータベースを右クリック


ステップ2

オフラインにする


ステップ:3

接続を解除してオフラインにします


ステップ:4

オンラインにする


ステップ:5

次に、次のクエリを実行します。

ALTER DATABASE YourDBName
SET MULTI_USER
WITH ROLLBACK IMMEDIATE
GO

楽しい...!


2

以下のコードは、singleuserモードに変更するために使用された特定のSPIDがわからないときに機能しました。

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. すべてがうまくいかなかった
  2. すべての接続を強制終了するため、そのサーバーにリモートでログインします。
  3. 以下のコードを、コードが完了し、「killing process」テストが返されなくなるまで複数回実行します
  4. 以下のコードの下のコードを使用して再度アクティブ化します

マスターGOを使用して@sqlをvarchar(20)として宣言し、@ spidをintとして宣言する

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

while(@spid is not null)begin print 'Killing process' + cast(@spid as varchar)+ '...' set @sql = 'kill' + cast(@spid as varchar)exec(@sql)

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

それを生き返らせるために

ALTER DATABASE DB_NAME SET MULTI_USER; 行く


1

これは私にとってはうまくいきました

  1. バックアップを取る
  2. 新しいデータベースを作成し、それにバックアップを復元します
  3. 次に、[プロパティ]> [オプション]> [下にスクロール]状態> [RestrictAccess]> [Multi_user]を選択し、[OK]をクリックします
  4. 古いデータベースを削除する

この仕事がすべてのために願っていますラメシュ・クマールありがとう



1

シングルモードでデータベースを作成することはできませんでした。何よりも重要ですが、SQL管理スタジオを開いたときにデータベースのユーザーは認識されていませんが、データベースをクリックすると、単一のユーザーとコマンドが機能していないと見なされます。ただそれを行う:管理スタジオを閉じて、再び開きます。データベースを選択せず​​に新しいクエリウィンドウでコマンドスクリプトを記述します。

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

f5 wollaをすべてOKにします!


0

簡単に問題を解決しました

  1. データベース名を右クリックして名前を変更します

  2. 変更後、データベース名を右クリックします->プロパティ->オプション->スクロールの一番下に移動しますRestrictAccess(SINGLE_USERからMULTI_USERへ)

  3. ここでも、データベースの名前を古い名前に変更できます。


0

SQL Server 2014で3回以上作業していて、何も変更せずにデータベースをシングルユーザーモードに変換しました。データベースの作成中になんらかの原因で発生したはずです。データベースがシングルユーザーモードで接続できないというエラーが常に表示されるため、上記の方法はすべて機能しませんでした。

SQL Server Windowsサービスを再起動するだけで作業できました。これにより、データベースに接続して必要な変更を加えるか、データベースを削除してやり直すことができました。


0

データベースのプロパティに移動し 、SINGLE USERモードをMULTI USERに変更します

ここに画像の説明を入力してください

注:それが機能しない場合は、Dbバックアップを取り、再度復元して、上記の方法をもう一度実行してください

*シングル= SINGLE_USER

複数= MULTI_USER

Restricted = RESTRICTED_USER


これは、OPが使用しているクエリとどのように異なりますか?
Squazz

はい、どちらも同じように機能します。これは、SQLサーバーGUIテーブルデザイナを使用してテーブルを作成する代わりに、テーブルを作成する代わりに同じです。BTSはどちらも同じように機能します。一方はクエリメソッドで、もう一方はGUIメソッドです。好きなものを使ってください。
Hassan Saeed

OPは、クエリがエラーになることを明確に述べています。これは、まったく答えを出さないクエリを使用するのとまったく同じことだと言っているので、ここで混乱して多くの間違った答えに追加しています
Squazz

0

シングルユーザーモードに移行すると、クライアントはSQL Serverとの接続を1つだけ確立できます。「オブジェクトエクスプローラー」は(個別の)接続を使用するため、クエリでマルチユーザーステートメントを実行しようとすると、ウィンドウでは、シングルユーザーモードでは別の接続を確立できないというエラーが表示されます。

私にとってこれは問題ではありませんでしたが、私の場合、永続的に(数秒ごとに)接続を確立している自動化されたプロセスはほとんどなかったので、DBをシングルユーザーモードにして自分自身を切断するとすぐに、プロセスが接続を確立/占有しました(復元操作を開始する前に)。これらの接続を強制終了するとすぐに再接続され、Restoreコマンドを実行すると、接続がすでに使用されているというエラーが表示されます。

これを解決するには、killステートメント、ステートメントの変更、User-ModeおよびRestore操作をすべて1つのクエリウィンドウそれらをすべて一度に実行すると、出来上がりです!!! 出来た。

これが他の人を助けることを願っています。


0

ローカルDBで問題が発生しました。

SQLサーバーを停止してSQLサーバーを起動し、SSMS UIを使用してDBプロパティをMulti_Userに変更することで、この問題を解決できました。

バックアップを復元しようとしたときに、DBが「シングルユーザー」モードになりました。復元を試みる前に、ターゲットデータベースのバックアップを作成していませんでした(SQL 2017)。これは毎回あなたを取得します。

SQL Serverを停止し、SQL Serverを起動してから、上記のスクリプトを実行するか、UIを使用します。


0

私はしばらくの間解決策を探して、ついに以下の解決策を思いつきました、

SSMSは一般的に、データベースの背後でいくつかの接続を使用します。

アクセスモードを変更する前に、これらの接続を強制終了する必要があります。(以下のコードテンプレートで、EXEC(@kill)を使用して実行しました。)

そして、

次のSQLを実行して、データベースをMULTI_USERモード設定します。

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

シングルユーザーモードに戻すには、次のコマンドを使用できます。

ALTER DATABASE [<Your_DB_Name>] SET SINGLE_USER

これはうまくいくはずです。ハッピーコーディング!!

ありがとう!!

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.