安全地移动和创建新的tempdb文件


Answers:


22

要移动tempdb文件,只需执行以下操作:

alter database tempdb
modify file
(
    name = tempdev,
    filename = 'C:\YourNewTempdbDir\tempdb.mdf'
)
go

alter database tempdb
modify file
(
    name = templog,
    filename = 'C:\YourNewTempdbDir\templog.ldf'
)
go

如果您要向添加新文件tempdb,只需执行以下操作(前提是您想将其添加到PRIMARY文件组或创建自己的文件组):

alter database tempdb
add file
(
    name = tempdb2,
    filename = 'C:\YourNewTempdbDir\Tempdb2.ndf'
)
go

为了使这些更改生效,您将需要重新启动SQL Server服务。因此,就最大限度地减少停机时间而言,您受到服务重启所需的时间的限制。您不必担心移动预先存在的tempdb数据库文件,因为SQL Server始终会重新创建文件,并且在服务启动时将创建新的位置/文件。

对于“每个内核1个tempdb数据文件”,这在很大程度上是一个神话。正确的方法是监视tempdb页面可用空间(PFS),全局分配图(GAM)和共享全局分配图(SGAM)页面的文件争用。请参考本文以获得 通过DMV进行查询的查询(替代链接)sys.dm_os_waiting_tasks以查看tempdb有多少文件争用。然后,您需要解决这个问题,而不是仅仅覆盖tempdb与内核相同数量的文件。这是更明智的方法。



4

根据微软的建议

通常,如果逻辑处理器的数量小于或等于8,请使用与逻辑处理器相同数量的数据文件。

如果逻辑处理器的数量大于8,则使用8个数据文件,然后如果争用继续进行,请将数据文件的数量增加4的倍数(最多为逻辑处理器的数量),直到争用减少到可接受的水平或更改工作负载/代码。

移动TempDB文件是一个两步过程:

  1. 告诉SQL 哪里你希望你的新TempDB文件去(这并不一定停机)
  2. 重新启动SQL Server服务,以使更改生效(这是最短的停机时间,你需要)

要告诉SQL在哪里创建新的TempDB文件,可以使用:

DECLARE @newDriveAndFolder VARCHAR(8000);

SET @newDriveAndFolder = 'Z:\YourTempDBfolder';

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 + CHAR(92) /* Backslash */ + f.[name]
    + CASE WHEN f.[type] = 1 /* Log */ THEN '.ldf' ELSE '.mdf' END  + ''''
    + ');'
    AS [Create new TempDB files]
FROM sys.master_files f
WHERE f.database_id = DB_ID(N'tempdb')
ORDER BY f.[type];

这将生成您需要运行的T-SQL语句,以将文件移动到所需的新文件drive:\folder。(点击图片放大)

该图显示了两行,其中包含有关TempDB文件和用于移动它们的T-SQL语句的详细信息

在运行移动语句后,可以再次运行上述查询,以检查该Current Location列现在是否显示new drive:\folder

该图显示了TempDB文件的新位置

对更改满意后,请重新启动SQL Server服务

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.