Identifizieren von Dateiwachstumsereignissen


9

Ich entdecke eine Reihe von DBs in meinem Portfolio, die mit Standardeinstellungen für das automatische Wachstum (entweder in Schritten von 1 MB oder in Schritten von 10%) erstellt wurden und über einen längeren Zeitraum erweitert wurden. Wenn ich den Umfang der externen Fragmentierung für jede der DB-Dateien messen möchte, kann ich dann anhand von Metadaten ermitteln, wie oft eine DB-Datei in ihrer Größe geändert wurde (entweder durch automatisches Wachstum oder manuell)? Kann ich aus Metadaten den Verlauf von Änderungen an DB-Dateien für die Lebensdauer der DB abrufen, nicht nur seit dem Neustart der Instanz?


1
Sofern sie nicht auch irgendwann verkleinert wurden, sollte dies eine einfache Berechnung von der Anfangsgröße auf die aktuelle Größe sein, basierend auf der Einstellung für das automatische Wachstum.
— Martin Smith

Wenn es nur durch Autogrow geändert wurde, würde ich zustimmen, aber ich habe manuelle Änderungen gesehen, die möglicherweise außerhalb der Autogrow-Einstellungen liegen.
— MattyZDBA

Antworten:


20

Sie können Autogrowth-Ereignisinformationen aus dem Standard-Trace abrufen, wenn dieser aktiviert ist:

select distinct
    ei.eventid,
    e.name
from sys.fn_trace_geteventinfo(1) ei
inner join sys.trace_events e
on e.trace_event_id = ei.eventid
where name like '%grow%';

Daraus können Sie ersehen, dass in der Standardablaufverfolgung die Ereignisse " Datei automatisch wachsen" und " Protokolldatei automatisch wachsen" erfasst werden. Sie können Folgendes tun, um festzustellen, ob für diese Instanz die Standardablaufverfolgung aktiviert ist:

exec sp_configure 'default trace enabled';
go

Hinweis: Dies ist eine erweiterte Konfigurationsoption. Sie müssen daher show advanced optionsauf 1 gesetzt werden, um diese Konfigurationsoption anzuzeigen sp_configure. Außerdem werden diese beiden Ereignisse nicht ausgelöst, wenn die Datei manuell vergrößert wurde .

Hier ist eine kurze Beispielabfrage, um diese Ereignisse abzurufen:

select
    te.name as event_name,
    tr.DatabaseName,
    tr.FileName,
    tr.StartTime,
    tr.EndTime
from sys.fn_trace_gettable('<Trace Path>', 0) tr
inner join sys.trace_events te
on tr.EventClass = te.trace_event_id
where tr.EventClass in (92, 93)
order by EndTime;

Und Sie können <Trace Path>von der Systemfunktion erhalten sys.fn_trace_getinfo:

select *
from sys.fn_trace_getinfo(1);

Dies sind gute Informationen. Beachten Sie jedoch, dass einige dieser Ereignisse möglicherweise aus der Standardablaufverfolgung abgelaufen sind.
— Nic

Absolut, aber ich glaube, es ist die einzige sofort einsatzbereite Überwachung, mit der das OP dies erreichen kann, wenn es tatsächlich die richtige Prüfung durchführt.
— Thomas Stringer
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.