現在、私のデータベースはシングルユーザーモードです。データベースを拡張しようとすると、エラーが発生します。
データベース 'my_db'にアクセスできません。(ObjectExplorer)
また、データベースを削除しようとすると、エラーが発生します。
データベース 'my_db'の状態やオプションを変更することは現時点ではできません。データベースはシングルユーザーモードで、ユーザーは現在データベースに接続しています。
シングルユーザーモードを終了するにはどうすればよいですか?このデータベースを使用しているユーザーはいません。
IISで自分のサイトを閲覧しようとすると、エラーが発生します。
現在のWeb要求の実行中に未処理の例外が発生しました。例外の発生源と場所に関する情報は、以下の例外スタックトレースを使用して識別できます。
シングルユーザーモードがこれを引き起こしているように私は感じます。
SSMSは一般に、舞台裏でデータベースへのいくつかの接続を使用します。
アクセスモードを変更する前に、これらの接続を切断する必要があります。
まず、オブジェクトExplorerがmasterのようなシステムデータベースを指していることを確認してください。
次に、sp_who2を実行し、データベース 'my_db'へのすべての接続を見つけます。 KILL { session id }
を実行してすべての接続を切断します。ここで、session idはsp_who2
によってリストされたSPID
です。
第三に、新しいクエリウィンドウを開きます。
次のコードを実行してください。
-- Start in master
USE MASTER;
-- Add users
ALTER DATABASE [my_db] SET MULTI_USER
GO
データベースファイルの管理については私の ブログ記事 を見てください。これはファイルを移動するために書かれました、しかしユーザ管理は同じです。
まず、現在実行されているすべてのプロセスを見つけて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
シングルユーザーモードを解除するには、次のことを試してください。
ALTER DATABASE [my_db] SET MULTI_USER
シングルユーザーモードに切り替えるには、次のようにします。
ALTER DATABASE [my_db] SET SINGLE_USER
私はこれを試してみました
ALTER DATABASE dbName SET MULTI_USER WITH ROLLBACK IMMEDIATE
私は同じ問題を抱えていました、そして殺すべきsession_idはこの問い合わせを使って見つけられました:
Select request_session_id From sys.dm_tran_locks Where resource_database_id=DB_ID('BI_DB_Rep');
以下は私のために働いた:
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
Ctrl + 1を押す
データベースをロックするプロセスを見つけます。 dbname列でdbを調べて、spidをメモします。今、あなたはそのステートメントを実行しなければなりません:
kill <your spid>
ALTER DATABASE <your db> SET MULTI_USER;
これが誰かに役立つかどうかわからないが、私は同じ問題を抱えていて、私を妨げているプロセスを見つけることができませんでした。私はSSMSを閉じて、ローカルインスタンスを打つすべてのサービスを止めました。それから私が戻ってexec sp_who2を実行すると、それは私に犯人を見せてくれました。私はプロセスを強制終了し、Multi_Userを機能させることができましたそしてそれからサービスを再開しました。特定のパッケージを探すために数分/秒ごとにIISヒットしました。
このスクリプトを使う
exec sp_who
Dbnameとspidの列を探す
今すぐ実行
kill spid
go
ALTER DATABASE [DBName]
SET MULTI_USER;
私は今朝同じ問題に出くわした。それは簡単な問題であることがわかりました。オブジェクトエクスプローラでシングルユーザデータベースに設定されたクエリウィンドウを開きました。 sp_who2ストアドプロシージャは接続を表示しませんでした。閉じたら、次のように設定できました。
他の選択肢は、
ALTER DATABASE [Your_Db] SET MULTI_USER
を実行万が一誰かがこのスレッドにつまずいた場合は、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'
別の方法として、開いている接続の「spid」を取得するためにコマンド「sp_who」を使用することもできます。
- または代わりにこのSPを使用してください。
exec sp_who
- 以下を実行し、[spid]と[DBName]を正しい値に置き換えてください。
KILL SpidToKillGoesHere
GO
SET DEADLOCK_PRIORITY HIGH
GO
ALTER DATABASE [DBName] SET MULTI_USER WITH ROLLBACK IMMEDIATE
GO
さらに効果的にするために、 Jespersの回答に を追加します。
SET DEADLOCK_PRIORITY 10;-- Be the top dog.
SET DEADLOCK_PRIORITY HIGH
は5のDEADLOCK_PRIORITY
を使用します。
何が起きているのかというと、他のプロセスがデータベースにひび割れを起こしていて、プロセスの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
今日、私は自分のデータベースがマルチユーザーモードからシングルユーザーモードに変更されたことと同じ問題に直面していましたが、それが結果的に私がデータベースを公開できなくなっていました。
この問題を解決するために、私はすべてのVisual Studioインスタンスを閉じて、SQL Serverクエリウィンドウで以下のコマンドを実行しなければなりませんでした -
USE [Your_Database_Name]; ALTER DATABASE [Your_Database_Name] SET MULTI_USER GO
このコマンドはDBをシングルユーザーからマルチユーザーに変更し、その後、私は正常に公開することができました。
私が同じ問題に出くわしたとしても、それを殺すために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のバグの可能性があります。
これはSQL 2012で経験したばかりです。元のセッションを終了してシングルユーザーに設定したときに、レプリケーションプロセスが急増しました。しかしsp_who2は、新しいプロセスがDBに接続していることを示しませんでした。 SSMSを閉じて再度開くと、データベース上でこのプロセスを確認できたので、それを強制終了してすぐにmulti_userモードに切り替えることができました。
私はこの背後にある論理を解明することはできませんが、それはSSMSのバグであるように見え、まだSQL 2012でそれ自身を明らかにしています。