THAY ĐỔI CƠ SỞ thất bại vì không thể đặt khóa trên cơ sở dữ liệu


124

Tôi cần khởi động lại cơ sở dữ liệu vì một số quy trình không hoạt động. Kế hoạch của tôi là đưa nó ngoại tuyến và trở lại trực tuyến một lần nữa.

Tôi đang cố gắng thực hiện điều này trong Sql Server Management Studio 2008:

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

Tôi nhận được những lỗi này:

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.

Tôi đang làm gì sai?


Vấn đề gây ra nhu cầu này ở nơi đầu tiên là gì? Bạn có một số giao dịch quay trở lại tại thời điểm này? Ngoài ra, bạn đã chạy lệnh này trong một cửa sổ SSMS khác vẫn có thể mở chưa? Tôi đang tự hỏi (suy đoán thuần túy) liệu điều đó có thể khóa một khóa chặn các nỗ lực khác hay không nhưng nó vẫn đang chờ trước khi cơ sở dữ liệu thực sự có thể được đưa vào chế độ single_user.
Martin Smith

1
@Martin - đủ công bằng. Tôi phải nghĩ về điều gì khác hoặc mất trí. một trong hai điều này là hoàn toàn có thể xảy ra
codbadger

@ cảm ơn tất cả mọi người, tôi đã khởi động lại SSMS và có thể giết tất cả mọi người
KỸ NĂNG JOE

Có thể là intellisense. Tôi đã xóa một truy vấn không đầy đủ có các dòng nguệch ngoạc cố gắng truy cập cơ sở dữ liệu và sau đó nó hoạt động.
Faahmed

Câu trả lời:


293

Sau khi bạn gặp lỗi, hãy chạy

EXEC sp_who2

Tìm kiếm cơ sở dữ liệu trong danh sách. Có thể kết nối không bị chấm dứt. Nếu bạn tìm thấy bất kỳ kết nối đến cơ sở dữ liệu, hãy chạy

KILL <SPID>

nơi <SPID>là SPID cho phiên khác nhau được kết nối với cơ sở dữ liệu.

Hãy thử tập lệnh của bạn sau khi tất cả các kết nối đến cơ sở dữ liệu bị xóa.

Thật không may, tôi không có lý do tại sao bạn nhìn thấy vấn đề, nhưng đây là một liên kết cho thấy vấn đề đã xảy ra ở nơi khác.

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


Bạn có thể cung cấp bất kỳ lời giải thích nào về lý do tại sao một kết nối sẽ không bị chấm dứt bởi lệnh? Lý do duy nhất tôi có thể nghĩ là nó vẫn đang trong quá trình khôi phục hoặc đó là một set single_usernỗ lực vẫn đang chờ xử lý.
Martin Smith

@Martin, tôi sợ tôi không có lý do cho việc này. Nhưng, tôi sẽ thêm một liên kết chỉ ra rằng những người khác đã nhìn thấy vấn đề. Tôi đồng ý rằng việc khôi phục giao dịch có thể là vấn đề, nhưng KILLcũng không giải quyết được.
bobs

Rất vui để hiểu lý do tại sao điều này xảy ra nhưng các ý kiến ​​về liên kết của bạn dường như cho thấy nó sẽ hoạt động! (+1)
Martin Smith

KILL (87) kết quả trong Msg 102, Level 15, State 1, Line 1 Incorrect syntax near '('.erm ....
Tim Abell

2
@MartinSmith Tôi nghĩ rằng tôi biết tại sao: Tôi cũng gặp vấn đề tương tự, một kết nối kéo dài hiển thị dưới sp_who2 khiến việc ngoại tuyến bị đình trệ. Nó hóa ra là một cửa sổ chỉnh sửa mở cửa sổ trong ssms. Tôi tin rằng những gì xảy ra ở đây là cửa sổ hàng chỉnh sửa là một truy vấn được mở với một tập kết quả có thể chỉnh sửa. SQL Server có một tính năng như là một thay thế để cập nhật báo cáo. Khi đóng cửa sổ ssms cụ thể này, việc treo ngoại tuyến hoàn thành ngay lập tức.
John

5

Tôi quản lý để tái tạo lỗi này bằng cách làm như sau.

Kết nối 1 (để lại một vài phút)

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

Kết nối 2 và 3

set lock_timeout 5;

ALTER DATABASE TESTING123 SET SINGLE_USER WITH ROLLBACK IMMEDIATE;

2

Hãy thử điều này nếu nó "đang trong quá trình chuyển đổi" ...

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

Sẽ không hoạt động khi cơ sở dữ liệu đang trong quá trình chuyển đổi, bạn sẽ gặp lỗi tương tự với SET OFFLINEcâu lệnh như OP đã đề cập (có thể có các kịch bản hoạt động, nhưng nó không phù hợp với tôi)
Abel

1

Tôi sẽ thêm điều này ở đây trong trường hợp ai đó sẽ may mắn như tôi.

Khi xem xét danh sách các quy trình sp_who2 lưu ý các quy trình chạy không chỉ cho cơ sở dữ liệu bị ảnh hưởng mà còn cho chủ . Trong trường hợp của tôi, sự cố chặn cơ sở dữ liệu có liên quan đến một thủ tục được lưu trữ bắt đầu xp_cmdshell.

Kiểm tra xem bạn có bất kỳ quy trình trong KILL / Rollback nhà nước đối với chủ cơ sở dữ liệu

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

Nếu bạn có cùng một vấn đề, chỉ có thể lệnh KILL sẽ không giúp được gì. Bạn có thể khởi động lại máy chủ SQL hoặc cách tốt hơn là tìm cmd.exe trong các tiến trình windows trên hệ điều hành máy chủ SQL và tiêu diệt nó.


0

Trong SQL Management Studio, đi đến Bảo mật -> Đăng nhập và nhấp đúp vào Đăng nhập của bạn. Chọn Vai trò Máy chủ từ cột bên trái và xác minh rằng sysadmin đã được chọn.

Trong trường hợp của tôi, tôi đã đăng nhập vào một tài khoản mà không có đặc quyền đó.

HTH!


1
Lỗi trong câu hỏi ban đầu cũng xảy ra khi bạn SA, nó không liên quan gì đến quyền lợi của bạn. Nếu bạn không có đủ quyền, bạn sẽ không thể thực thi lệnh ngoại tuyến.
Abel

0

Giết ID quá trình làm việc tốt cho tôi. Khi chạy "EXEC sp_who2" Lệnh qua cửa sổ truy vấn mới ... và lọc kết quả cho cơ sở dữ liệu "bận", Giết các quy trình bằng lệnh "KILL" được quản lý để thực hiện thủ thuật. Sau đó tất cả hoạt động trở lại.


0

Chỉ cần thêm hai xu của tôi. Tôi đã đặt mình vào tình huống tương tự, trong khi tìm kiếm các đặc quyền bắt buộc tối thiểu của thông tin đăng nhập db để chạy thành công câu lệnh:

ALTER DATABASE ... SET SINGLE_USER WITH ROLLBACK IMMEDIATE

Có vẻ như câu lệnh ALTER hoàn thành thành công , khi được thực hiện bằng thông tin đăng nhập sysadmin , nhưng nó yêu cầu phần dọn dẹp kết nối, khi được thực hiện theo thông tin đăng nhập có "quyền" chỉ giới hạn như:

ALTER ANY DATABASE

PS Tôi đã dành hàng giờ cố gắng để tìm hiểu lý do tại sao "ALTER DATABASE .." không hoạt động khi được thực thi theo thông tin đăng nhập có vai trò dbcreator + THAY ĐỔI BẤT K Đặc quyền nào. Đây là chủ đề MSDN của tôi !


0

Tôi biết đây là một bài viết cũ nhưng gần đây tôi gặp phải một vấn đề rất giống nhau. Thật không may, tôi không thể sử dụng bất kỳ lệnh thay đổi cơ sở dữ liệu nào vì không thể đặt khóa độc quyền. Nhưng tôi không bao giờ có thể tìm thấy một kết nối mở với db. Cuối cùng tôi đã phải xóa mạnh mẽ trạng thái sức khỏe của cơ sở dữ liệu để buộc nó vào trạng thái khôi phục thay vì khôi phục.


0

Trong các trường hợp hiếm hoi (ví dụ: sau khi giao dịch nặng được thực hiện), quy trình hệ thống CHECKPOINT đang chạy giữ khóa FILE trên tệp cơ sở dữ liệu sẽ ngăn chuyển sang chế độ MULTI_USER.


0

Trong kịch bản của tôi, không có quá trình chặn cơ sở dữ liệu theo sp_who2. Tuy nhiên, chúng tôi đã phát hiện ra vì cơ sở dữ liệu lớn hơn nhiều so với các cơ sở dữ liệu khác của chúng tôi mà các quy trình đang chờ xử lý vẫn đang chạy, đó là lý do tại sao cơ sở dữ liệu trong nhóm khả dụng vẫn hiển thị màu đỏ / ngoại tuyến sau khi chúng tôi cố gắng 'tiếp tục dữ liệu' khi nhấp chuột phải vào cơ sở dữ liệu bị tạm dừng.

Để kiểm tra xem bạn có còn chạy các quy trình hay không, chỉ cần thực hiện lệnh này: chọn phần trăm hoàn thành từ sys.dm_exec_Vquests trong đó Perc_complete> 0

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.