SQL Server : déplacer les fichiers du tempdb

Sous SQL Server, la base système tempdb sert à disposer d’un espace de stockage pour y créer des tables temporaires et aussi faire des opérations de tris, de regroupement dans l’exécution des requêtes. Installer cette base dans le dossier par défaut est donc une très mauvaise idée.

La création du répertoire

Sous l’interpréteur de commandes Windows (cmd.exe), créez tout d’abord votre répertoire d’accueil des fichiers associés au tempdb :

md e:\tempdb

Pensez à ce que les utilisateurs NT Service\MSSQLSERVER et NT Service\SQLSERVERAGENT aient des droits en écriture sur ce répertoire fraîchement créé.

La création de la procédure stockée move_tempdb

Je l’ai créée dans la base msdb :

CREATE PROCEDURE move_tempdb(@dest VARCHAR(MAX))
AS
BEGIN
	-- Déclaration du curseur des fichiers associés à la base système tempdb
	DECLARE cursor_Files CURSOR FOR
		SELECT name,physical_name FROM tempdb.sys.database_files;
	-- Déclaration des variables utilisées par la procédure stockée
	DECLARE @name VARCHAR(MAX);
	DECLARE @path VARCHAR(MAX);
	-- DECLARE @dest VARCHAR(MAX) = 'e:\tempdb';
	DECLARE @file VARCHAR(MAX);
	DECLARE @pos INT;
	DECLARE @newpath VARCHAR(MAX);
	DECLARE @sql VARCHAR(MAX);
	OPEN cursor_Files;
	FETCH NEXT FROM cursor_Files INTO @name,@path;
	WHILE @@FETCH_STATUS <> -1
	BEGIN
		-- Extraction du nom de fichier du chemin
		SET @pos=CHARINDEX('\',REVERSE(@path));
		PRINT @pos;
		SET @file=RIGHT(@path,@pos)
		PRINT @file;
		SET @newpath=@dest+@file;
		-- Exécution de l'instruction SQL pour déplacer les fichiers
		SET @sql='ALTER DATABASE tempdb MODIFY FILE (NAME =''' + @name+ ''', FILENAME=''' + @newpath + ''')';
		PRINT @sql;
		EXECUTE (@sql);
		FETCH NEXT FROM cursor_Files INTO @name,@path;
	END;
	CLOSE cursor_Files;
	DEALLOCATE cursor_Files;
END;
GO 

Exécution de la procédure stockée

Vous pouvez exécuter votre procédure stockée sans ou avec l’instruction EXEC :

EXEC msdb.dbo.move_tempdb
	@dest='e:\tempdb';
EXEC msdb.dbo.move_tempdb 'e:\tempdb';
msdb.dbo.move_tempdb 'e:\tempdb';
msdb.dbo.move_tempdb
	@dest='e:\tempdb';

La prise en compte du déplacement des fichiers du tempdb se produit à l’occasion du redémarrage de l’instance SQL Server.

Variante : le bloc Transact-SQL

Vous pouvez faire le choix d’exécuter un bloc Transact-SQL en ayant comme constante  le répertoire de destination dans le code. De cette façon, vous pouvez l’exécuter dans un job.

-- Déclaration du curseur des fichiers associés à la base système tempdb
DECLARE cursor_Files CURSOR FOR
	SELECT name,physical_name FROM tempdb.sys.database_files;
-- Déclaration des variables utilisées par la procédure stockée
DECLARE @name VARCHAR(MAX);
DECLARE @path VARCHAR(MAX);
DECLARE @dest VARCHAR(MAX) = 'e:\tempdb';
DECLARE @file VARCHAR(MAX);
DECLARE @pos INT;
DECLARE @newpath VARCHAR(MAX);
DECLARE @sql VARCHAR(MAX);
OPEN cursor_Files;
FETCH NEXT FROM cursor_Files INTO @name,@path;
WHILE @@FETCH_STATUS <> -1
BEGIN
	-- Extraction du nom de fichier du chemin
	SET @pos=CHARINDEX('\',REVERSE(@path));
	PRINT @pos;
	SET @file=RIGHT(@path,@pos)
	PRINT @file;
	SET @newpath=@dest+@file;
	-- Exécution de l'instruction SQL pour déplacer les fichiers
	SET @sql='ALTER DATABASE tempdb MODIFY FILE (NAME =''' + @name+ ''', FILENAME=''' + @newpath + ''')';
	PRINT @sql;
	EXECUTE (@sql);
	FETCH NEXT FROM cursor_Files INTO @name,@path;
END;
CLOSE cursor_Files;
DEALLOCATE cursor_Files;
GO
 

MSSQL /