it-swarm.com.de

Wie kann ich feststellen, ob noch eine SQL Server-Datenbank verwendet wird?

Wir möchten eine SQL Server-Instanz außer Betrieb nehmen, auf der noch einige Datenbanken vorhanden sind.

Wie kann ich feststellen, ob sie noch von Benutzern oder einer Webanwendung verwendet werden?

Ich habe ein Forenthread gefunden, das eine T-SQL-Abfrage enthält, die Sie ausführen können, um das Datum der letzten Abfrage abzurufen. Es scheint zu funktionieren, aber ich möchte wissen, ob diese Informationen gültig genug sind, um Datenbanken zu löschen. Ist es?

Wenn Sie alternative Methoden haben, würde das auch helfen.

34
jsauni

Sie müssten sich mit Elementen befassen, die aus dem Cache gelöscht wurden und die Sie verpasst haben, oder mit Datenbanken, die nur selten verwendet werden.

Anstatt die Datenbanken außer Kontrolle zu bringen, setzen Sie sie entweder OFFLINE, um den Zugriff zu verhindern, ohne sie zu löschen, oder in den Modus RESTRICTED_USER, um den Zugriff zu beschränken. Auf diese Weise können Sie sie ein oder zwei Monate in diesem Zustand belassen, um zu überprüfen, ob sie gelegentlich verwendet werden.

Sie können auch eine serverseitige Profiler-Trace-Filterung für diese Datenbank verwenden.

30
NicCain

Dies sind die Methoden, die ich in der Vergangenheit verwendet habe:

  1. Datenbank offline schalten/trennen
  2. Benutzer-/Login-Zugriff verweigern
  3. Profiler-Trace

Das Problem ist folgendes: Wie lange warten Sie, bis Sie sicher sind, dass niemand auf die Daten zugreifen wird? Für Finanzdaten werden einige Elemente täglich, wöchentlich, monatlich, vierteljährlich, halbjährlich und jährlich ausgeführt. Aber ist ein Jahr lang genug? Ich habe auch Anfragen gesehen, Daten mindestens 7 Jahre lang verfügbar zu halten, und in einem Fall wurde mir gesagt, dass die Daten in einem System für immer da sein müssen, obwohl niemand sie verwendet.

Der beste Rat lautet: Was auch immer Sie tun, um den Zugriff zu deaktivieren, stellen Sie sicher, dass Sie ihn sofort wieder einschalten können. Ich fand, dass der Detatch dafür am besten funktionierte. Ich würde einfach das erneute Anbringen ausschreiben und mein Team anweisen, "wenn jemand jemals fragt, wo es ist, führen Sie dieses Skript aus". Das gab uns die beste Chance, die Dinge so schnell wie möglich zurückzustellen.

14
SQLRockstar

Ich stimme Nic mit seinem Rat zu. Wenn Sie sicher sein müssen, müssen Sie sich für Profiler (Service Side Trace) entscheiden, da einige der SQL-Abfragen nicht zwischengespeichert werden oder der Prozedur-Cache aus irgendeinem Grund gelöscht werden könnte.

Normalerweise überprüfe ich die Informationen zu den virtuellen Dateistatistiken, um festzustellen, ob auf der Ebene der Betriebssystemdateien Lese- oder Schreibvorgänge stattfinden. Selbst wenn die Datenbank NICHT aktiv ist, werden immer noch kleine Lese-/Schreibvorgänge angezeigt, wenn Sie Protokollsicherungen, vollständige Sicherungen usw. durchführen. Dies gibt Ihnen jedoch auch eine Vorstellung von der Lese-/Schreibaktivität in dieser Datenbank.

Bevor Sie eine Datenbank löschen, würde ich sicherstellen, dass Sie mindestens 2 oder 3 lesbare Backups (testen) an verschiedenen Orten haben. Sie wissen nie, wann Sie sie brauchen.

13
Sankar Reddy

Die folgende Abfrage zeigt DBs, die seit dem letzten Neustart nicht verwendet wurden, ohne sich darauf zu verlassen, dass Abfragepläne im Cache gespeichert sind, da Benutzer IO gegen die Indizes (und Heaps) angezeigt wird Ähnlich wie bei der Verwendung virtueller Dateistatistiken, aber die hier verwendete DMV schließt IO Aktivität von Backups aus. Es ist nicht erforderlich, einen Profiler-Trace am Laufen zu halten, keine Trigger oder Audits erforderlich. Natürlich, wenn Wenn Sie Ihren SQL Server häufig neu starten (oder Datenbanken häufig anhängen/herunterfahren), ist dies möglicherweise nicht der richtige Weg :-)

Trotzdem stimmen Sie zu, dass, selbst wenn diese Abfrage zu bestätigen scheint, dass eine Datenbank gelöscht werden kann, definitiv die OFFLINE durchführen/den Benutzerzugriff für einige Zeit trennen oder verweigern, sowie die erforderliche Sorgfalt, vorher nachzufragen tatsächlich fallen!

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

Ich habe an einem Ort gearbeitet, an dem es eine große Anzahl verwaister und halb verwaister Datenbanken gab. Es war schwer zu sagen, ob sie wirklich verwaist waren, da viele Aufgaben saisonal oder jährlich waren - so dass die Website nur 3-4 Monate pro Jahr läuft (zum Beispiel müssen W2-Formulare 1/31 elektronisch eingereicht werden, also die Website-Verarbeitung diese liefen nur von Mitte Januar bis Ende April).

Was getan wurde, war eine Kombination aus:
* Fragen Sie jeden Entwickler, ob er eine Datenbank oder eine andere verwendet (diese E-Mails werden monatlich verschickt oder wenn Backups zu lange dauern).
* Schalten Sie die Datenbank offline und sehen Sie, wer sich beschwert.
* Benennen Sie den Server um, um zu sehen, wer sich beschwert.

Da der spitzhaarige Chef nur bereit war, "vollständige" Dokumentation zuzulassen, wurde ein Wiki ausdrücklich verboten, und Personalabbau führte zu einem dramatischen Rückgang der Dokumentation, die dem Standard entsprach.

Wenn es nach mir ginge, gäbe es pro Server eine Wiki-Seite mit Kontaktnamen für jede Datenbank (und möglicherweise eine kurze Beschreibung, wofür die Datenbank gedacht ist). Jede im Wiki nicht dokumentierte Datenbank wäre ein faires Spiel zum Löschen.

Wir hatten einen großen Finanzclient, der noch 2009 SQL Server 2000 verwendete, daher mussten wir eine SQL Server 2000-Instanz laufen lassen, bis dieser Client schließlich zu SQL Server 2005 wechselte.

3
Tangurena

Die nächste Lösung zeigt temporäre, saubere und schmutzige Seiten in MB für bestimmte Datenbanken unter Ihrer Instanz an (im Internet gefunden und etwas geändert):

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)

oder

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

oder

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

Weitere zwei Alternativen sind:

  1. Erstellen Sie Trigger in der Datenbank, die Sie über Aktivitäten informieren (oder in Tabellen speichern).
  2. Aktivieren Sie die Überwachung in den DBs.

    • Hängt von Ihrer DB-Version ab.
2
StanleyJohns