Auf dem SQL-Server meines Clients befinden sich viele Datenbanken. Diese Datenbanken befinden sich in der Entwicklung, sodass Entwickler Daten entwerfen, umgestalten, ändern und so weiter können. Es gibt einige Datenbanken, die sich selten ändern. Mein Kunde muss sie alle sicher aufbewahren (sichern) und einige Zeit mit der Verwaltung der Umgebung verbringen. (Im Unternehmen gibt es keine Position als DB-Administrator.) Nach einer langen Diskussion hat sich der Client aufgrund der einfachen Wiederherstellung für eine tägliche vollständige Sicherungsstrategie entschieden.
Also hier ist die Zusammenfassung der Situation:
- Die Anzahl der Datenbanken kann täglich variieren.
- Geänderte Datenbanken (dh Daten und / oder Struktur wurden geändert) müssen gesichert werden.
- Datenbanken, die nicht geändert wurden, werden NICHT gesichert.
- Die Lösung darf keine Auswirkungen auf die Datenbankstruktur haben (keine Einschränkung erforderlich)
- Diese "Backup-Engine" soll automatisch funktionieren.
Das Hauptproblem: Wie erkennt man, dass eine Datenbank geändert wurde? Der erste Teil des Problems (DDL-Änderungen) kann mithilfe von DDL-Triggern behoben werden . Die Datenänderungen (DML-Änderungen) sind jedoch ein Problem. Es ist unmöglich, DML-Trigger auf alle Tabellen aller Datenbanken anzuwenden, um Änderungen zu verfolgen (Leistung, Verwaltung erweiterter Objekte ...). Die Backup-Engine muss alle Änderungen nachverfolgen, um jede Datenbank als bereit für das Backup zu markieren.
Change Data Capture ist eine Lösung, scheint jedoch zu umfangreich zu sein (erfordert auch SQL Server Enterprise Edition).
Eine andere Möglichkeit besteht darin, Änderungen an der Datenbankdatei zu verfolgen (Größe oder Zeitpunkt der letzten Änderung), dies funktioniert jedoch nicht ordnungsgemäß: Eine Datenbank kann ihre Größe ändern, wenn der gesamte reservierte freie Speicherplatz überschritten wird und sp_spaceused keine Lösung darstellt.
Die Ablaufverfolgung ist eine Lösung, verursacht jedoch Leistungsprobleme und erfordert zusätzliches Management.
Gibt es Lösungen zur Berechnung der tatsächlichen Größe der Datenbanknutzung, ohne Auswirkungen auf andere Datenbankverwaltungsobjekte (z. B. Statistiken) zu haben? Zugegeben, eine Änderung an den Daten einer Tabelle, die die Größe der Tabelle nicht ändert, wird nicht ausgelöst (glaube ich), ist aber besser als nichts. Wirklich suche ich nach einer direkten oder indirekten Lösung für SQL Server 2008.
Vielen Dank für Kommentare, Lösungen und Gedanken.
HINZUGEFÜGT:
Hier ist die Lösung (danke an Marian ):
Select
NextLSN = MAX(fn.[Current LSN])
,Databasename = DB_NAME()
from fn_dblog(NULL, NULL) fn
LEFT JOIN sys.allocation_units au
ON fn.AllocUnitId = au.allocation_unit_id
LEFT JOIN sys.partitions p
ON p.partition_id = au.container_id
LEFT JOIN sys.objects so
ON so.object_id = p.object_id
WHERE
(
(Operation IN
('LOP_INSERT_ROWS','LOP_MODIFY_ROW',
'LOP_DELETE_ROWS','LOP_BEGIN_XACT','LOP_COMMIT_XACT')
AND so.is_ms_shipped = 0)
OR
([Lock Information] like '%ACQUIRE_LOCK_SCH_M OBJECT%')
)