
TLDR: Der Standard-Log-Shipping-Job und der Wartungsplan löschen alte Dateien von der Festplatte, aber Backups werden immer noch in SSMS angezeigt, was die Anzeige des „Wiederherstellen“-Fensters sehr langsam macht. Wie lösche ich alte .trn/.bak-Dateien richtig?
(Virtuelle Azure-Maschine, Windows Server 2016 Datacenter (10.0), Microsoft SQL Server Web (Kompatibilitätsgrad 2017), SMMS 17.3)
(die angezeigten Daten sind im Format JJJJ-MM-TT oder TT-MM-JJJJ im 24-Stunden-Format)
Die Verwaltung von Datenbanken gehört weder zu meinen Fähigkeiten noch zu meiner Stellenbeschreibung. Und dennoch wurde mir die Aufgabe übertragen, Backups auf einem MS SQL Server vorzubereiten. Behandeln Sie mich daher bitte als Laien auf diesem Gebiet.
Ich habe beschlossen, jeden Tag vollständige Datenbanksicherungen zu erstellen (natürlich auf externe Speichermedien kopiert), einige davon der Einfachheit halber auf dem Server zu behalten, alte zu löschen und dann Lücken mit Transaktionsprotokollen zu füllen, um sie einige Tage lang auf einen bestimmten Tag wiederherstellen zu können. Nachdem ich ein bisschen gegoogelt hatte, habe ich Folgendes bei Testdatenbanken gemacht:
Es wurde eine manuelle Vollsicherung erstellt, da diese für den Protokollversand erforderlich ist – hier kann nichts schiefgehen.
Generierte Standardaufgabe zum Versenden von Transaktionsprotokollen mit Löschen älterer Dateien. Funktioniert gut, spammt jede Minute .trn und löscht alte Dateien von der Festplatte
Richten Sie einen Wartungsplan ein, um alte, vollständige Backups für Testdatenbanken um Mitternacht zu erstellen und zu löschen - auch hier kein Problem
Ich habe es von Freitag bis Montag laufen lassen. Sowohl .trn- als auch .bak-Dateien wurden ordnungsgemäß erstellt und gelöscht, sodass ich Backups von zwei Tagen zum Spielen hatte:
Habe versucht, aus Backups wiederherzustellen, was aufgrund fehlender Transaktionsdateien Probleme verursachte. Das Öffnen von Tasks\Restore\Database ist sehr, sehr langsam, SMMS beansprucht mehrere Minuten lang 100 % der Festplatte für ~10 MB .trns einer leeren Datenbank. Für Datenbanken ohne automatisches Voll-Backup wurden alle jemals erstellten .trns aufgelistet (und manuelles Voll-Backup an erster Stelle), offensichtlich begleitet von „Datei nicht gefunden“-Fehlern. Für Datenbanken mit täglichem Voll-Backup funktionierte standardmäßig das eingeschränkte Ergebnis, das auf das letzte Voll-Backup zurückgesetzt wurde, und die Wiederherstellung funktionierte ordnungsgemäß, aber es war trotzdem sehr langsam, nur die Backup-Liste anzuzeigen. Das Durchsuchen der Timeline ist ebenfalls sehr langsam (mehrere Minuten „keine Reaktion“).
Ich habe ein Skript zum Abrufen des Skriptverlaufs gefunden unterhttps://www.mssqltips.com/sqlservertip/1601/script-to-retrieve-sql-server-database-backup-history-and-no-backups/(leicht geändert, um alle Backups der betreffenden Datenbank zurückzugeben)
SELECT
CONVERT(CHAR(100), SERVERPROPERTY('Servername')) AS Server,
msdb.dbo.backupset.database_name,
msdb.dbo.backupset.backup_start_date,
msdb.dbo.backupset.backup_finish_date,
msdb.dbo.backupset.expiration_date,
CASE msdb..backupset.type
WHEN 'D' THEN 'Database'
WHEN 'L' THEN 'Log'
END AS backup_type,
msdb.dbo.backupset.backup_size,
msdb.dbo.backupmediafamily.logical_device_name,
msdb.dbo.backupmediafamily.physical_device_name,
msdb.dbo.backupset.name AS backupset_name,
msdb.dbo.backupset.description
FROM msdb.dbo.backupmediafamily
INNER JOIN msdb.dbo.backupset ON msdb.dbo.backupmediafamily.media_set_id = msdb.dbo.backupset.media_set_id
WHERE
--(CONVERT(datetime, msdb.dbo.backupset.backup_start_date, 102) >= GETDATE() - 7)
--and
[database_name] = 'test'
ORDER BY
msdb.dbo.backupset.database_name,
msdb.dbo.backupset.backup_finish_date
und es enthält gelöschte .trn- und .bak-Dateien:
und so weiter bis zu dieser Minute, insgesamt 29682 Sicherungspunkte.
Ich möchte, dass das Fenster „Wiederherstellen“ wieder reagiert, und ich habe zwei Testdatenbanken, die ich frei testen kann. Kann ich die Sicherungsliste sicher löschen? Wie kann ich es automatisieren, damit es gut mit meinen aktuell geplanten Jobs übereinstimmt?
Ich verfüge über volle Administratorrechte sowohl für die Datenbank als auch für das Betriebssystem, habe volle kreative Kontrolle und jede Menge Ressourcen auf der VM übrig, sodass es bei möglichen Lösungen kaum Einschränkungen gibt.
Antwort1
Es besteht die Möglichkeit,sp_delete_backuphistorygespeicherte Prozedur zum Löschen des älteren Verlaufs. Beachten Sie, dass nicht bekannt ist, was Sie gelöscht haben und was nicht, aber der ältere Verlauf als das von Ihnen angegebene Datum X wird gelöscht.
Sobald Sie die große Menge an Backup-Einträgen gelöscht haben, sollte es reagieren. Dies kann problemlos in Ihren Agentenjob integriert werden, indem Sie den SP mit dem aktuellen Datum minus X Tagen als letzten Schritt im Job aufrufen.