Frage

Wir möchten eine SQL -Serverinstanz stillt, auf der noch einige Datenbanken enthalten sind.

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

Ich habe einen ... gefunden Forum Thread Das hatten eine T-SQL-Abfrage, die Sie ausführen konnten, um das letzte Abfragedatum abzurufen. Es scheint zu funktionieren, aber ich möchte wissen, ob diese Informationen gültig genug sind, um Datenbanken fallen zu lassen. Ist es?

Wenn Sie alternative Methoden haben, die auch helfen würden.

War es hilfreich?

Lösung

Sie müssten sich mit Gegenständen befassen, die aus dem Cache gelöscht wurden und die Sie verpasst haben, oder für Datenbanken, die eine seltene Verwendung haben.

Anstatt die Datenbanken außer Kontrolle zu lassen, stellen Sie sie entweder offline, um den Zugriff zu verhindern, ohne sie fallen zu lassen, oder im eingeschränkten Modus, um den Zugriff zu begrenzen. Wenn Sie dies tun, können Sie sie für ein oder zwei Monate in diesem Zustand lassen, um zu überprüfen, ob gelegentlich verwendet wird.

Sie können auch versuchen, eine Server -Side -Profiler -Trace -Filterung in dieser Datenbank zu verwenden.

Andere Tipps

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

  1. Nehmen Sie die Datenbank offline/ detach
  2. Benutzer-/Anmeldungszugriff verweigern
  3. Profiler -Spur

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

Der beste Rat ist: Was auch immer Sie tun, um den Zugriff auszuschalten, stellen Sie sicher, dass Sie ihn sofort wieder einschalten können. Ich fand, dass die Detatch dafür am besten funktioniert hat. Ich würde einfach die Reattach herausstellen 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ückzugeben.

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

Normalerweise würde ich die Informationen zur virtuellen Dateistatistik überprüfen, um festzustellen, ob auf der OS -Dateiebene Lese- oder Schreibvorgänge vorhanden sind. Auch wenn die Datenbank nicht aktiv ist, werden Sie noch kleine Lesevorgänge/Schreibungen sehen, wenn Sie Protokollsicherungen, vollständige Sicherungen usw. usw. einnehmen, aber das gibt Ihnen auch eine Vorstellung von Lesen/Schreibaktivitäten in dieser Datenbank.

Bevor ich eine Datenbank fallen lasse, würde ich sicherstellen, dass Sie mindestens 2 oder 3 lesbare Backups (testen) an getrennten Stellen haben. Sie wissen nie, wann Sie sie brauchen.

Die folgende Abfrage zeigt DBS, die seit dem letzten Neustart keine Verwendung hatten, ohne sich auf Abfragepläne zu verlassen, die im Cache aufbewahrt werden, da sie Benutzer IO gegen die Indizes (und Haufen) anzeigen. Dies entspricht der Verwendung virtueller Dateistatistiken, aber der hier verwendete DMV schließt die IO -Aktivität von Backups aus. Keine Notwendigkeit, einen Profiler -Trace zu halten, keine Auslöser oder Auditing erforderlich. Wenn Sie Ihren SQL-Server häufig neu starten (oder Datenbanken häufig anhängen), ist dies möglicherweise nicht der richtige Weg :-)

Trotzdem stimmen Sie immer noch zu, dass diese Abfrage auch dann zu bestätigen scheint, dass ein DB fallen gelassen werden kann, bestimmt Führen Sie den Offline/Ablösung oder verweigern Sie den Benutzerzugriff für einige Zeit sowie die Due Diligence, um zu fragen, bevor Sie 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))

Ich habe an einem Ort gearbeitet, an dem eine große Anzahl von verwaisten und semi-orphanierten Datenbanken. Es war schwer zu erkennen, ob sie wirklich verwaist waren, da viele Aufgaben saisonal oder jährlich waren - sodass die Website nur 3-4 Monate pro Jahr läuft (beispielsweise müssen W2 -Formulare elektronisch 1/31 eingereicht werden, sodass die Website der Website so eingereicht werden muss Diese lief nur von Mitte Januar bis Ende April).

Was getan wurde, war eine Kombination von:
* Fragen Sie jeden Entwickler, ob er eine oder die andere Datenbank verwenden würde (diese E -Mails würden monatlich ausgehen oder wenn die Backups zu lange dauern).
* Nehmen 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 und vollständige" Dokumentation zuzulassen, war ein Wiki ausdrücklich verboten, und die Reduzierung der Mitarbeiter führte zu einem dramatischen Rückgang der Dokumentation, die den Standard entstanden.

Wenn es an mir lag, würde es für jede Datenbank eine Wiki -Seite pro Server mit Kontaktnamen geben (und möglicherweise eine kurze Beschreibung der Datenbank). Jede auf dem Wiki undokumentierte Datenbank wäre ein faires Spiel für das Löschen.

Wir hatten einen großen finanziellen Client, der noch 2000 SQL Server 2000 verwendete. Daher mussten wir eine SQL Server 2000 -Instanz ausführen, bis dieser Client endlich auf SQL Server 2005 wechselte.

Zwei weitere Alternativen sind:

  1. Erstellen Sie Auslöser auf der DB, die Sie über Aktivitäten informieren (oder auf Tabellen speichern).
  2. Aktivieren Sie die Prüfung auf dem DBS.

    • Hängt von Ihrer DB -Version ab.

Die nächste Lösung zeigt temporäre Gesamt-, saubere und schmutzige Seiten in MB für bestimmte Datenbanken unter Ihrer Instanz (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
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit dba.stackexchange
scroll top