ข้อผิดพลาด“ ช่วงเวลาหมดเวลาล็อคคำขอเกิน” เมื่อพยายามดูลำดับชั้นฐานข้อมูล


17

ฉันมีปัญหากับฐานข้อมูล

  1. ฉันสามารถเรียกใช้แบบสอบถามพื้นฐานแม้จะช้ากว่าปกติมาก

  2. เมื่อฉันพยายามที่จะดูต้นไม้ลำดับชั้นสำหรับตารางวิวหรือขั้นตอนใน SSMS วัตถุ Explorer lock request time out period exceededฉันได้รับ

  3. รายงาน SSRS ของฉันที่ทำงานกับวัตถุในฐานข้อมูลนี้ไม่เสร็จสมบูรณ์อีกต่อไป

  4. งานที่เกี่ยวข้องกับขั้นตอนการจัดเก็บในฐานข้อมูลนี้ยังไม่ได้ทำงาน

ฉันพยายามใช้sp_who2เพื่อค้นหาและฆ่าการเชื่อมต่อทั้งหมดในฐานข้อมูลอย่างไรก็ตามวิธีนี้ไม่ได้แก้ปัญหา

เกิดขึ้นที่นี่คืออะไร? ฉันจะแก้ไขปัญหานี้ได้อย่างไร


ดูเพิ่มเติมได้ที่: stackoverflow.com/questions/12167570/… ; ไม่แน่ใจว่าสิ่งนั้นนับว่าซ้ำหรือไม่
LittleBobbyTables - Au Revoir

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

3
ดูเหมือนว่าคุณมีธุรกรรมเปิดที่บล็อกการเข้าถึงการอ่านไปยังตาราง
a_horse_with_no_name

คำตอบ:


11

มันเกิดจากการย้อนกลับของธุรกรรม ต้องรีสตาร์ทเซิร์ฟเวอร์คลัสเตอร์ของฉันในที่สุด


2
เริ่มบริการใหม่แก้มันให้ฉัน
HerrimanCoder

การรีสตาร์ทในสถานการณ์เช่นนี้จะนำคุณไปสู่การกู้คืนฐานข้อมูล
MaazKhan47

dbcc opentran จะบอกคุณว่ามีธุรกรรมเปิดอยู่หรือไม่
Nate Anderson

ฉันพบว่ามันแปลกที่ขณะที่ธุรกรรมกำลังทำงานอยู่ฉันไม่สามารถขยายส่วนของตารางได้ ไม่มีข้อมูลที่อ่านไม่มี DDL ไม่มีอะไรเป็นเพียงรายการของตาราง
gerleim

5

ไม่รวมการพิจารณาของ Harware คุณอาจต้องเรียกใช้สคริปต์เพื่อตรวจสอบกิจกรรมที่ระงับเซสชัน SQL หนึ่งในสถานการณ์ทั่วไปที่ไม่ควรใช้Implicit transactions Optionใน SQL Server Management Studio


สวัสดีคุณสามารถดูรายละเอียดเพิ่มเติมเกี่ยวกับสิ่งที่คุณกำลังแนะนำ

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

มองย้อนกลับไปคำถามที่ฉันไม่สามารถพูดได้ว่ามันจะต้องย้อนกลับตลอดเวลาของการทำธุรกรรม ตัดสินlocking request time out period exceedฉันจะบอกว่าการทำงานimplicit transaction optionจะให้เบาะแสของสาเหตุ
Turbot

เครื่องมือ / ตัวเลือก / การดำเนินการสืบค้น / SQL Server / ANSI / SET ธุรกรรมโดย
ปริยาย

3

ฉันพบปัญหานี้เมื่อฉันเริ่มทำธุรกรรมอย่างชัดเจนซึ่งฉันสร้างตารางใน tempdb จากสคริปต์ที่ทำงานในฐานข้อมูลอื่น (ไม่ใช่ tempdb) เมื่อฉันกระทำธุรกรรมดูเหมือนว่าการกระทำดูเหมือนจะไม่ปลดล็อกบนตารางที่ฉันสร้างใน tempdb

ขอบคุณหน้านี้ฉันUSEd tempdb และดำเนินการDBCC OPENTRANและได้ SPID ของการเชื่อมต่อกับ tempdb ที่เป็นสาเหตุของการล็อค จากนั้นฉันKILL <SPID number>จะฆ่ามัน

ไม่สง่างามมากและฉันสูญเสียข้อมูลทั้งหมดในตารางที่ฉันสร้างใน tempdb แต่นั่นก็โอเคในกรณีของฉัน


ในกรณีของเรามีการออกคำสั่ง DML (ดูการกำหนดนิยามใหม่) โดยใช้SET IMPLICIT TRANSACTIONS ONโดยไม่มีCOMMIT TRANSACTIONซึ่งทำให้เกิดการทำธุรกรรมที่ยาวนาน การใช้ DBCC OPENTRAN ช่วยติดตามปัญหานี้อย่างรวดเร็ว
Julio Nobre

1

มีหลายสิ่งหลายอย่างที่เป็นไปได้ที่ฉันสามารถเสนอได้คือคำถามสองสามข้อเพื่อช่วยแนะนำคุณต่อคำตอบ

  1. DB บนเซิร์ฟเวอร์นั้นใช้เพื่อเรียกใช้ SQL Server หรือไม่ ถ้าไม่กระบวนการอื่นอาจรบกวนโดยการขโมยเวลาโปรเซสเซอร์ที่มีค่า

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

  3. แบนด์วิดท์เครือข่ายของเซิร์ฟเวอร์ DB มีขนาดเล็กเพื่อรองรับการถ่ายโอนข้อมูลในเวลาที่เหมาะสมหรือไม่


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

นี่อาจหมายถึงการใช้โปรเซสเซอร์ที่เร็วกว่าไดรฟ์ที่เร็วขึ้นหรือเพียงแค่ติดตั้ง RAM เพิ่มเติม


มันไม่ใช่ปัญหาฮาร์ดแวร์ เซิร์ฟเวอร์คลัสเตอร์โฮสต์หลายฐานข้อมูล นี่เป็นฐานข้อมูลเดียวที่มีปัญหา

@LloydBanks: นั่นไม่ได้หมายความว่านี่ไม่ใช่ปัญหาฮาร์ดแวร์ ถ้าฉันมี 2 ฐานข้อมูลหนึ่งขนาด 20GB พร้อมอัตราการทำธุรกรรมสูงและอีก 1GB ที่มีอัตราการทำธุรกรรมต่ำกว่าฉันคาดหวังว่า 1GB db จะถูกเปลี่ยนเป็นหน่วยความจำเสมือน ซึ่งจะเพิ่มเวลาแบบสอบถาม หากฐานข้อมูลขนาด 20GB ได้รับผลกระทบอย่างหนักอาจทำให้เกิดปัญหาการเชื่อมต่อกับอุปกรณ์ขนาดเล็ก
NotMe

1

"เมื่อฉันพยายามที่จะดูลำดับชั้นต้นไม้สำหรับตารางมุมมองหรือขั้นตอนใน SSMS Object Explorer ฉันได้รับเกินระยะเวลาหมดเวลาล็อคคำขอ"

ฉันมีปัญหาเดียวกัน ฉันไปที่หน้าต่างการดำเนินการค้นหาและ; ROLLBACKคำสั่งที่พิมพ์และดำเนินการ

ดูเหมือนว่าบางชุดของคำสั่งที่ฉันถูกดำเนินการก่อนหน้านั้นที่ถือธุรกรรมเปิด โดยเฉพาะเพราะบางส่วนของพวกเขาที่คำสั่ง DDL เมื่อฉันออกย้อนกลับลำดับชั้นของวัตถุเริ่มทำงาน


0

ตามที่หลายคนชี้ให้เห็นแล้วมักจะมีการทำธุรกรรมที่ยาวนานและส่วนใหญ่ทำให้ฉันพลาดการใช้งาน SET IMPLICIT TRANSACTIONS ซึ่งฉันไม่ควรใช้เลย เพื่อดูว่าทำไมตรวจสอบบทความเชิงลึกของ Brent Ozar

อย่างไรก็ตามคุณสามารถรับรายการธุรกรรมที่ค้างอยู่ได้ยาวนานโดยใช้แบบสอบถามต่อไปนี้

SELECT
    [s_tst].[session_id],
    [s_es].[login_name] AS [Login Name],
    DB_NAME (s_tdt.database_id) AS [Database],
    [s_tdt].[database_transaction_begin_time] AS [Begin Time],
    [s_tdt].[database_transaction_log_bytes_used] AS [Log Bytes],
    [s_tdt].[database_transaction_log_bytes_reserved] AS [Log Rsvd],
    [s_est].text AS [Last T-SQL Text],
    [s_eqp].[query_plan] AS [Last Plan]
FROM
    sys.dm_tran_database_transactions [s_tdt]
JOIN
    sys.dm_tran_session_transactions [s_tst]
ON
    [s_tst].[transaction_id] = [s_tdt].[transaction_id]
JOIN
    sys.[dm_exec_sessions] [s_es]
ON
    [s_es].[session_id] = [s_tst].[session_id]
JOIN
    sys.dm_exec_connections [s_ec]
ON
    [s_ec].[session_id] = [s_tst].[session_id]
LEFT OUTER JOIN
    sys.dm_exec_requests [s_er]
ON
    [s_er].[session_id] = [s_tst].[session_id]
CROSS APPLY
    sys.dm_exec_sql_text ([s_ec].[most_recent_sql_handle]) AS [s_est]
OUTER APPLY
    sys.dm_exec_query_plan ([s_er].[plan_handle]) AS [s_eqp]
where [s_tdt].[database_transaction_begin_time] is not null
ORDER BY
    [Begin Time] ASC;

https://www.brentozar.com/archive/2018/02/set-implicit_transactions-one-hell-bad-idea/

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