web-dev-qa-db-ja.com

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

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

私は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.

何が間違っていますか?

123
JOE SKEET

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

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/

284
bobs

次の操作を行うことで、このエラーを再現できました。

接続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;
5
Martin Smith

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

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
2
Watki02

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

0
Geoff Dawdy

私の2セントを追加するだけです。ステートメントを正常に実行するために、dbログインに最低限必要な特権を検索しながら、私は同じ状況に身を置いています。

ALTER DATABASE ... SET SINGLE_USER WITH ROLLBACK IMMEDIATE

ALTERステートメントは、sysadminログインで実行するとに正常に完了するようですが、実行時には接続のクリーンアップ部分が必要です次のような「のみ」制限された権限を持つログインの下で:

ALTER ANY DATABASE

追伸dbcreatorロール+ ALTER ANY DATABASE権限を持つログインで「ALTER DATABASE ..」を実行するとなぜ機能しないのかを解明するために何時間も費やしました。ここに私の MSDNスレッド

0
Veselin Z.

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

0
mitix

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

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

0
user123456789

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

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

HTH!

0
Marty

誰かが私のように幸運になる場合に備えて、これをここに追加します。

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

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

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

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

0
Alina

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

0
user3749524