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?

MattyZDBA
quelle
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);
Thomas Stringer
quelle
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