งานติดค้างในสตูดิโอการจัดการคุณจัดการกับพวกเขาอย่างไร


13

หลังจากคลิกที่ "ใช้ฐานข้อมูลออฟไลน์" ในสตูดิโอการจัดการข้อความนี้จะยังคงอยู่และจะไม่ปิดถ้าคุณคลิกที่ปิด

https://i.imgur.com/KD6AROv.png

เป็นวิธีที่ดีในการจัดการกับงานค้างเช่นนี้ในสตูดิโอการจัดการอะไร คุณสามารถฆ่าพวกเขาผ่านการตรวจสอบกิจกรรมได้หรือไม่? ฉันควรหากระบวนการที่จะหยุดงานนี้จากการผ่านและยุติมันได้หรือไม่


4
ค้นหาสิ่งที่ปิดกั้นก่อน คุณสามารถรับข้อมูลนี้ได้จาก sys.dm_exec_requests นอกจากนี้งานของคุณสามารถทำสิ่งนี้ในแบบที่มันไม่ถูกบล็อกเช่นโดยการออกALTER DATABASE foo SET SINGLE_USER WITH ROLLBACK IMMEDIATE;ก่อน ... ไม่อย่างนั้นมันจะนั่งรอและสำหรับฐานข้อมูลที่ไม่ว่างนั่นอาจจะเป็นตลอดไป
Aaron Bertrand

การตั้งค่าฐานข้อมูลใน single_user แก้ไขปัญหาได้ฉันควรจะเดาได้ ... SQLserver ต้องการ single_user สำหรับสิ่งประเภทนี้เสมอ
A_V

คำตอบ:


13

ฉันจะบอกว่าไม่เคยใช้สิ่ง "ใช้ออฟไลน์" ใน GUI เว้นแต่คุณจะทราบว่าฐานข้อมูลไม่ได้ใช้งาน โดยอะไรก็ได้ นั่นเป็นเรื่องยากที่จะทราบโดยไม่ต้องทำตามกฎหมายดังนั้นทำไมไม่บันทึกสคริปต์นี้ไว้ที่อื่นและใช้มันตลอดเวลา?

USE [master];
GO
ALTER DATABASE $dbname$ SET SINGLE_USER WITH ROLLBACK IMMEDIATE;
GO
ALTER DATABASE $dbname$ SET OFFLINE;

แล้วแน่นอนซึ่งกันและกัน:

ALTER DATABASE $dbname$ SET ONLINE;
GO
ALTER DATABASE $dbname$ SET MULTI_USER;

เหตุผลที่คุณจำเป็นต้องตั้งค่าเป็นSINGLE_USERอันดับแรกคือการเตะผู้ใช้ที่มีอยู่ใด ๆ (มีตัวเลือกให้ทำในกล่องโต้ตอบแยกออก แต่ไม่ใช่กล่องโต้ตอบออฟไลน์แบบออฟไลน์) เนื่องจาก SQL Server ต้องการการเข้าถึงฐานข้อมูลแบบเอกสิทธิ์เฉพาะบุคคล มันออฟไลน์ ทีนี้คุณอาจต้องการทำงานพิเศษเพิ่มเติมเพื่อดูว่าใครกำลังใช้ฐานข้อมูลอยู่ราวกับว่าคุณทำสิ่งนี้ในระหว่างการสำรองข้อมูลขนาดใหญ่หรืองาน ETL หรือสิ่งที่มีในตัวคุณซึ่งอาจเป็นปัญหา

แก้ไข : ฉันได้ยื่นคำแนะนำเกี่ยวกับการเชื่อมต่อเกี่ยวกับเรื่องนี้ (ดูเชื่อมต่อ # 2687832 ) และได้โพสต์ไว้ในTrello (ยื่นใต้ "Object Explorer")


และถ้าตั้งค่าผู้ใช้คนเดียวก็ล้มเหลวเพราะไม่สามารถล็อคฐานข้อมูลได้?
StackOverthrow

@ user560822 คุณจะต้องรอจนกว่าคุณจะได้ล็อคในฐานข้อมูล ถ้านั่นหมายความว่าคุณต้องเริ่มต้นการฆ่า ...
Aaron Bertrand

9

เมื่อคุณอยู่ในสถานการณ์หยุดทำงานอย่าลืมว่าคุณสามารถค้นหาการเชื่อมต่อที่เปิดอยู่ทั่วเซิร์ฟเวอร์ด้วย

sp_who2  

ในฐานข้อมูลอื่นเช่นต้นแบบ
สแกนผลลัพธ์เพื่อหาว่าฐานข้อมูลใดเป็นฐานข้อมูลที่คุณพยายามออฟไลน์
บันทึกค่าคอลัมน์ spid (id กระบวนการ) ของแถวเหล่านั้น

ครั้งละหนึ่งวิ่ง

kill  ##

โดยที่ "##" คือสปิด

แน่นอนว่าต้องระมัดระวังเพื่อให้แน่ใจว่ากระบวนการเหล่านั้นไม่ได้มีความสำคัญต่อการรัน ... กระบวนการเหล่านั้นจะถูกยกเลิกโดยไม่ต้องทำคำสั่งล่าสุดและไม่มีการเตือนล่วงหน้า


1
คำตอบที่ยอมรับไม่ได้ทำเคล็ดลับสำหรับฉัน ล้มเหลวในคำสั่งแรก คำตอบนี้ทำงานได้อย่างสมบูรณ์ ขอบคุณ
Cheburek

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