Sql-Server

如何知道 db 文件不可訪問?

  • August 24, 2018

讓我解釋一下我的情況。

我在本地 PC 上安裝了數據庫文件。我附加了數據庫(從這個安裝)。然後關閉這個掛載(換句話說,我附加 db,然後刪除 db 文件)。所以我有沒有文件的數據庫。任何ALTER查詢都會給我這樣的資訊:

Database 'TestTableDatabase2005' cannot be opened due to inaccessible files or insufficient memory or disk space.  See the SQL Server errorlog for details.

基本上我需要分離一個數據庫,但在這種情況下,這個數據庫只能被刪除(或修復,但不是我的情況)。刪除數據庫效果很好:

DROP DATABASE [TestTableDatabase2005]

但我的目標是了解這個數據庫的狀態。在這裡我有問題。詢問:

SELECT state 
FROM sys.databases 
WHERE name = N'TestDB'

給我ONLINE(這不是真的)。但是一旦我執行例如這個腳本(當然它以錯誤結束):

ALTER DATABASE [TestDB] SET SINGLE_USER WITH ROLLBACK IMMEDIATE

Msg 5120, Level 16, State 101, Line 10
Unable to open the physical file "C:\MOUNT\b4c059e8-3ba6-425f-9a2a-f1713e7719ca\TestDB.mdf". Operating system error 3: "3(The system cannot find the path specified.)".
File activation failure. The physical file name "C:\MOUNT\b4c059e8-3ba6-425f-9a2a-f1713e7719ca\TestDB_log.ldf" may be incorrect.
File activation failure. The physical file name "C:\MOUNT\b4c059e8-3ba6-425f-9a2a-f1713e7719ca\TestDB_log-2.ldf" may be incorrect.
Msg 5181, Level 16, State 5, Line 10
Could not restart database "TestDB". Reverting to the previous status.
Msg 5069, Level 16, State 1, Line 10
ALTER DATABASE statement failed.

我的“TestDB”的狀態將在RECOVERY_PENDING.

您知道如何檢查這些數據庫文件是否不可訪問嗎?或者我是否有機會刷新有關此數據庫的 sql 資訊?

PS 以下查詢說文件具有實際大小。

SELECT DB_NAME(database_id) AS DatabaseName,
Name AS Logical_Name,
Physical_Name, (size*8)/1024 SizeMB
FROM sys.master_files
WHERE DB_NAME(database_id) = N'TestDB'

DatabaseName Logical_Name Physical_Name                                                     SizeMB
------------ ------------ ----------------------------------------------------------------- -------
TestDB       TestDB       C:\MOUNT\b4c059e8-3ba6-425f-9a2a-f1713e7719ca\TestDB.mdf          3 
TestDB       TestDB_log   C:\MOUNT\b4c059e8-3ba6-425f-9a2a-f1713e7719ca\TestDB_log.ldf      3
TestDB       TestDB-2_log C:\MOUNT\b4c059e8-3ba6-425f-9a2a-f1713e7719ca\TestDB_log-2.ldf    3

最後,我找到了我真正需要的東西。我可以通過 sql server 檢查特定文件是否存在:

DECLARE @result INT
EXEC master.dbo.xp_fileexist 'C:\MOUNT\f99bae7b-d2b0-45de-94f4-064ad8d19186\TestDB.mdf', @result OUTPUT
select @result as exist

exist
-----------
1

如果您的文件系統退出,這是一個主要問題。如果您的數據庫正在送出事務怎麼辦?這可能會導致損壞和潛在的數據失去。這將是我的第一反應。

如果這只是您的測試系統中的問題,並且您已驗證底層文件系統故障已本地化(IE 絕對不會影響生產系統),我的感覺是配置了第 1 步的 SQL 代理作業以檢查物理文件磁碟可以完成這項工作。

第 1 步可能包含類似以下 powershell 的內容:

if (Test-Path $path) {
  Return
} else {
  Throw "File doesn't exist"
}

如果$path變數中的文件不存在,上面的程式碼會拋出錯誤。

第 1 步失敗將移至第 2 步,但成功將退出報告成功的工作。然後,第 2 步將是您希望採取的任何行動。

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