Sql-Server

如何檢查是否引用了舊的 MDF 和 LDF 文件

  • December 9, 2021

我繼承了一個設置,我對數據庫工作相當陌生。我的生產伺服器上有一個驅動器,該驅動器是幾年前在我公司的一場大危機中創建的。危機得到了解決,一切都恢復了。但是我的這個驅動器有 70 個 LDF 和 MDF 文件,從那次恢復開始。有沒有一種快速簡便的方法來確定這些東西是否被引用或使用?我只是不知道這裡的最後一個 DBA 之後可能會使用它們。

修改日期都來自危機時期,即 2016 年初。此後沒有。

謝謝。

使用這個:Find-DbaOrphanedFile

它是一個 PowerShell 命令,但它確實勝過手動測試大量文件。

此命令在與 SQL 數據庫文件關聯的所有目錄中搜尋 SQL Server 實例目前未使用的數據庫文件。

預設情況下,它會在 root\data 目錄、預設數據路徑、預設日誌路徑、系統路徑和任何附加目錄使用的任何目錄中查找孤立的 .mdf、.ldf 和 .ndf 文件。

您可以使用 -FileType 參數指定其他文件類型,並使用 -Path 參數指定要搜尋的其他路徑。

使用 SysInternals 的Handle實用程序查看文件的打開句柄。這將簡潔而明確地告訴您是否在相關機器上執行的任何程序打開了這些文件。

例如,在我的開發機器上,如果我在命令提示符下執行它:

C:\Users\xxxx\Downloads\Handle_> 句柄 D:\SQLServer\MV2012\Data\CharSizeTest.mdf

我看到這個輸出:

搖桿 v3.51
版權所有 (C) 1997-2013 Mark Russinovich
Sysinternals - www.sysinternals.com

sqlservr.exe pid:4028 類型:文件 B2C:D:\SQLServer\MV2012\Data\CharSizeTest.mdf

在上面,您可以看到sqlserver.exe.mdf 的打開句柄

請注意,這並不能保證您可以刪除該文件;它只會向您顯示是否有任何文件打開了相關文件。

在刪除任何內容之前,我會備份相關文件,以便在需要時恢復它們。我計劃在 6 個月內刪除該備份。

您可以使用以下查詢通過 SQL Server 實例檢查離線的數據庫或單個文件:

SELECT  DatabaseName = d.name
   , DatabaseState = d.state_desc
   , FileName = mf.name
   , FileState = mf.state_desc
   , FilePath = mf.physical_name
FROM sys.master_files mf 
   INNER JOIN sys.databases d ON mf.database_id = d.database_id
WHERE mf.state_desc <> 'ONLINE'
   OR d.state_desc <> 'ONLINE'
ORDER BY d.name
   , mf.name;

對於離線數據庫,輸出如下所示:

╔══════════════╦═══════════════╦══════════════════╦═══════════╦═══════════════════════════════════════════════╗
║ DatabaseName ║ DatabaseState ║ FileName ║ FileState ║ FilePath ║
╠══════════════╬═══════════════╬══════════════════╬═══════════╬═══════════════════════════════════════════════╣
║ CharSizeTest ║ 離線 ║ CharSizeTest ║ 線上 ║ D:\SQLServer\MV2012\Data\CharSizeTest.mdf ║
║ CharSizeTest ║ 離線 ║ CharSizeTest_log ║ 線上 ║ D:\SQLServer\MV2012\Logs\CharSizeTest_log.ldf ║
╚══════════════╩═══════════════╩══════════════════╩═══════════╩═══════════════════════════════════════════════╝

引用自:https://dba.stackexchange.com/questions/202444