移動了“tempdb”,現在文件“tempdev2”不存在
我首先移動了tempdb來定位文件:
use master select name, physical_name from sys.master_files where database_id = DB_ID('tempdb'); GO
然後我移動了每個文件:
use master go alter database tempdb modify file (name = tempdev, filename = 'S:\') go alter database tempdb modify file (name = templog, filename = 'S:\') go alter database tempdb modify file (name = tempdev2, filename = 'S:\') go
儘管設置了路徑,但ndf tempdev2沒有移動。除非我使用“/f”開關,否則我的 SQL Server 將無法啟動。當我重試移動或將路徑設置為原始位置時,我收到以下消息:
消息 5041,級別 16,狀態 1,第 1 行修改文件失敗。文件“tempdev2”不存在。
有任何想法嗎?tempdev和templog都很好,只是tempdev1 ndf。是否可以通過系統資料庫設置 tempdev2 的路徑?
我犯的錯誤可能是在移動之前沒有縮小 ndf。現在我不能縮小它,因為路徑不正確。
附加資訊
我知道在事件查看器中出現以下錯誤:
CREATE FILE 在嘗試打開或創建物理文件“S:\tempdb”時遇到作業系統錯誤 5(拒絕訪問。)。
我檢查了分區和文件夾的權限,每個人都有完全訪問權限,並且發生了這個權限錯誤。
您沒有為每個文件提供唯一的物理文件名。您應該像這樣更改 tempdb:
use master go alter database tempdb modify file (name = tempdev, filename = 'S:\tempdev.mdf') go alter database tempdb modify file (name = templog, filename = 'S:\templog.ldf') go alter database tempdb modify file (name = tempdev2, filename = 'S:\tempdev2.mdf') go
ALTER DATABASE 文件和文件組選項的 Microsoft Docs聲明如下:
要將數據文件或日誌文件移動到新位置,請在 NAME 子句中指定目前邏輯文件名,並在 FILENAME 子句中指定新路徑和作業系統文件名。例如:
MODIFY FILE ( NAME = logical_file_name, FILENAME = ' new_path/os_file_name ' )
移動 TempDB 時,您需要完全按原樣指定文件名。
您的 SQL 實例已經使用文件名儲存了這個路徑,並且那裡有腳本可以生成程式碼,唯一的問題是:它們不引用文件名,通常而是引用數據庫實例名稱作為謂詞文件名,通常情況下數據庫和文件名不同。這很糟糕,因為文件名對於 TempDB 的執行至關重要,並且出現像你這樣的錯誤是讓 DBA 恐慌的快速方法。
在進行遷移時,我更改了一些公開可用的程式碼以規避 TempDB 的潛在問題。以下程式碼可能對您以後有用。
DECLARE @newDriveAndFolder VARCHAR(8000); SET @newDriveAndFolder = 'Z:\YourTempDBfolder'; --Make sure to fill this in SELECT [name] AS [Logical Name] ,physical_name AS [Current Location] ,state_desc AS [Status] ,size / 128 AS [Size(MB)] --Number of 8KB pages / 128 = MB ,'ALTER DATABASE tempdb MODIFY FILE (NAME = ' + QUOTENAME(f.[name]) + CHAR(9) /* Tab */ + ',FILENAME = ''' + @newDriveAndFolder+right(physical_name,charindex('\',reverse(physical_name))) + ''');' AS [Create new TempDB files] FROM sys.master_files f WHERE f.database_id = DB_ID(N'tempdb') ORDER BY f.[type];
這會查看原始字元串,獲取原始文件名以及目前副檔名。這意味著您應該能夠執行輸出並刪除文件。這是因為,在我的測試中,我們的一些 TempDB 文件是 NDF 並且原始程式碼沒有捕捉到它。
至於您目前的困境,您可以將實際的文件名插入到語句中,它應該會更新並且可以工作。