เวลารอมากเมื่อออฟไลน์ฐานข้อมูล SQL Server


278

ฉันพยายามทำการบำรุงรักษาออฟไลน์ (กู้คืนฐานข้อมูล dev จากการสำรองข้อมูลสด) ในฐานข้อมูล dev ของฉัน แต่คำสั่ง 'ใช้ออฟไลน์' ผ่าน SQL Server Management Studio ทำงานช้ามาก - ตามลำดับ 30 นาทีและตอนนี้ ฉันใกล้ถึงจุดสิ้นสุดแล้วและฉันไม่สามารถหาข้อมูลอ้างอิงออนไลน์ได้ว่าอะไรเป็นสาเหตุของปัญหาความเร็วหรือวิธีการแก้ไข

บางไซต์แนะนำว่าการเชื่อมต่อแบบเปิดไปยังฐานข้อมูลทำให้การทำงานช้าลง แต่แอปพลิเคชั่นเดียวที่ใช้ฐานข้อมูลนี้คืออินสแตนซ์ IIS ของเครื่อง dev ของฉันและบริการหยุดทำงาน - ไม่มีการเชื่อมต่อที่เปิดอยู่อีกต่อไป

สิ่งที่อาจทำให้เกิดการชะลอตัวนี้และฉันจะทำอย่างไรเพื่อเร่งความเร็ว?

คำตอบ:


408

หลังจากการค้นหาเพิ่มเติม (คำค้นหาใหม่ได้แรงบันดาลใจจากคำตอบของ gbn และความคิดเห็นของ u07ch เกี่ยวกับคำตอบของ KMike) ฉันพบสิ่งนี้ซึ่งเสร็จสมบูรณ์ใน 2 วินาที:

ALTER DATABASE <dbname> SET OFFLINE WITH ROLLBACK IMMEDIATE

(แก้ไข)

เมื่อสิ่งนี้ยังคงล้มเหลวด้วยข้อผิดพลาดต่อไปนี้คุณสามารถแก้ไขได้ตามแรงบันดาลใจจากโพสต์บล็อกนี้ :

การเปลี่ยนแปลงฐานข้อมูลล้มเหลวเนื่องจากไม่สามารถวางการล็อกในฐานข้อมูล 'dbname' ลองอีกครั้งในภายหลัง

คุณสามารถเรียกใช้คำสั่งต่อไปนี้เพื่อค้นหาผู้ที่กำลังล็อกอยู่บนฐานข้อมูลของคุณ:

EXEC sp_who2

และใช้สิ่งที่SPIDคุณพบในคำสั่งต่อไปนี้:

KILL <SPID>

จากนั้นรันALTER DATABASEคำสั่งอีกครั้ง มันควรจะทำงาน


35
ถ้าไม่ทำงาน (ล็อคไม่สามารถวาง) ยังพยายามแก้ปัญหาในstackoverflow.com/questions/4673065
nalply

3
หากกระบวนการ Take DB Offline ยังคงทำงานอยู่สำหรับเครื่อง dev คุณสามารถทำลายมันได้จากตัวจัดการงานและเรียกใช้คำสั่งด้านบน
Null Head

1
หากคุณเรียกใช้คำสั่ง KILL และได้รับข้อความ "ไม่สามารถใช้ KILL เพื่อฆ่ากระบวนการของคุณได้" ตรวจสอบให้แน่ใจว่าคุณกำลังใช้ฐานข้อมูลหลักเพื่อเรียกใช้คำสั่ง
Jarrod

129

มีแนวโน้มมากที่สุดที่การเชื่อมต่อกับฐานข้อมูลจากที่อื่น (ตัวอย่างที่หาได้ยาก: การอัพเดตสถิติแบบอะซิงโครนัส )

เมื่อต้องการค้นหาการเชื่อมต่อใช้sys.sys กระบวนการ

USE master
SELECT * FROM sys.sysprocesses WHERE dbid = DB_ID('MyDB')

หากต้องการบังคับยกเลิกการเชื่อมต่อให้ใช้ROLLBACK ทันที

USE master
ALTER DATABASE MyDB SET SINGLE_USER WITH ROLLBACK IMMEDIATE

7
+1 เนื่องจากแบบสอบถามกระบวนการช่วยให้คุณทราบว่ามีการเชื่อมต่อกับฐานข้อมูลนี้อย่างไร ในกรณีของฉันมันเป็นพนักงานโกงกับ SSMS เปิด :)
MikeMurko

3
ในกรณีของฉันฉันโกงด้วยหน้าต่างตัววิเคราะห์แบบสอบถามเปิด
dellyjm

1
ในกรณีของฉันนักพัฒนามีเว็บไซต์หลักสำหรับการผลิตสำหรับธนาคารที่รู้จักกันดีชี้ไปที่ฐานข้อมูลที่ถูกขัดขวาง OLD
ZZ9

3
หากมีข้อความระบุว่าALTER DATABASE failed because a lock could not be placed on databaseคำสั่งKILL <SPID>จะช่วยให้
Muflix

28

คุณมี Windows Studio จัดการเซิร์ฟเวอร์ SQL ที่เปิดอยู่ซึ่งเชื่อมต่อกับฐานข้อมูลนี้หรือไม่?

วางไว้ในโหมดผู้ใช้คนเดียวแล้วลองอีกครั้ง


2
แก้ไขฐานข้อมูล <DBNAME> ตั้ง SINGLE_USER พร้อมย้อนกลับทันที
u07ch

KMike - การเชื่อมต่อเดียวที่ฉันมีเปิดไปยังฐานข้อมูลหลักไม่ใช่ฐานข้อมูลที่ฉันพยายามจะออฟไลน์
Erik Forbes

17

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


7

ดำเนินการตามขั้นตอนที่เก็บไว้ sp_who2

นี้จะช่วยให้คุณดูว่ามีการล็อคล็อค .. ฆ่าพวกเขาควรแก้ไขหรือไม่


5

ใน SSMS: คลิกขวาที่ไอคอนเซิร์ฟเวอร์ SQL, การตรวจสอบกิจกรรม กระบวนการเปิด ค้นหาการเชื่อมต่อการประมวลผล คลิกขวาที่กระบวนการฆ่า


4

เมื่อใดก็ตามที่คุณพบสิ่งประเภทนี้คุณควรคิดถึงบันทึกธุรกรรมของคุณ stat db แก้ไขด้วยการย้อนกลับทันทีบ่งชี้ว่าเป็นกรณีนี้ ลองดูสิครับ: http://msdn.microsoft.com/en-us/library/ms189085.aspx

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


2
คำแนะนำผู้รอบรู้ - ขอบคุณ - แต่ในกรณีนี้ข้อมูลจะถูกใช้เนื่องจากเป็นฐานข้อมูลการพัฒนาที่ถูกเรียกคืน
Erik Forbes


3

ในกรณีของฉันฉันได้ดูบางตารางในฐานข้อมูลก่อนที่จะดำเนินการนี้ บัญชีผู้ใช้ของฉันมีการเชื่อมต่อกับฐานข้อมูลนี้ใน SSMS เมื่อฉันตัดการเชื่อมต่อจากเซิร์ฟเวอร์ใน SSMS (เปิดกล่องโต้ตอบ 'ใช้ฐานข้อมูลออฟไลน์' ไว้) การดำเนินการเสร็จสมบูรณ์


เหมือนกับฉัน. จากนั้นฉันเชื่อมต่อใหม่เปลี่ยนฐานข้อมูลที่ใช้งานเป็นหลักและเรียกใช้คำสั่งต่อไปนี้: แก้ไขฐานข้อมูล XXX ตั้งค่าออฟไลน์ด้วยการย้อนกลับทันที
cskwg

2

ในการหลีกเลี่ยงสิ่งนี้ฉันได้หยุดเว็บไซต์ที่เชื่อมต่อกับฐานข้อมูลใน IIS และในทันทีแผง 'แช่แข็ง' 'ใช้ฐานข้อมูลแบบออฟไลน์' ก็กลายเป็นไม่จริง


2

ฉันลองคำแนะนำทั้งหมดด้านล่างและไม่มีอะไรทำงาน

  1. EXEC sp_who
  2. ฆ่า <SPID>

  3. แก้ไขฐานข้อมูลชุด SINGLE_USER ด้วยการย้อนกลับทันที

    แก้ไขฐานข้อมูลตั้งค่าออฟไลน์ด้วยการย้อนกลับทันที

    ผลลัพธ์: ทั้งสองคำสั่งข้างต้นก็ติดอยู่เช่นกัน

4. คลิกขวาที่ฐานข้อมูล -> คุณสมบัติ -> ตัวเลือกตั้งค่าฐานข้อมูลแบบอ่านอย่างเดียวเป็น True คลิก 'ใช่' ที่คำเตือนไดอะล็อก SQL Server จะปิดการเชื่อมต่อทั้งหมดกับฐานข้อมูล

ผลลัพธ์: หน้าต่างค้างอยู่ระหว่างการดำเนินการ

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


1

นอกจากนี้ให้ปิดหน้าต่างแบบสอบถามใด ๆ ที่คุณอาจเปิดซึ่งเชื่อมต่อกับฐานข้อมูลที่เป็นปัญหา;)


1

ใน SSMS ให้ตั้งค่าฐานข้อมูลเป็นแบบอ่านอย่างเดียวแล้วย้อนกลับ การเชื่อมต่อจะถูกปิดซึ่งจะเป็นการปลดล็อค

ในกรณีของฉันมีเว็บไซต์ที่เปิดการเชื่อมต่อกับฐานข้อมูล วิธีนี้ง่ายพอ:

  1. คลิกขวาที่ฐานข้อมูล -> คุณสมบัติ -> ตัวเลือก
  2. ตั้งค่าDatabase Read-Onlyเป็น True
  3. คลิก 'ใช่' ที่คำเตือนไดอะล็อก SQL Server จะปิดการเชื่อมต่อทั้งหมดกับฐานข้อมูล
  4. เปิดตัวเลือกใหม่และปิดการอ่านอย่างเดียว
  5. ตอนนี้ลองเปลี่ยนชื่อฐานข้อมูลหรือทำให้ออฟไลน์

0

สำหรับฉันฉันต้องไปที่ Job Activity Monitor และหยุดสองสิ่งที่กำลังประมวลผล จากนั้นมันจะออฟไลน์ทันที ในกรณีของฉันแม้ว่าฉันรู้ว่ากระบวนการทั้งสองนั้นคืออะไรและมันก็โอเคที่จะหยุดพวกเขา


0

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

คุณอาจต้องการตรวจสอบว่าบริการใดกำลังใช้ฐานข้อมูลอยู่หรือไม่


1
รันsp_who2เพื่อดูว่ากระบวนการใดกำลังใช้ฐานข้อมูลและใช้kill <PID>เพื่อหยุดกระบวนการ
Eric Kigathi

0

ครั้งต่อไปจากกล่องโต้ตอบรับแบบออฟไลน์อย่าลืมทำเครื่องหมายที่ช่องทำเครื่องหมาย 'ปล่อยการเชื่อมต่อทั้งหมดที่ใช้งานอยู่' ฉันยังอยู่ใน SQL_EXPRESS บนเครื่องที่ไม่มีการเชื่อมต่อ แต่การชะลอตัวนี้เกิดขึ้นกับฉันเว้นแต่ฉันจะทำเครื่องหมายที่ช่องทำเครื่องหมาย


-1

ในกรณีของฉันฉันหยุดเซิร์ฟเวอร์ Tomcat จากนั้นทันทีฐานข้อมูลก็ออฟไลน์

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