Jak mogę sprawdzić, czy baza danych SQL Server jest nadal używana?


33

Chcemy wycofać wystąpienie programu SQL Server, w którym nadal znajduje się kilka baz danych.

Jak mogę sprawdzić, czy nadal są używane przez użytkowników, czy aplikację internetową?

Znalazłem wątek forum, który miał zapytanie T-SQL, które można uruchomić, aby pobrać datę ostatniego zapytania. Wygląda na to, że działa, ale chcę wiedzieć, czy te informacje są wystarczająco ważne, aby usunąć bazy danych. Czy to jest

Jeśli masz alternatywne metody, które również by pomogły.


1
Wiele świetnych dyskusji poniżej, ale także zobacz ten post na blogu .
Aaron Bertrand

Odpowiedzi:


29

Będziesz musiał przejmować się elementami, które zostały usunięte z pamięci podręcznej i których nie zauważyłeś, lub bazami danych, które nie są często używane.

Zamiast upuszczać bazy danych z ręki, ustaw je w trybie offline, aby uniemożliwić dostęp bez ich upuszczania, lub w trybie RESTRICTED_USER, aby ograniczyć dostęp. W ten sposób możesz pozostawić je w tym stanie na miesiąc lub dwa, aby sprawdzić, czy zdarza się to sporadycznie.

Możesz także skorzystać z filtrowania śledzenia profilera po stronie serwera w tej bazie danych.


24
Zasada nr 1 bycia DBA: Nigdy nie wprowadzaj żadnych zmian, z których nie możesz się szybko wycofać, jeśli musisz.
Gajusz

14

Oto metody, z których korzystałem w przeszłości:

  1. Przełącz bazę danych w tryb offline / Odłącz
  2. ODMÓW dostępu użytkownika / logowania
  3. Śledzenie profilera

Problem polega na tym: jak długo czekasz, zanim masz pewność, że nikt nie uzyska dostępu do danych? W przypadku danych finansowych niektóre elementy są uruchamiane codziennie, co tydzień, co miesiąc, co kwartał, co pół roku i co rok. Ale czy rok wystarczy? Widziałem również prośby o udostępnienie danych przez co najmniej 7 lat, aw jednym przypadku powiedziano mi, że dane w jednym systemie muszą istnieć na zawsze, nawet jeśli nikt ich nie używał.

Najlepsza rada jest następująca: cokolwiek zrobisz, aby wyłączyć dostęp, upewnij się, że możesz go od razu ponownie włączyć. Przekonałem się, że podział działał najlepiej do tego. Po prostu napisałbym scenariusz ponownego dołączenia i poinstruowałbym mój zespół „jeśli ktokolwiek zapyta, gdzie to jest, uruchom ten skrypt”. To dało nam najlepszą szansę na jak najszybsze przywrócenie rzeczy.


Zastanawiałem się nad tym, czy czas monitorowania użycia bazy danych był wystarczająco długi. Czy po prostu bierzesz charakter SQL Servera i wywołujesz ten osąd?
jsauni,

tak, w pewnym momencie wszyscy zgadzają się na wyciągnięcie wtyczki i zrozumienie, że jeśli jakiś nieuczciwy proces zawiedzie, będziesz musiał szybko odłożyć wszystko. tak długo, jak są w porządku z awarią i szybko wracasz do trybu online, wszystko powinno być w porządku. ale nie jest łatwo przekonać wszystkich do porozumienia!
SQLRockstar,

13

Zgadzam się z Nicem z jego radą. Jeśli musisz być pewien, musisz przejść do programu Profiler (śledzenie po stronie usługi), ponieważ niektóre zapytania SQL nie będą buforowane lub z jakiegokolwiek powodu pamięć podręczna procedur może zostać wyczyszczona.

Zwykle sprawdzałbym informacje dotyczące statystyk plików wirtualnych, aby sprawdzić, czy na poziomie plików systemu operacyjnego występują jakieś odczyty lub zapisy. Nawet jeśli baza danych NIE jest aktywna, nadal będziesz widział małe odczyty / zapisy, jeśli wykonujesz kopie zapasowe dziennika, pełne kopie itp., Ale da to również wyobrażenie o aktywności odczytu / zapisu w tej bazie danych.

Przed usunięciem jakiejkolwiek bazy danych upewnij się, że masz co najmniej 2 lub 3 czytelne kopie zapasowe (przetestuj je) w osobnych lokalizacjach. Nigdy nie wiadomo, kiedy ich potrzebujesz.


8

Poniższe zapytanie pokazuje bazy danych, które nie były używane od ostatniego restartu, bez polegania na planach zapytań przechowywanych w pamięci podręcznej, ponieważ pokazuje IO użytkownika względem indeksów (i stosów). Jest to trochę podobne do korzystania z wirtualnych statystyk plików, ale użyty tutaj DMV wyklucza aktywność IO z kopii zapasowych. Nie ma potrzeby prowadzenia śledzenia profilera, żadnych wyzwalaczy ani inspekcji nie jest wymagane. Oczywiście, jeśli często restartujesz serwer SQL (lub często dołączasz / zamykasz bazy danych), może to nie być dobry sposób :-)

Powiedziawszy to, nadal zgadzam się, że nawet jeśli to zapytanie wydaje się potwierdzać, że DB można usunąć, zdecydowanie wykonaj offline / odłącz lub odmawiaj dostępu użytkownikowi przez pewien czas, a także dokładaj starań, aby zapytać przed faktycznym usunięciem!

select [name] from sys.databases 
where database_id > 4
AND [name] NOT IN 
(select DB_NAME(database_id) 
from sys.dm_db_index_usage_stats
where coalesce(last_user_seek, last_user_scan, last_user_lookup,'1/1/1970') > 
(select login_time from sys.sysprocesses where spid = 1))

Jest to całkiem świetne, jeśli działa dobrze. Czy mogę zapytać, dlaczego bierzesz koalescencję i porównujesz do login_time? A dlaczego nie podałeś ostatniej aktualizacji? Czy jest to sprytna próba sprawdzenia, czy baza danych dostaje INSERTS, ale nikt nigdy nie sprawdza jej? Czy może DMV może zawierać wszystkie znaczniki czasu NULL?
Jason,

2

Pracowałem w miejscu, które miało dużą liczbę osieroconych i częściowo osieroconych baz danych. Trudno było stwierdzić, czy naprawdę zostały osierocone, ponieważ wiele zadań miało charakter sezonowy lub roczny - tak, że strona działa tylko przez 3-4 miesiące w roku (na przykład formularze W2 muszą być składane elektronicznie 1/31, więc przetwarzanie strony internetowej trwały one tylko od połowy stycznia do końca kwietnia).

To, co zostało zrobione, było kombinacją:
* zapytaj każdego programistę, czy korzysta z jakiejś bazy danych, czy innej (te e-maile będą wysyłane co miesiąc lub gdy tworzenie kopii zapasowych trwa zbyt długo).
* Przełącz bazę danych w tryb offline i sprawdź, kto narzeka.
* zmień nazwę serwera, aby zobaczyć, kto narzeka.

Ponieważ spiczasty włos tylko szef był gotów zezwolić na „pełną i kompletną” dokumentację, wiki została wyraźnie zabroniona, a redukcje personelu prowadzą do dramatycznego spadku dokumentacji, która spełniała ten standard.

Gdyby to zależało ode mnie, na każdym serwerze istniałaby strona wiki z nazwami kontaktów dla każdej bazy danych (i może krótki opis tego, do czego służy baza danych). Każda baza danych nieudokumentowana na wiki byłaby uczciwą grą do usunięcia.

Mieliśmy jednego dużego klienta finansowego, który wciąż korzystał z SQL Server 2000 jeszcze w 2009 roku, więc musieliśmy utrzymać jedną instancję SQL Server 2000, dopóki klient ten ostatecznie nie przejdzie na SQL Server 2005.


2

Kolejne dwie alternatywy to:

  1. Utwórz wyzwalacze w bazie danych, które powiadomią Cię (lub zapisz w tabelach) o dowolnej aktywności.
  2. Włącz kontrolę w bazach danych.

    • Zależy od wersji DB.

2

Następne rozwiązanie pokazuje tymczasowe całkowite, czyste i brudne strony w MB dla poszczególnych baz danych w twojej instancji (znalezione w Internecie i nieco zmodyfikowane):

SELECT
    (CASE WHEN ([database_id] = 32767) THEN 'Resource Database' ELSE DB_NAME (database_id) END) AS 'Database Name',
    COUNT(*) *8/1024 AS [TotalPages in MB],
    SUM(CASE WHEN ([is_modified] = 1) THEN 0 ELSE 1 END) *8/1024 AS [CleanPages in MB],
    SUM(CASE WHEN ([is_modified] = 1) THEN 1 ELSE 0 END) *8/1024 AS [DirtyPages in MB]
FROM sys.dm_os_buffer_descriptors
GROUP BY database_id
ORDER BY DB_NAME(database_id)

lub

select value [DBid],attribute, last_execution_time ,text
from
sys.dm_exec_query_stats
cross apply
sys.dm_exec_plan_attributes(plan_handle)
cross apply
sys.dm_exec_sql_text(plan_handle)
where  attribute = 'dbid' 
order by last_execution_time desc

lub

select value [DBid],attribute, last_execution_time ,text
from
sys.dm_exec_query_stats
cross apply
sys.dm_exec_plan_attributes(plan_handle)
cross apply
sys.dm_exec_sql_text(plan_handle)
--where dbid=8
where 
      text like '%idAdministrator%' and
      attribute = 'dbid' 
      and value>= 5 -- dbid >=5 for user databases but include resource database which
                     --you can exclude by its numer I don't remember at the moment
order by last_execution_time desc

2
Czy możesz wyjaśnić, w jaki sposób rozwiązuje to pierwotny problem?
dezso,
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.