Đã hết thời gian yêu cầu khóa khóa vượt quá lỗi Lỗi khi cố gắng xem phân cấp DB


17

Tôi đang gặp vấn đề với cơ sở dữ liệu.

  1. Tôi có thể chạy các truy vấn cơ bản, mặc dù chậm hơn nhiều so với bình thường.

  2. Khi tôi cố gắng xem các cây phân cấp cho các bảng, dạng xem hoặc thủ tục trong SSMS Object Explorer, tôi nhận được lock request time out period exceeded.

  3. Báo cáo SSRS của tôi chạy trên các đối tượng trong cơ sở dữ liệu này không còn hoàn thành.

  4. Các công việc liên quan đến các thủ tục được lưu trữ trên cơ sở dữ liệu này cũng không chạy.

Tôi đã thử sử dụng sp_who2để tìm và hủy tất cả các kết nối trên cơ sở dữ liệu, tuy nhiên điều này vẫn chưa giải quyết được vấn đề.

Chuyện gì đang xảy ra ở đây? Làm thế nào tôi có thể giải quyết điều này?


Xem thêm: stackoverflow.com/questions/12167570/... ; không chắc chắn nếu điều đó được tính là trùng lặp hay không.
LittleBulkTables

Dựa trên nhận xét của bạn cho câu trả lời của tôi dưới đây, tôi nghĩ bạn cần cung cấp thêm nhiều thông tin. Máy chủ có kích thước như thế nào, bạn đã xem bộ đếm hiệu suất của nó chưa, nó có được hoán đổi sang đĩa hoặc tài nguyên bị bỏ đói theo một cách nào đó. Hãy chắc chắn để thực sự kiểm tra ở trên và không chỉ giả định bất cứ điều gì. Hơn nữa, điều này xảy ra khi bạn kết nối trong khi từ xa vào máy tính để bàn? Có phải vấn đề chỉ xảy ra khi truy cập từ một vị trí duy nhất? Thời tiết mạng như thế nào đối với máy chủ đó (và kết nối của bạn với nó)?
NotMe

3
Âm thanh như bạn có các giao dịch mở đang chặn quyền truy cập đọc vào các bảng.
a_horse_with_no_name

Câu trả lời:


11

Nó đã được gây ra bởi một rollback vĩnh viễn của một giao dịch. Cuối cùng phải khởi động lại cụm máy chủ của tôi


2
Khởi động lại dịch vụ đã giải quyết nó cho tôi.
HerrimanCoder

Khởi động lại trong tình huống như vậy có thể dẫn bạn đến Phục hồi cơ sở dữ liệu
MaazKhan47

dbcc opentran sẽ cho bạn biết nếu có giao dịch mở
Nate Anderson

Tôi thấy kỳ lạ là trong khi một giao dịch đang chạy, tôi không thể mở rộng phần bảng chẳng hạn. Không đọc dữ liệu, không DDL, không có gì, chỉ có danh sách các bảng.
gerleim

5

Không bao gồm việc xem xét Harware, có lẽ bạn cần chạy tập lệnh để kiểm tra xem hoạt động nào giữ lại Phiên SQL, một trong những tình huống phổ biến là không sử dụng Implicit transactions OptionSQL Studio Management Studio.


Xin chào Turbot, bạn có thể đi vào chi tiết hơn về những gì bạn đang đề xuất không?

Có vẻ như trong khi điều này không được giải thích đầy đủ, nó có thể là một câu trả lời tốt hơn, việc khôi phục vĩnh viễn các giao dịch không quay trở lại và chỉ được kích hoạt do các giao dịch ngầm.
ConstantineK

nhìn lại câu hỏi tôi không thể nói đó phải là sự quay vòng vĩnh viễn của một giao dịch. Đánh giá locking request time out period exceedtôi sẽ nói chạy implicit transaction optionsẽ cho manh mối tốt hơn về nguyên nhân.
Turbot

Công cụ / Tùy chọn / Thực thi truy vấn / Máy chủ SQL / ANSI / THIẾT LẬP GIAO DỊCH IMPLICIT
Tadej

3

Tôi gặp vấn đề này khi tôi bắt đầu một giao dịch rõ ràng trong đó tôi đã tạo một bảng trong tempdb từ một tập lệnh chạy trong cơ sở dữ liệu khác (không phải tempdb). Khi tôi thực hiện giao dịch, cam kết dường như không giải phóng khóa trên bảng tôi đã tạo trong tempdb.

Nhờ trang này , tôi đã USEtempdb và thực thi DBCC OPENTRANvà nhận được SPID của kết nối đến tempdb gây ra khóa. Sau đó, tôi KILL <SPID number>để giết nó.

Không duyên dáng lắm, và tôi đã mất tất cả thông tin trong bảng mà tôi đã tạo trong tempdb, nhưng trong trường hợp của tôi thì không sao.


Trong trường hợp của chúng tôi, một lệnh DML (xem xác định lại) đã được ban hành cơ sở dữ liệu đơn giản bằng cách sử dụng THIẾT LẬP GIAO DỊCH TUYỆT VỜI mà không cần GIAO DỊCH GIAO DỊCH , điều này vô tình gây ra một giao dịch kéo dài. Sử dụng DBCC OPENTRAN đã giúp nhanh chóng theo dõi vấn đề này.
Julio Nobre

1

Có rất nhiều điều có thể là tất cả những gì tôi có thể cung cấp là một vài câu hỏi để giúp hướng dẫn bạn hướng tới câu trả lời.

  1. Là DB trên một máy chủ dành riêng cho chỉ chạy SQL Server? Nếu không, các quy trình khác có thể bị can thiệp bằng cách đánh cắp thời gian của bộ xử lý quý giá.

  2. Là máy chủ DB về cơ bản hết bộ nhớ? SQL Server sẽ cố gắng phân bổ từng byte đơn lẻ, nhưng nếu nó có dung lượng và các truy vấn của bạn yêu cầu tải nhiều dữ liệu hơn thì nó phải chuyển sang sử dụng bộ nhớ ảo, điều này làm tăng đáng kể thời gian mà ngay cả các truy vấn đơn giản cũng có thể mất.

  3. Băng thông mạng của máy chủ DB có nhỏ để xử lý việc truyền dữ liệu kịp thời không?


Vào cuối ngày, có vẻ như máy bạn đang lưu trữ SQL Server trên có kích thước nhỏ cho những gì bạn đang cố gắng thực hiện. Hoàn toàn có thể là bạn cuối cùng đã đạt đến những giới hạn phần cứng trong đó hiệu suất giảm dần. Nếu đây là trường hợp (các câu hỏi trên sẽ giúp bạn xác định điều đó) thì bạn sẽ muốn chuyển DB sang một máy chủ có kích thước phù hợp với lượng dữ liệu (và truy vấn) mà bạn đang cố xử lý.

Điều này có thể có nghĩa là sử dụng bộ xử lý nhanh hơn, ổ đĩa nhanh hơn hoặc chỉ cài đặt thêm RAM.


Đây không phải là vấn đề phần cứng. Cụm máy chủ lưu trữ nhiều cơ sở dữ liệu. Đây là cơ sở dữ liệu duy nhất có vấn đề

@LloydBanks: Điều đó không có nghĩa đây không phải là vấn đề về phần cứng. Nếu tôi có 2 cơ sở dữ liệu, một cơ sở có dung lượng 20 GB với tỷ lệ giao dịch cao và một cơ sở dữ liệu khác có dung lượng giao dịch thấp hơn thì tôi mong muốn 1GB db sẽ được hoán đổi sang bộ nhớ ảo; mà sẽ tăng thời gian truy vấn. Nếu db 20GB bị ảnh hưởng đủ mạnh, điều này có thể dẫn đến các vấn đề kết nối với cái nhỏ hơn.
NotMe

1

"Khi tôi cố gắng xem các cây phân cấp cho các bảng, dạng xem hoặc thủ tục trong SSMS Object Explorer, tôi đã vượt quá thời gian yêu cầu khóa."

Tôi đã có vấn đề chính xác như vậy. Tôi đã đi đến cửa sổ thực hiện truy vấn và; đánh máy và thực hiện ROLLBACKcâu lệnh.

Có vẻ như một số loạt các báo cáo tôi đã thực hiện trước đó, đã tổ chức giao dịch mở. Cụ thể, bởi vì một số trong đó tuyên bố DDL. Khi tôi phát hành rollback, hệ thống phân cấp đối tượng bắt đầu hoạt động.


0

Như nhiều người đã chỉ ra, thường có một giao dịch kéo dài, chủ yếu là do tôi đã sử dụng TẢI GIAO DỊCH GIAO DỊCH TUYỆT VỜI, không nên sử dụng tất cả. Để xem tại sao kiểm tra bài viết sâu sắc của Brent Ozar

Dù sao, bạn có thể nhận được một danh sách các giao dịch đang chờ xử lý kéo dài bằng cách sử dụng truy vấn sau.

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_transilities-one-hell-bad-idea/

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.