it-swarm.dev

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

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.

34
jsauni

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 są rzadko 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 również skorzystać z filtrowania śledzenia profilera po stronie serwera w tej bazie danych.

30
NicCain

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 także 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.

14
SQLRockstar

Zgadzam się z Nicem z jego radą. Jeśli musisz się upewnić, 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 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.

13
Sankar Reddy

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 użytkownika IO względem indeksów (i stert)). w pewnym sensie przy użyciu wirtualnych statystyk plików, ale użyty tutaj DMV wyklucza IO aktywność z kopii zapasowych. Nie trzeba utrzymywać śledzenia profilera, żadnych wyzwalaczy ani audytu. 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 odmów dostępu użytkownikowi na jakiś czas, a także wszelką staranność zapytania przedtem faktycznie spada!

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))
8
FloorDivision

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 one osierocone, ponieważ wiele zadań miało charakter sezonowy lub roczny - tak więc strona internetowa 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 połączeniem:
* zapytaj każdego programistę, czy korzystał z jakiejś bazy danych (czy te e-maile pojawiałyby się co miesiąc lub za każdym razem, gdy tworzenie kopii zapasowych trwało 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ł skłonny 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 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.

3
Tangurena

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
SQL Server Frant

Kolejne dwie alternatywy to:

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

    • Zależy od wersji DB.
2
StanleyJohns