Sql-Server

移動了“tempdb”,現在文件“tempdev2”不存在

  • May 11, 2021

我首先移動了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”不存在。

有任何想法嗎?tempdevtemplog都很好,只是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 並且原始程式碼沒有捕捉到它。

至於您目前的困境,您可以將實際的文件名插入到語句中,它應該會更新並且可以工作。

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