
TLDR:預設日誌傳送作業和維護計畫正在從磁碟中刪除舊文件,但備份仍顯示在 SSMS 中,這使得顯示「復原」視窗非常緩慢。如何正確刪除舊的.trn/.bak?
(Azure 虛擬機器、Windows Server 2016 Datacenter (10.0)、Microsoft SQL Server Web(2017 相容等級)、SMMS 17.3)
(顯示的日期採用 YYYY-MM-DD 或 DD-MM-YYYY 格式,採用 24 小時制)
管理資料庫既不屬於我的技能範圍,也不屬於我的工作描述,但我的任務是在 MS Sql Server 上準備備份,因此請在這個主題上將我視為外行人。
我決定每天建立完整的資料庫備份(當然複製到外部儲存),為了方便起見,在伺服器上保留一些備份,刪除舊的備份,然後用交易日誌填充漏洞,以便在幾天內進行日點復原。經過谷歌搜尋後,我在測試資料庫上做了以下操作:
建立手動完整備份,因為日誌傳送需要它 - 這裡不會失敗
設定維護計劃以在午夜建立和刪除測試資料庫的舊完整備份 - 這裡也沒有問題
嘗試從備份恢復,這導致了交易文件遺失的問題。開啟任務\復原\資料庫非常非常慢,SMMS 正在為大約 10MB .trn 的空資料庫消耗 100% 磁碟幾分鐘。對於沒有自動完整備份的資料庫,它列出了所有已建立的.trn(首先是手動完整備份),顯然伴隨著「檔案未找到」錯誤。為上次完整備份和還原工作正常,但僅顯示備份清單仍然很慢,瀏覽時間軸也很慢(幾分鐘「沒有回應」)。
我找到了用於獲取腳本歷史記錄的腳本https://www.mssqltips.com/sqlservertip/1601/script-to-retrieve-sql-server-database-backup-history-and-no-backups/(稍作修改以傳回感興趣的資料庫的所有備份)
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
依此類推,截至目前,總共 29682 個備份點。
我希望“恢復”視窗能夠再次響應,並且我有兩個測試資料庫可以自由測試。我可以安全地清除備份清單嗎?我怎樣才能使它自動化,以很好地配合我目前的日程安排工作?
我在資料庫和作業系統上擁有完全的管理權限,完全的創意控制和虛擬機器上留下的大量資源,因此對可能的解決方案幾乎沒有任何限制。
答案1
可以使用sp_delete_backuphistory預存程序清除舊歷史記錄。請注意,它不知道您是否刪除了哪些內容,但它會清除比您提供的 X 日期更舊的歷史記錄。
一旦清除了大量的備份條目,它就會變得快速回應。透過呼叫 SP,將目前日期減去 X 天數作為作業的最後一步,可以輕鬆地將其包含到代理作業中。