ALTER DATABASE gagal karena kunci tidak dapat ditempatkan pada basis data

124

Saya perlu me-restart database karena beberapa proses tidak berfungsi. Rencana saya adalah untuk membuatnya offline dan kembali online lagi.

Saya mencoba melakukan ini di Sql Server Management Studio 2008:

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

Saya mendapatkan kesalahan ini:

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.

Apa yang saya lakukan salah?

JOE SKEET
sumber
Apa masalah yang menyebabkan kebutuhan ini pada awalnya? Apakah Anda memiliki beberapa transaksi rolling kembali saat ini? Anda juga sudah menjalankan perintah ini di jendela SSMS lain yang mungkin masih terbuka? Saya bertanya-tanya (spekulasi murni) apakah itu mungkin mengambil kunci yang memblokir upaya lain tetapi masih menunggu sebelum database benar-benar dapat dimasukkan ke dalam mode single_user.
Martin Smith
1
@ Martin - cukup adil. Saya harus memikirkan hal lain atau kehilangan akal. salah satunya sangat mungkin
codingbadger
@ terima kasih banyak semuanya, saya memulai kembali SSMS dan dapat membunuh semua orang
JOE SKEET
Bisa jadi kecerdasan. Saya menghapus kueri yang tidak lengkap yang memiliki garis berlekuk-lekuk mencoba mengakses database dan kemudian berhasil.
Faahmed

Jawaban:

293

Setelah Anda mendapatkan kesalahan, jalankan

EXEC sp_who2

Cari basis data dalam daftar. Mungkin saja koneksi tidak terputus. Jika Anda menemukan koneksi ke database, jalankan

KILL <SPID>

di mana <SPID>SPID untuk sesi yang terhubung ke database.

Coba skrip Anda setelah semua koneksi ke database dihapus.

Sayangnya, saya tidak memiliki alasan mengapa Anda melihat masalah, tetapi di sini ada tautan yang menunjukkan bahwa masalah tersebut telah terjadi di tempat lain.

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

bobs
sumber
Bisakah Anda memberikan penjelasan mengapa koneksi tidak diakhiri oleh perintah? Satu-satunya alasan yang dapat saya pikirkan adalah bahwa itu masih dalam proses memutar kembali atau itu adalah set single_userupaya yang masih tertunda.
Martin Smith
@ Martin, saya khawatir saya tidak punya alasan untuk ini. Tapi, saya akan menambahkan tautan yang menunjukkan bahwa orang lain telah melihat masalahnya. Saya setuju bahwa kembalikan transaksi bisa menjadi masalah, tetapi KILLtidak akan menyelesaikannya juga.
Bobs
Bersikaplah baik untuk memahami mengapa ini terjadi tetapi komentar pada tautan Anda sepertinya mengindikasikan itu akan berhasil! (+1)
Martin Smith
KILL (87) menghasilkan Msg 102, Level 15, State 1, Line 1 Incorrect syntax near '('.erm ....
Tim Abell
2
@ MartinSmith Saya rasa saya tahu mengapa: Saya hanya punya masalah yang sama, koneksi yang tersisa muncul di bawah sp_who2 menyebabkan pengambilan offline terhenti. Ternyata menjadi baris pengeditan terbuka jendela di ssms. Saya percaya apa yang terjadi di sini adalah bahwa jendela baris pengeditan adalah kueri yang dibuka dengan set hasil yang dapat diedit. SQL Server memiliki fitur seperti itu sebagai alternatif untuk memperbarui pernyataan. Pada saat menutup jendela ssms tertentu ini, pengambilan secara offline selesai dengan segera.
John
5

Saya berhasil mereproduksi kesalahan ini dengan melakukan hal berikut.

Koneksi 1 (biarkan berjalan selama beberapa menit)

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

Koneksi 2 dan 3

set lock_timeout 5;

ALTER DATABASE TESTING123 SET SINGLE_USER WITH ROLLBACK IMMEDIATE;
Martin Smith
sumber
2

Coba ini jika "dalam masa transisi" ...

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
Watki02
sumber
Tidak akan berfungsi ketika database sedang dalam transisi, Anda akan mendapatkan kesalahan yang sama dengan SET OFFLINEpernyataan yang disebutkan oleh OP (mungkin ada skenario di mana ia bekerja, tetapi tidak untuk saya)
Abel
1

Saya akan menambahkan ini di sini jika seseorang akan seberuntung saya.

Saat meninjau daftar proses sp_who2 perhatikan proses yang berjalan tidak hanya untuk database yang terpengaruh tetapi juga untuk master . Dalam kasus saya, masalah yang memblokir basis data terkait dengan prosedur tersimpan yang memulai xp_cmdshell.

Periksa apakah Anda memiliki proses dalam status KILL / RollBack untuk database master

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

Jika Anda memiliki masalah yang sama, hanya perintah KILL mungkin tidak akan membantu. Anda dapat me-restart SQL server, atau cara yang lebih baik adalah dengan menemukan cmd.exe di bawah proses windows pada SQL server OS dan membunuhnya.

Alina
sumber
0

Di SQL Management Studio, buka Keamanan -> Login dan klik dua kali Login Anda. Pilih Peran Server dari kolom kiri, dan verifikasi bahwa sysadmin dicentang.

Dalam kasus saya, saya login di akun tanpa hak istimewa itu.

HTH!

Marty
sumber
1
Kesalahan dalam pertanyaan awal juga terjadi ketika Anda SA, itu tidak ada hubungannya dengan hak-hak Anda. Jika Anda tidak memiliki hak yang cukup, Anda tidak akan dapat menjalankan perintah offline.
Abel
0

Membunuh ID proses bekerja dengan baik untuk saya. Saat menjalankan "EXEC sp_who2" Perintah di jendela permintaan baru ... dan saring hasil untuk database "sibuk", Membunuh proses dengan perintah "KILL" berhasil melakukan trik. Setelah itu semua bekerja kembali.

pengguna3749524
sumber
0

Hanya untuk menambahkan dua sen saya. Saya telah menempatkan diri saya dalam situasi yang sama, sambil mencari hak minimum yang diperlukan untuk login db agar berhasil menjalankan pernyataan:

ALTER DATABASE ... SET SINGLE_USER WITH ROLLBACK IMMEDIATE

Tampaknya pernyataan ALTER berhasil diselesaikan , ketika dieksekusi dengan login sysadmin , tetapi membutuhkan bagian pembersihan koneksi, ketika dieksekusi di bawah login yang memiliki "hanya" izin terbatas seperti:

ALTER ANY DATABASE

PS Saya menghabiskan waktu berjam-jam untuk mencari tahu mengapa "ALTER DATABASE .." tidak berfungsi ketika dijalankan di bawah login yang memiliki peran dbcreator + ALTER SETIAP hak istimewa DATABASE . Inilah utas MSDN saya !

Veselin Z.
sumber
0

Saya tahu ini adalah posting lama tapi baru-baru ini saya mengalami masalah yang sangat mirip. Sayangnya saya tidak dapat menggunakan perintah alter database apa pun karena kunci eksklusif tidak dapat ditempatkan. Tetapi saya tidak pernah dapat menemukan koneksi terbuka ke db. Saya akhirnya harus secara paksa menghapus status kesehatan dari database untuk memaksanya ke kondisi pemulihan alih-alih dalam pemulihan.

Geoff Dawdy
sumber
0

Dalam kasus yang jarang terjadi (mis., Setelah transaksi besar dilakukan) proses sistem CHECKPOINT yang berjalan menahan kunci FILE pada file database mencegah transisi ke mode MULTI_USER.

mitix
sumber
0

Dalam skenario saya, tidak ada proses memblokir database di bawah sp_who2. Namun, kami menemukan karena basis data jauh lebih besar daripada basis data kami yang lain bahwa proses yang tertunda masih berjalan itulah sebabnya basis data di bawah grup ketersediaan masih ditampilkan sebagai merah / luring setelah kami mencoba untuk 'melanjutkan data' dengan mengklik kanan pada database yang dijeda.

Untuk memeriksa apakah Anda masih memiliki proses yang berjalan, jalankan saja perintah ini: pilih persen selesai dari sys.dm_exec_requests di mana persen_lengkapi> 0

pengguna123456789
sumber