データベースをロックできなかったため、ALTER DATABASEが失敗しました


124

一部のプロセスが機能していないため、データベースを再起動する必要があります。私の計画は、それをオフラインにして、再びオンラインに戻すことです。

私はこれをSQL Server Management Studio 2008で実行しようとしています:

use master;
go
alter database qcvalues
set single_user
with rollback immediate;
alter database qcvalues
set multi_user;
go

これらのエラーが発生しています:

Msg 5061, Level 16, State 1, Line 1
ALTER DATABASE failed because a lock could not be placed on database 'qcvalues'. Try again later.
Msg 5069, Level 16, State 1, Line 1
ALTER DATABASE statement failed.
Msg 5061, Level 16, State 1, Line 4
ALTER DATABASE failed because a lock could not be placed on database 'qcvalues'. Try again later.
Msg 5069, Level 16, State 1, Line 4
ALTER DATABASE statement failed.

何が悪いのですか?


そもそもこのニーズを引き起こした問題は何ですか?現在、トランザクションをロールバックしていますか?また、まだ開いている可能性のある別のSSMSウィンドウでこのコマンドをすでに実行していますか?他の試行をブロックするロックがかかる可能性があるかどうか(純粋な推測)と思いますが、データベースが実際にsingle_userモードになる前にまだ待機しています。
Martin Smith

1
@Martin-十分に公正です。他のことを考えたり、気を失ったりしなければなりません。いずれか一方が十分に可能である
codingbadger

@皆さん、ありがとうございました。SSMSを再起動して、みんなを殺すことができました
JOE SKEET

インテリセンスかもしれません。波線がデータベースにアクセスしようとしている不完全なクエリを削除したところ、機能しました。
Faahmed

回答:


293

エラーが発生したら、実行します

EXEC sp_who2

リストでデータベースを探します。接続が終了しなかった可能性があります。データベースへの接続が見つかった場合は、次を実行します。

KILL <SPID>

どこ<SPID>のデータベースに接続されているセッションのためSPIDがあります。

データベースへのすべての接続が削除された後にスクリプトを試してください。

残念ながら、問題が発生している理由はわかりませんが、問題が他の場所で発生していることを示すリンクがあります。

http://www.geakeit.co.uk/2010/12/11/sql-take-offline-fails-alter-database-failed-because-a-lock-could-not-error-5061/


コマンドによって接続が終了されない理由について、何か説明がありますか?私が考えることができる唯一の理由は、それがまだロールバックのプロセス中であるか、それset single_userがまだ保留中の試みであるということでしょう。
Martin Smith

@マーティン、私にはこれの理由がないと思います。しかし、他の人が問題を見たことを示すリンクを追加します。トランザクションのロールバックが問題になる可能性があることには同意しますが、それでもKILL解決されません。
ボブ

これが発生する理由を理解してください。ただし、リンクのコメントは、それが機能することを示しているようです。(+1)
マーティン・スミス

KILL (87) 結果はMsg 102, Level 15, State 1, Line 1 Incorrect syntax near '('.erm ....
Tim Abell

2
@MartinSmith私はその理由を知っていると思います。私は同じ問題を抱えていました。sp_who2の下に残っている接続が表示され、オフラインの停止が発生しました。これは、ssmsで開いている編集行ウィンドウであることがわかりました。ここで何が起こるかは、行の編集ウィンドウが編集可能な結果セットで開いたままのクエリであると考えています。SQL Serverには、更新ステートメントに代わる機能があります。この特定のssmsウィンドウを閉じると、オフラインでのハングがすぐに完了しました。
ジョン

5

次のようにして、なんとかこのエラーを再現しました。

接続1(数分間実行したままにします)

CREATE DATABASE TESTING123
GO

USE TESTING123;

SELECT NEWID() AS X INTO FOO
FROM sys.objects s1,sys.objects s2,sys.objects s3,sys.objects s4 ,sys.objects s5 ,sys.objects s6

接続2および3

set lock_timeout 5;

ALTER DATABASE TESTING123 SET SINGLE_USER WITH ROLLBACK IMMEDIATE;

2

「移行中」の場合はこれを試してください...

http://learnmysql.blogspot.com/2012/05/database-is-in-transition-try-statement.html

USE master
GO

ALTER DATABASE <db_name>

SET OFFLINE WITH ROLLBACK IMMEDIATE
...
...
ALTER DATABASE <db_name> SET ONLINE

データベースが移行中の場合は機能しSET OFFLINEません。OPで言及されているのと同じエラーがステートメントで発生します(機能するシナリオもあるかもしれませんが、機能しませんでした)
Abel

1

誰かが私と同じくらい幸運になる場合に備えて、これをここに追加します。

プロセスのsp_who2リストを確認するときは、影響を受けるデータベースだけでなく、masterでも実行されるプロセスに注意してください。私の場合、データベースをブロックしていた問題は、xp_cmdshellを開始したストアドプロシージャに関連していました。

マスターデータベースのKILL / RollBack状態のプロセスがあるかどうかを確認します

SELECT *
FROM sys.sysprocesses
WHERE cmd = 'KILLED/ROLLBACK'

同じ問題がある場合は、KILLコマンドだけではおそらく役に立たないでしょう。SQLサーバーを再起動するか、SQLサーバーOSのWindowsプロセスでcmd.exeを見つけて強制終了することをお勧めします。


0

SQL Management Studioで、[セキュリティ]-> [ログイン]に移動し、ログインをダブルクリックします。左側の列から[サーバーの役割]を選択し、sysadminがオンになっていることを確認します。

私の場合、その権限のないアカウントでログインしていました。

HTH!


1
元の質問のエラーは、あなたがSAの場合にも発生します。あなたの権利とは何の関係もありません。十分な権限がないと、オフラインコマンドを実行できません。
アベル

0

プロセスIDを強制終了するのはうまくいきました。新しいクエリウィンドウで「EXEC sp_who2」コマンドを実行すると、「ビジー」データベースの結果をフィルタリングします。「KILL」コマンドでプロセスを強制終了すると、トリックを実行できます。その後、すべてが再び機能しました。


0

ちょうど私の2セントを追加します。ステートメントを正常に実行するためにdbログインに最低限必要な権限を検索しながら、私も同じ状況にいます。

ALTER DATABASE ... SET SINGLE_USER WITH ROLLBACK IMMEDIATE

sysadminログインで実行した場合、ALTERステートメントは正常に完了したようですが、次のような「限定された」アクセス許可のみを持つログインで実行した場合、接続のクリーンアップ部分が必要です。

ALTER ANY DATABASE

PS私は、dbcreatorロール+ ALTER ANY DATABASE特権を持つログインで実行されたときに「ALTER DATABASE ..」が機能しない理由を解明するために何時間も費やしました。ここに私のMSDNスレッドがあります


0

私はこれが古い投稿であることを知っていますが、最近非常によく似た問題に遭遇しました。残念ながら、排他ロックを設定できなかったため、データベースの変更コマンドを使用できませんでした。しかし、私はデータベースへのオープンな接続を見つけることができませんでした。結局、データベースの正常性状態を強制的に削除して、データベースを回復ではなく強制的に復元状態にする必要がありました。


0

まれなケース(重いトランザクションがコミットされた後など)では、データベースファイルでFILEロックを保持している実行中のCHECKPOINTシステムプロセスが、MULTI_USERモードへの移行を妨げます。


0

私のシナリオでは、sp_who2の下でデータベースをブロックするプロセスはありませんでした。ただし、データベースが他のデータベースよりもはるかに大きいため、保留中のプロセスがまだ実行中であることがわかりました。これが、一時停止したデータベースを右クリックして「データを再開」しようとした後も、可用性グループの下のデータベースが赤/オフラインとして表示されている理由です。

プロセスがまだ実行されているかどうかを確認するには、次のコマンドを実行します。sys.dm_exec_requestsから、percent complete> 0を選択します。percent_complete> 0

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