„Przekroczono limit czasu żądania blokady” Błąd podczas próby zobaczenia hierarchii DB

17

Mam problemy z bazą danych.

  1. Mogę uruchamiać podstawowe zapytania, choć znacznie wolniej niż zwykle.

  2. Gdy próbuję wyświetlić drzewa hierarchii dla tabel, widoków lub procedur w Eksploratorze obiektów SSMS, otrzymuję lock request time out period exceeded.

  3. Moje raporty SSRS, które działają na obiektach w tej bazie danych, nie są już uzupełniane.

  4. Zadania związane z procedurami przechowywanymi w tej bazie danych również nie są uruchamiane.

Próbowałem sp_who2znaleźć i zabić wszystkie połączenia w bazie danych, ale to nie rozwiązało problemu.

Co tu się dzieje? Jak mogę to rozwiązać?

Lloyd Banks
źródło
Zobacz także: stackoverflow.com/questions/12167570/… ; nie jestem pewien, czy liczy się to jako duplikat, czy nie.
LittleBobbyTables - Au Revoir
Na podstawie twojego komentarza do mojej odpowiedzi poniżej, myślę, że musisz podać o wiele więcej informacji. Jaka jest wielkość serwera, czy oglądałeś jego liczniki wydajności, czy zamienia się on na dysk lub w inny sposób wyczerpał zasoby w jakiś sposób. Pamiętaj, aby faktycznie sprawdzić powyższe i nie tylko zakładać cokolwiek. Ponadto, czy dzieje się tak, gdy łączysz się zdalnie na pulpicie? Czy problem występuje tylko podczas uzyskiwania dostępu z jednego miejsca? Jaka jest pogoda w sieci dla tego serwera (i twojego połączenia z nim)?
NotMe
3
Wygląda na to, że masz otwarte transakcje, które blokują dostęp do odczytu tabel.
a_horse_w_no_name

Odpowiedzi:

11

Było to spowodowane ciągłym wycofywaniem transakcji. Musiałem ostatecznie zrestartować mój klaster serwerów

Lloyd Banks
źródło
2
Ponowne uruchomienie usługi rozwiązało to dla mnie.
HerrimanCoder,
Ponowne uruchomienie w takiej sytuacji może doprowadzić do odzyskiwania bazy danych
MaazKhan47,
dbcc opentran poinformuje cię, czy są otwarte transakcje
Nate Anderson,
Wydaje mi się dziwne, że podczas trwania transakcji nie mogę na przykład rozwinąć sekcji tabel. Brak odczytu danych, brak DDL, nic, tylko lista tabel.
gerleim
5

Pomijając rozważanie Harware, być może trzeba uruchomić skrypt, aby sprawdzić, jakie działanie wstrzymuje sesję SQL, jednym z typowych scenariuszy jest niestosowanie Implicit transactions OptionSQL Server Management Studio.

Skarp
źródło
Cześć turbocie, czy możesz bardziej szczegółowo opisać to, co sugerujesz?
Wygląda na to, że chociaż nie jest to w pełni wyjaśnione, może to być lepsza odpowiedź, wieczne wycofywanie transakcji, które nie są wycofywane, i są włączane tylko z powodu transakcji niejawnych.
ConstantineK
patrząc wstecz na pytanie, którego nie mogłem powiedzieć, musi to być ciągłe wycofywanie transakcji. Sądząc po locking request time out period exceed, powiedziałbym, że bieganie implicit transaction optiondałoby lepszy trop przyczyn.
Turbot
Narzędzia / Opcje / Wykonywanie zapytań / SQL Server / ANSI / SET IMPLICIT TRANSACTIONS
Tadej
3

Problem ten wystąpił, gdy rozpocząłem jawną transakcję, w której utworzyłem tabelę w tempdb ze skryptu uruchomionego w innej bazie danych (nie tempdb). Kiedy zatwierdziłem transakcję, zatwierdzenie nie zwalniało blokady na stole, który utworzyłem w tempdb.

Dzięki tej stronie wykonałem USEtempdb i wykonałem DBCC OPENTRANi dostałem SPID połączenia z tempdb, które spowodowało blokadę. Więc ja KILL <SPID number>go zabiję.

Niezbyt wdzięczny i straciłem wszystkie informacje w tabeli, którą utworzyłem w tempdb, ale w moim przypadku było to OK.

Baodad
źródło
W naszym przypadku komenda DML (redefinicja widoku) została ponownie uruchomiona w bazie danych przy użyciu USTAWIENIA TRANSAKCJI IMPLICIT WŁĄCZONYCH bez TRANSIT TRANSIT , co przypadkowo spowodowało długotrwałą transakcję. Korzystanie z DBCC OPENTRAN pomogło szybko prześledzić ten problem.
Julio Nobre,
1

Jest tak wiele rzeczy, które mogą być, że wszystko, co mogę zaoferować, to kilka pytań, które pomogą ci znaleźć odpowiedź.

  1. Czy baza danych na serwerze jest przeznaczona tylko do uruchamiania programu SQL Server? Jeśli nie, inne procesy mogą zakłócać kradzież cennego czasu procesora.

  2. Czy serwer DB zasadniczo nie ma pamięci? SQL Server będzie próbował przydzielić każdy bajt, jaki może, ale jeśli jest na pojemności, a twoje zapytania wymagają załadowania większej ilości danych, musi wrócić do korzystania z pamięci wirtualnej, co radykalnie zwiększa czas, który mogą zająć nawet proste zapytania.

  3. Czy przepustowość sieci serwera DB jest zbyt mała, aby poradzić sobie z przesyłaniem danych w odpowiednim czasie?


Pod koniec dnia wygląda na to, że komputer, na którym hostujesz SQL Server, jest za mały, abyś mógł to zrobić. Jest całkiem możliwe, że w końcu osiągnąłeś limity sprzętowe, w których wydajność spada radykalnie. Jeśli tak jest (powyższe pytania pomogą ci to ustalić), będziesz chciał przenieść bazę danych na serwer, który jest odpowiednio dostosowany do ilości danych (i zapytań), które próbujesz przetworzyć.

Może to oznaczać używanie szybszych procesorów, szybszych dysków lub po prostu instalowanie większej ilości pamięci RAM.

Nie ja
źródło
To nie jest problem sprzętowy. Klaster serwerów obsługuje wiele baz danych. To jedyna baza danych mająca problemy
@LloydBanks: To nie znaczy, że to nie jest problem sprzętowy. Jeśli mam 2 bazy danych, jedną o wielkości 20 GB i wysokim wskaźniku transakcji, a drugą o wielkości 1 GB i niższej wartości transakcji, oczekiwałbym zamiany db 1 GB na pamięć wirtualną; co wydłużyłoby czas zapytania. Jeśli uderzenie w 20 GB dbałoby wystarczająco mocno, może to prowadzić do problemów z łącznością z mniejszym.
NotMe
1

„Kiedy próbuję wyświetlić drzewa hierarchii dla tabel, widoków lub procedur w Eksploratorze obiektów SSMS, otrzymuję przekroczony limit czasu żądania blokady”.

Miałem dokładnie ten sam problem. Poszedłem do okna wykonywania zapytania i; wpisana i wykonana ROLLBACKinstrukcja.

Wygląda na to, że niektóre z serii instrukcji, które wcześniej wykonywałem, były otwarte. W szczególności dlatego, że niektóre z nich zawierały instrukcje DDL. Po wydaniu wycofania hierarchie obiektów zaczęły działać.

TS
źródło
0

Jak wielu już zauważyło, zwykle trwa długotrwała transakcja, głównie spowodowała, że ​​moja miss użyła USTAWIEŃ TRANSAKCJI IMPLICIT WŁĄCZONYCH, których w ogóle nie należy używać. Aby dowiedzieć się, dlaczego warto zapoznać się z wnikliwym artykułem Brenta Ozara

W każdym razie możesz uzyskać listę długo trwających transakcji za pomocą następującego zapytania.

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/

Julio Nobre
źródło