So erhalten Sie die letzte abgeschnittene Zeit für jede Tabelle in der SQL Server-Datenbank

7

Ich habe eine SQL Server 2012-Datenbank. Ist es möglich, die letzte abgeschnittene Zeit für alle Tabellen in der Datenbank abzurufen?

Hinweis: Der Wiederherstellungsmodus befindet sich SIMPLEin meinem Szenario. Ist es möglich, wenn ich es ändere FULL?

LCJ
quelle

Antworten:

12

Denken Sie daran, dass das Abschneiden ein effizient protokollierter Vorgang ist .

Da Sie im einfachen Wiederherstellungsmodus ausgeführt werden und Ihr T-Protokoll nicht abgeschnitten ist, können Sie es mit undokumentiert abrufen fn_dblog:

SELECT [Current LSN]
    ,[Operation]
    ,[Begin Time]
    ,[Transaction ID]
    ,[Transaction Name]
    ,[Transaction SID]
    ,SUSER_SNAME([Transaction SID]) as UserWhoIssuedTruncate
FROM fn_dblog(NULL, NULL)
WHERE Operation = 'LOP_BEGIN_XACT' and
    [Transaction ID] IN (
        SELECT [Transaction ID]
        FROM fn_dblog(NULL, NULL)
        WHERE [Transaction Name] = 'TRUNCATE TABLE'
        )
GO

Klicken Sie hier zum Vergrößern

Geben Sie hier die Bildbeschreibung ein

Alternativ können Sie eine serverseitige Ablaufverfolgung ausführen oder SQL Audit aktivieren.

Geben Sie Ihren Benutzern immer Mindestberechtigungen (Prinzip der geringsten Berechtigungen).

Ist es möglich, wenn ich es auf FULL ändere?

Ja, das ist es (und das Wiederherstellungsmodell sollte von Ihrem Unternehmen definiert werden - möchten Sie eine Wiederherstellung zu einem bestimmten Zeitpunkt durchführen lassen? Wie viele Daten kann sich Ihr Unternehmen leisten, um sie zu verlieren? Usw.) Sie müssen mit der Pflege Ihres T-Protokolls beginnen, indem Sie ein reguläres Protokoll ausführen Backups. Dadurch bleibt Ihr T-Log auf einer vernünftigen Größe.

Die bearbeitete Abfrage verwendet "IN" anstelle von "=", da mehrere Ergebnisse in der Unterabfrage möglich sind.

Kin Shah
quelle
4

Ich fürchte, es ist nicht möglich zu wissen, wann eine Tabelle das letzte Mal abgeschnitten wurde, ohne etwas einzurichten, um das Ereignis im Voraus zu erfassen.

Die Standardablaufverfolgung enthält keine Informationen für truncateEreignisse und sys.dm_dm_index_usage_statshilft Ihnen auch hier nicht weiter.

Ihre Optionen sind:

  1. Eine Spur
  2. Eine erweiterte Ereignissitzung
  3. Ein Audit (ich bin nicht 100% sicher, ob es TRUNCATE-Ereignisse erfassen kann)

Bei Ihrer zweiten Frage handelt es sich normalerweise um das Wiederherstellungsmodell für Produktionsdatenbanken FULL, da die Wiederherstellung der Datenbank zu einem bestimmten Zeitpunkt im Allgemeinen erforderlich ist. Datenbanken, die nur Daten enthalten, die einfach und schnell aus anderen Datenquellen wiederhergestellt werden können, müssen normalerweise nicht zu einem bestimmten Zeitpunkt wiederhergestellt werden, sodass sie häufig im SIMPLEWiederherstellungsmodell enthalten sind

spaghettidba
quelle