シングルユーザーモードを終了する


208

現在、私のデータベースはシングルユーザーモードです。データベースを拡張しようとすると、エラーが発生します。

データベース「my_db」にアクセスできません。(ObjectExplorer)

また、データベースを削除しようとすると、次のエラーが表示されます。

現在、データベース 'my_db'の状態またはオプションを変更することはできません。データベースはシングルユーザーモードであり、ユーザーは現在データベースに接続しています。

シングルユーザーモードを終了するにはどうすればよいですか?このデータベースを使用しているユーザーはいません。

IISで自分のサイトを閲覧しようとすると、次のエラーが発生します。

現在のWeb要求の実行中に未処理の例外が生成されました。例外の発生源と場所に関する情報は、以下の例外スタックトレースを使用して識別できます。

シングルユーザーモードがこれを引き起こしているように感じます。

回答:


381

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

アクセスモードを変更する前に、これらの接続を強制終了する必要があります。

まず、オブジェクトエクスプローラーがマスターのようなシステムデータベースを指していることを確認します。

次に、sp_who2を実行して、データベース 'my_db'へのすべての接続を見つけます。KILL { session id }セッションIDがによってSPIDリストされている場所で、すべての接続を強制終了しsp_who2ます。

3番目に、新しいクエリウィンドウを開きます。

次のコードを実行します。

-- Start in master
USE MASTER;

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

データベースファイルの管理に関する私のブログ記事を参照してください。これはファイルを移動するために作成されましたが、ユーザー管理は同じです。


2
「sp_who2」コマンドを使用したときに、「my_db」に接続されているDBNameが表示されませんでした。これらの接続はどれも強制終了しませんでした。コマンドを実行した後、同じエラーが表示されます= [: 'データベース' my_db 'の状態またはオプションを変更できません。データベースはシングルユーザーモードであり、ユーザーは現在データベースに接続しています。メッセージ5069、レベル16、状態1、行1のALTER DATABASEステートメントが失敗しました」
Liondancer

2
マスターであること、sp_who2にdatabase = my_dbの行が表示されておらず、オブジェクトエクスプローラーがmy_dbにないことを確認しましたか?
CRAFTY DBA 2013

1
SSMSを切断して接続してみてください。何かがそのデータベースに接続されている必要があります。もう1つのオプションは、専用の管理コンソール(DAC)に接続することです。これは、あなたがシステム管理者であることを前提としています。次に、問題のあるspidを殺します。
CRAFTY DBA 2013

1
また、usp_who2スクリプトをダウンロードします(craftydba.com/wp-content/uploads/2011/09/usp-who2.txt)。それを実行します。ユーティリティをmsdb.dbo.usp_who2に配置します。これは、sp_who2の結果をユーザーIDの下のtempdbのテーブルに保存し、データベース名でフィルターします。エラーの画像を投稿してください。幸運を。
CRAFTY DBA 2013

3
SPIDを見つけ、次を使用します。Kill100。100はセッション(SPID)の数です。
CRAFTY DBA 2013

45

まず、KILL現在実行中のすべてのプロセスを見つけます。

次に、以下T-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

私のクエリmaster..sysprocessesが、私はいくつかの行が表示され、その後の行が与えられたデータベースは、シングルユーザーモード、などであることをエラーメッセージに置き換えている場合は、このソリューションは、SQL Serverの2016年に私のために動作しないでしょう
youcantryreachingmeを

@ youcantryreachingme、SQL Server 2016で表示されたエラーメッセージをここに入力してください。そうすれば、私/他の誰かが問題を解決できるようになります。
サティシュ

OPと同じ:現在、データベース 'my_db'の状態またはオプションを変更することはできません。データベースはシングルユーザーモードであり、ユーザーは現在データベースに接続しています。
youcantryreachingme

25

シングルユーザーモードから切り替えるには、以下を試してください:

ALTER DATABASE [my_db] SET MULTI_USER

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

ALTER DATABASE [my_db] SET SINGLE_USER


1
「現在、データベース 'my_db'の状態またはオプションを変更できません。データベースはシングルユーザーモードであり、ユーザーは現在データベースに接続しています。メッセージ5069、レベル16、状態1、行1のALTER DATABASEステートメントが失敗しました。
Liondancer 2013

1
データベースを停止して再起動し(明らかに、これが他のユーザーに影響を与える運用システムでない場合)、コマンドを再試行できますか?また、@ CRAFTYDBAが述べたように、コマンドはマスターデータベースから実行する必要があります。
rsbarro 2013

1
「システムデータベース」を展開して「マスター」を右クリックし、「新しいクエリ」を選択して、自分と@CRAFTYDBAの両方のコマンドで試しました。同じエラー= [
Liondancer 2013

1
データベースを停止して再起動し、既存の接続を強制終了しましたか?また、データベースへの接続を殺すために多くの方法をここに見ることができます:stackoverflow.com/questions/11620/...
rsbarro

2
左ペインでサーバーを右クリックし、[切断]をクリックします。データベースでSSMSタブが1つだけ開いていることを確認し(右クリックして[他の接続を切断]を選択)、ステートメントを実行します。各タブとオブジェクトエクスプローラーは接続です。データベースに接続できる接続は1つだけです(つまり、「シングルユーザーモード」)。シングルユーザーは「シングル接続」である必要があります:)がんばって
tommy_o

20
  1. データベースセクションでデータベースを右クリックします。
  2. 「プロパティ」を選択します
  3. 「オプション」ページを選択
  4. [その他のオプション]を下にスクロールして、[アクセス制限]フィールドを変更します

SQLサーバーのオプションページのスクリーンショット


1
このソリューションは、SQL Server 2016では機能しません。プロパティにアクセスしようとすると、データベースがシングルユーザーモードであり、既にユーザーが接続しているというエラーが表示されます。
youcantryreachingme


8

同じ問題があり、このクエリを使用してkillするsession_idが見つかりました。

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

これは完璧でした。厄介なSPIDを見つけ、DBをオンラインに戻しました。どうもありがとう!
Russell Speight 2017年

8

CTRL + 1を押す

データベースをロックするプロセスを見つけます。dbname列でdbを探し、spidをメモします。次に、そのステートメントを実行する必要があります。

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

CTRL + 1は、私が知らなかった非常に便利なショートカットです!
タイラーフォーサイス

7

以下は私のために働きました:

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

別のオプションは次のとおりです。

  • データベースをオフラインにします。SMSSで、データベースを右クリックして[オフラインにする]を選択し、[すべての接続をドロップする]を選択します
  • 走る ALTER DATABASE [Your_Db] SET MULTI_USER

鉱山はそれをオフラインにすることを許さなかった、それはそれがシングルユーザーモードであり、ユーザーが接続されたとだけ言ってきた!(はい、「すべての接続を削除する」にチェックマークを付けました)。代わりにデータベースをデタッチしました!
TabbyCool 2017年

ユーザーが接続されておらず、KILLコマンドがsa接続で機能しないため、このオプションを使用する必要がありました。
Derek K

6

誰かがこのスレッドに遭遇した場合に備えて、SQL Serverのシングルユーザーモードでの防弾ソリューションを次に示します。

-
強制終了する必要がある接続のプロセスID(spid)を取得します-'DBName'を実際のDBの名前に置き換えます

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'

別の方法として、「sp_who」コマンドを使用して、開いている接続の「spid」を取得することもできます。

-または、代わりにこのSPを使用します

exec sp_who

-次に、以下を実行し、[spid]と[DBName]を正しい値に置き換えます

KILL SpidToKillGoesHere
GO

SET DEADLOCK_PRIORITY HIGH
GO

ALTER DATABASE [DBName] SET MULTI_USER WITH ROLLBACK IMMEDIATE
GO

追加情報をありがとう、大きな違いが生まれました!
ダニエル

5

これが誰かに役立つかどうかはわかりませんが、私には同じ問題があり、私を妨げているプロセスを見つけることができませんでした。SSMSを閉じて、ローカルインスタンスにアクセスするすべてのサービスを停止しました。その後、戻ってexec sp_who2を実行すると、原因がわかりました。私はプロセスを強制終了し、Multi_Userを機能させることができた後、サービスを再起動しました。IISは、特定のパッケージを探すために数分/秒ごとに攻撃しました。


3

私は今朝同じ問題に出くわしました。それは簡単な問題であることがわかりました。オブジェクトエクスプローラーのシングルユーザーデータベースに設定されたクエリウィンドウを開いていました。sp_who2ストアドプロシージャは接続を表示しませんでした。一度閉じると、


3

Jespersの回答に追加すると、さらに効果的です:

SET DEADLOCK_PRIORITY 10;-- Be the top dog.

SET DEADLOCK_PRIORITY HIGHDEADLOCK_PRIORITY5.の使用

何が起こっているのかというと、他のプロセスはデータベースに亀裂が入り、プロセスのが低い場合DEADLOCK_PRIORITY、競合を失います。

これにより、他のspid(数回実行する必要がある場合があります)を見つけて殺すことがなくなります。

ALTER DATABASE複数回実行する必要がある可能性があります(ただし、Jesperが実行します)。変更されたコード:

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


2

今日、データベースがマルチユーザーモードからシングルユーザーモードに変更された同じ問題に直面し、最終的にデータベースを公開できなくなりました。

この問題を解決するには、すべてのVisual Studioインスタンスを閉じて、SQL Serverクエリウィンドウで次のコマンドを実行する必要がありました-

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

このコマンドにより、DBがシングルユーザーからマルチユーザーに変更され、その後、公開に成功しました。


1

同じ問題に遭遇しても、my_dbへのアクティブな接続を見つけてそれを強制終了することができませんが、それでも同じエラーが表示されます。サーバー上の任意のデータベースに対して可能なすべてのSSMS接続を切断し、SSMSから新しい接続を作成して、それをマルチユーザーに変更します。

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

注:これはSQL Server 2005のバグの可能性があるようです!


1

SQL 2012でこれを経験しました。シングルユーザーに設定した元のセッションを強制終了すると、レプリケーションプロセスが開始されました。しかし、sp_who2は、DBに接続された新しいプロセスを表示しませんでした。SSMSを閉じて再度開くと、データベースでこのプロセスを確認でき、それを強制終了してすぐにmulti_userモードに切り替えることができました。

この背後にあるロジックを理解することはできませんが、それはSSMSのバグのようであり、SQL 2012でもまだ明らかになっています。


0

マスターを使用

行く

d.name、d.dbid、spid、login_time、nt_domain、nt_username、loginameを選択します。sysprocessesp内部結合sysdatabases d on p.dbid = d.dbid where d.name = 'database name'

kill 568-spidを殺す

ALTER DATABASEデータベース名 '

SET MULTI_USER go

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