Chciałbym wiedzieć, jak zidentyfikować dokładne zapytanie lub przechowywany proc, który faktycznie wypełnia dziennik transakcji bazy danych TEMPDB.
65
Chciałbym wiedzieć, jak zidentyfikować dokładne zapytanie lub przechowywany proc, który faktycznie wypełnia dziennik transakcji bazy danych TEMPDB.
Odpowiedzi:
Od http://www.sqlservercentral.com/scripts/tempdb/72007/
EDYTOWAĆ
Jak zauważył Martin w komentarzu, nie znalazłoby to aktywnych transakcji zajmujących miejsce w tempdb, znajdzie tylko aktywne zapytania , które obecnie zajmują tam miejsce (i prawdopodobnie sprawcy bieżącego użycia dziennika). Może więc istnieć otwarta transakcja, ale faktyczne zapytanie, które powoduje problem, nie jest już uruchomione.
Możesz zmienić
inner join
nasys.dm_exec_requests
aleft outer join
, a następnie zwrócisz wiersze dla sesji, w których aktualnie nie są aktywne zapytania.Zapytanie Martin opublikował ...
... identyfikuje
session_id
s z aktywnymi transakcjami, które zajmują miejsce w dzienniku, ale niekoniecznie będziesz w stanie określić rzeczywiste zapytanie, które spowodowało problem, ponieważ jeśli nie jest teraz uruchomione, nie zostanie przechwycone w powyższym zapytaniu dla aktywne wnioski. Być może będziesz w stanie odruchowo sprawdzić ostatnie zapytanie,DBCC INPUTBUFFER
ale może nie powiedzieć Ci, co chcesz usłyszeć. Możesz dołączyć zewnętrznie w podobny sposób, aby uchwycić osoby aktywnie działające, np .:Możesz również użyć DMV,
sys.dm_db_session_space_usage
aby zobaczyć ogólne wykorzystanie przestrzeni przez sesję (ale znowu możesz nie uzyskać poprawnych wyników dla zapytania; jeśli zapytanie nie jest aktywne, to, co otrzymasz, może nie być faktycznym winowajcą).Mając do dyspozycji wszystkie te zapytania, powinieneś być w stanie zawęzić listę osób korzystających z tempdb i tego, w jaki sposób, zwłaszcza jeśli złapiesz je na gorącym uczynku.
kilka wskazówek dotyczących minimalizacji wykorzystania tempdb
SORT_IN_TEMPDB
opcji, jeśli nie jest potrzebnaMożesz również wziąć pod uwagę, że użycie dziennika tempdb może być spowodowane wewnętrznymi procesami, nad którymi nie masz kontroli lub nie masz nad nimi żadnej kontroli - na przykład poczta w bazie danych, powiadomienia o zdarzeniach, powiadomienia o zapytaniach i broker usług w jakiś sposób korzystają z tempdb. Możesz przestać korzystać z tych funkcji, ale jeśli ich używasz, nie możesz dyktować, jak i kiedy używają tempdb.
źródło
session_id
pojawia się z następującą kwerendąSELECT database_transaction_log_bytes_reserved,session_id FROM sys.dm_tran_database_transactions tdt JOIN sys.dm_tran_session_transactions tst ON tdt.transaction_id = tst.transaction_id WHERE database_id = 2
. Zapytanie Spodziewałem się znaleźć po uruchomieniu był następującyBEGIN TRAN CREATE TABLE #T(X CHAR(8000)) INSERT INTO #T SELECT name FROM sys.objects
@@SPID
To<>
nie=
.dm_db_task_space_usage
raporty0
dla spid z otwartą transakcją dla wszystkich kolumn dla mnie. Zastanawiam się, czy musisz zapytać go, kiedy żądanie jest faktycznie wykonywane, a nie bezczynne przy otwartej transakcji.https://social.msdn.microsoft.com/Forums/sqlserver/en-US/17d9f862-b9ae-42de-ada0-4229f56712dc/tempdb-log-filling-cannot-find-how-or-what?forum=sqldatabaseengine
źródło
Dziękuję za ten post, prawdopodobnie jedyny w swoim rodzaju. Mój test był prosty, utwórz tabelę tymczasową i upewnij się, że pojawi się, gdy uruchomię dowolne z zapytań z tego postu ... tylko jedno lub dwa naprawdę się powiodły. Poprawiłem go, aby dołączyć do T-SQL, zoptymalizowałem go do dłuższych uruchomień i sprawiłem, że był całkiem użyteczny. Daj mi znać, jeśli coś przeoczyłem, ale jak dotąd masz zautomatyzowany / zapętlony skrypt. Zapewnia sposób oceny, które zapytanie / SPID jest sprawcą w danym okresie przy użyciu zapytania o odchylenie standardowe (STDEV) poniżej.
Trwa to co 3 minuty 40 razy, więc 2 godziny. Zmodyfikuj parametry według własnego uznania.
Poniżej znajduje się filtr GDZIE> 50 stron, który ludzie mogą chcieć wyczyścić na wypadek, gdybyś miał dużo małych stolików. W przeciwnym razie nie złapiesz tego niuansu z poniższym, ponieważ jest ...
Cieszyć się!
źródło
Niestety dziennika tempDB nie można bezpośrednio prześledzić z powrotem do sessionID poprzez przeglądanie uruchomionych procesów.
Zmniejsz plik dziennika tempDB do punktu, w którym wzrośnie on znacznie. Następnie utwórz rozszerzone zdarzenie, aby uchwycić wzrost dziennika. Gdy znów wzrośnie, możesz rozwinąć zdarzenie rozszerzone i wyświetlić plik zdarzenia pakietu. Otwórz plik, dodaj filtr czasu, filtr typu pliku (nie chcesz uwzględniać wyników pliku danych), a następnie zgrupuj go według identyfikatora sesji w SSMS. Pomoże to znaleźć winowajców, którzy szukają identyfikatorów sesji z największą liczbą grup według. Oczywiście musisz zebrać to, co działa w identyfikatorach sesji, za pośrednictwem innego procesu lub narzędzia. Może ktoś wie, jak uzyskać zapytanie z kolumny query_hash i będzie na tyle miły, że opublikuje rozwiązanie.
Wyniki rozszerzonego wydarzenia:
Skrypt do utworzenia rozszerzonego zdarzenia:
źródło