web-dev-qa-db-ja.com

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

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

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

また、データベースを削除しようとすると、エラーが発生します。

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

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

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

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

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

173
Liondancer

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

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

323
CRAFTY DBA

まず、現在実行されているすべてのプロセスを見つけて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
31
Sathish

シングルユーザーモードを解除するには、次のことを試してください。

ALTER DATABASE [my_db] SET MULTI_USER

シングルユーザーモードに切り替えるには、次のようにします。

ALTER DATABASE [my_db] SET SINGLE_USER

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

screenshot of options page of sql server

14
Tomas

私はこれを試してみました

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');
8
Geri Reshef

以下は私のために働いた:

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
Jesper Lehtinen

Ctrl + 1を押す

データベースをロックするプロセスを見つけます。 dbname列でdbを調べて、spidをメモします。今、あなたはそのステートメントを実行しなければなりません:

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

これが誰かに役立つかどうかわからないが、私は同じ問題を抱えていて、私を妨げているプロセスを見つけることができませんでした。私はSSMSを閉じて、ローカルインスタンスを打つすべてのサービスを止めました。それから私が戻ってexec sp_who2を実行すると、それは私に犯人を見せてくれました。私はプロセスを強制終了し、Multi_Userを機能させることができましたそしてそれからサービスを再開しました。特定のパッケージを探すために数分/秒ごとにIISヒットしました。

5
Bindum

このスクリプトを使う

exec sp_who

Dbnameとspidの列を探す

今すぐ実行

kill spid 
go
ALTER DATABASE [DBName]
SET MULTI_USER;
3
Aminur Rahman

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

3
Mysti

他の選択肢は、

  • ALTER DATABASE [Your_Db] SET MULTI_USERを実行
3
testpattern

万が一誰かがこのスレッドにつまずいた場合は、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
2
Einar Larusson

さらに効果的にするために、 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
2
Roy Latham

今日、私は自分のデータベースがマルチユーザーモードからシングルユーザーモードに変更されたことと同じ問題に直面していましたが、それが結果的に私がデータベースを公開できなくなっていました。

この問題を解決するために、私はすべてのVisual Studioインスタンスを閉じて、SQL Serverクエリウィンドウで以下のコマンドを実行しなければなりませんでした -

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

このコマンドはDBをシングルユーザーからマルチユーザーに変更し、その後、私は正常に公開することができました。

2
Vivek

私が同じ問題に出くわしたとしても、それを殺すために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
Vijred

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

私はこの背後にある論理を解明することはできませんが、それはSSMSのバグであるように見え、まだSQL 2012でそれ自身を明らかにしています。

1
Mr McGoo