การแก้ไขฐานข้อมูลล้มเหลวเนื่องจากไม่สามารถวางล็อกบนฐานข้อมูลได้


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

อาจเป็น intellisense ฉันลบข้อความค้นหาที่ไม่สมบูรณ์ซึ่งมีบรรทัดที่ไม่สมบูรณ์พยายามเข้าถึงฐานข้อมูลและจากนั้นก็ใช้งานได้
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)
Martin Smith

KILL (87) ผลลัพธ์ในMsg 102, Level 15, State 1, Line 1 Incorrect syntax near '('.erm ....
Tim Abell

2
@MartinSmith ฉันคิดว่าฉันรู้ว่าทำไม: ฉันเพิ่งมีปัญหาเดียวกันการเชื่อมต่อที่ค้างอยู่ปรากฏขึ้นภายใต้ sp_who2 ทำให้การออฟไลน์หยุดชะงัก มันกลายเป็นการเปิดหน้าต่างแก้ไขแถวใน ssms ฉันเชื่อว่าสิ่งที่เกิดขึ้นที่นี่คือหน้าต่างแถวการแก้ไขเป็นแบบสอบถามที่เปิดค้างไว้พร้อมชุดผลลัพธ์ที่แก้ไขได้ SQL Server มีคุณสมบัติดังกล่าวเป็นทางเลือกในการปรับปรุงคำสั่ง ในการปิดหน้าต่าง ssms โดยเฉพาะนี้การแขวนที่ออฟไลน์จะเสร็จสิ้นทันที
John

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ของกระบวนการโปรดสังเกตว่ากระบวนการที่รันไม่เพียง แต่สำหรับฐานข้อมูลที่ได้รับผลกระทบเท่านั้น แต่ยังรวมถึงมาสเตอร์ด้วย ในกรณีของฉันปัญหาที่บล็อกฐานข้อมูลเกี่ยวข้องกับขั้นตอนการจัดเก็บที่เริ่มต้น xp_cmdshell

ตรวจสอบว่าคุณมีกระบวนการใด ๆ ในสถานะKILL / RollBackสำหรับฐานข้อมูลหลักหรือไม่

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

หากคุณมีปัญหาเดียวกันแค่คำสั่ง KILL ก็อาจไม่ช่วยได้ คุณสามารถรีสตาร์ทเซิร์ฟเวอร์ SQL หรือวิธีที่ดีกว่าคือค้นหา cmd.exe ภายใต้กระบวนการของ windows บนระบบปฏิบัติการเซิร์ฟเวอร์ SQL และฆ่ามัน


0

ใน SQL Management Studio ไปที่ Security -> Logins แล้วดับเบิลคลิกที่ Login เลือกบทบาทเซิร์ฟเวอร์จากคอลัมน์ด้านซ้ายและตรวจสอบว่ามีการตรวจสอบ sysadmin

ในกรณีของฉันฉันลงชื่อเข้าใช้ด้วยบัญชีที่ไม่มีสิทธิ์นั้น

HTH!


1
ข้อผิดพลาดในคำถามเดิมยังเกิดขึ้นเมื่อคุณเป็น SA ซึ่งไม่มีส่วนเกี่ยวข้องกับสิทธิ์ของคุณ หากคุณไม่มีสิทธิ์เพียงพอคุณจะไม่สามารถดำเนินการคำสั่งออฟไลน์ได้
Abel

0

การฆ่า ID กระบวนการทำงานได้ดีสำหรับฉัน เมื่อเรียกใช้คำสั่ง "EXEC sp_who2" ในหน้าต่างแบบสอบถามใหม่ ... และกรองผลลัพธ์สำหรับฐานข้อมูล "ไม่ว่าง" การฆ่ากระบวนการด้วยคำสั่ง "KILL" จะจัดการเพื่อทำเคล็ดลับ หลังจากนั้นทั้งหมดก็ทำงานอีกครั้ง


0

เพียงแค่เพิ่มสองเซ็นต์ของฉัน ฉันได้ทำให้ตัวเองตกอยู่ในสถานการณ์เดียวกันในขณะที่ค้นหาสิทธิ์ขั้นต่ำที่จำเป็นของการเข้าสู่ระบบ db เพื่อเรียกใช้คำสั่งให้สำเร็จ:

ALTER DATABASE ... SET SINGLE_USER WITH ROLLBACK IMMEDIATE

ดูเหมือนว่าการเปลี่ยนแปลงคำสั่งเสร็จเรียบร้อยแล้วเมื่อดำเนินการกับดูแลระบบเข้าสู่ระบบ แต่ต้องเป็นส่วนหนึ่งของการเชื่อมต่อการทำความสะอาดเมื่อดำเนินการภายใต้การเข้าสู่ระบบซึ่งมี "เท่านั้น" สิทธิ์ที่ จำกัด เช่น:

ALTER ANY DATABASE

ป.ล. ฉันใช้เวลาหลายชั่วโมงในการพยายามหาสาเหตุว่าทำไม "แก้ไขฐานข้อมูล .. " ไม่ทำงานเมื่อดำเนินการภายใต้การเข้าสู่ระบบที่มีบทบาท dbcreator + แก้ไขสิทธิ์ของฐานข้อมูลใด ๆ นี่คือหัวข้อ MSDNของฉัน!


0

ฉันรู้ว่านี่เป็นโพสต์เก่า แต่ฉันเพิ่งพบปัญหาที่คล้ายกันมาก น่าเสียดายที่ฉันไม่สามารถใช้คำสั่งเปลี่ยนแปลงฐานข้อมูลใด ๆ ได้เนื่องจากไม่สามารถวางล็อกพิเศษได้ แต่ฉันไม่พบการเชื่อมต่อแบบเปิดกับฐานข้อมูล ในที่สุดฉันก็ต้องลบสถานะสุขภาพของฐานข้อมูลอย่างจริงจังเพื่อบังคับให้เข้าสู่สถานะการกู้คืนแทนที่จะอยู่ในการกู้คืน


0

ในบางกรณีที่เกิดขึ้นไม่บ่อยนัก (เช่นหลังจากที่มีการทำธุรกรรมจำนวนมาก) กระบวนการของระบบ CHECKPOINT ที่กำลังทำงานอยู่โดยมีการล็อก FILE บนไฟล์ฐานข้อมูลจะป้องกันไม่ให้เปลี่ยนไปใช้โหมด MULTI_USER


0

ในสถานการณ์ของฉันไม่มีกระบวนการใดที่บล็อกฐานข้อมูลภายใต้ sp_who2 อย่างไรก็ตามเราค้นพบเนื่องจากฐานข้อมูลมีขนาดใหญ่กว่าฐานข้อมูลอื่น ๆ ของเราซึ่งกระบวนการที่รอดำเนินการยังคงทำงานอยู่ซึ่งเป็นสาเหตุที่ฐานข้อมูลภายใต้กลุ่มความพร้อมใช้งานยังคงแสดงเป็นสีแดง / ออฟไลน์หลังจากที่เราพยายาม 'ดำเนินการต่อข้อมูล' โดยคลิกขวาที่ฐานข้อมูลที่หยุดชั่วคราว

หากต้องการตรวจสอบว่าคุณยังมีกระบวนการทำงานอยู่หรือไม่เพียงแค่รันคำสั่งนี้: เลือกเปอร์เซ็นต์ที่สมบูรณ์จาก sys.dm_exec_requests โดยที่ percent_complete> 0

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.