Files
sql-scripts/TPDT-268 - ACP in task sequence/dba_storedProcedures/Set_TempDB.sql
2024-03-07 16:52:14 +01:00

229 lines
7.6 KiB
Transact-SQL

IF EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[Set_TempDB]') AND type in (N'P', N'PC'))
DROP PROCEDURE [dbo].[Set_TempDB]
GO
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE PROCEDURE [dbo].[Set_TempDB]
@in_debug int = null,
@in_Entity varchar(4),
@in_Mode smallint = 1
AS
/*=============================================================================
Explication du traitement realise par la SP
-------------------------------------------
Cette SP sert à paramètrer les fichiers de tempDB et les resizer correctement en fonction du nombre de CPU
Contexte d'utilisation
----------------------
Cette SP peut être appelé dans SSMS pour l'initalisation de tempDB
Cette SP est appelé par le job _9402X - FLA -Redefine TempDB file Size
Parametres
----------
@in_debug : affiche les commandes qui vont être executées
@in_Entity : SUN, AMA, AAI, CVI, RUEG
@in_Mode : 0 = init de tempDB, 1 = Mise à jour de la taille des fichiers de tempDB
Creation : 01.11.16 / FLA
Modifications : 09.01.2017 / FLA : Ajout de CVI
07.02.2017 / RTC : Update AAI initial file size
13.03.2017 / RTC : Update initial file size for AAI from 256 to 384.
29.03.2017 / RTC : Update initial file size for AAI to 512 and auto growth to 128.
20.12.2018 / SPE : #TFS49408# Migrate identification table [master].[cfg].[Identity]
02.10.2019 / SPE : #TFS55659# change tempdb initial size 1056
16.10.2019 / SPE : #TFS55659# change tempdb initial size 1152
23.10.2019 / SPE : #TFS55659# change tempdb initial size 1280 (GC) 1024 (AAI)
09.12.2019 / SPE : Change templog initial size to 2048 for GC
=============================================================================*/
set nocount on;
/*------------------- Declaration des variables --------------------*/
declare @NbCPU INT,
@AutoGrow INT,
@FileSize INT,
@LogicalName VARCHAR(255),
@PhysicalName VARCHAR(255),
@FilePath VARCHAR(255),
@i INT,
@sql VARCHAR(255),
@file_id INT,
@FileName VARCHAR(255),
@LogAutoGrow INT,
@LogFileSize INT,
@cmd varchar(200);
/*------------ Affectation des parametres aux variables ------------*/
IF ((@in_Entity = 'AAI') or (@in_Entity = 'RUEG'))
BEGIN
/*in MB */
SET @AutoGrow = 128;
SET @FileSize = 1024;
SET @LogFileSize = 1024;
SET @LogAutoGrow = 128;
END
ELSE
BEGIN
/*in MB */
SET @AutoGrow = 128;
SET @FileSize = 1280;
SET @LogFileSize = 2048;
SET @LogAutoGrow = 256;
END
SET @i = 2;
/*-------------------------- Traitement ---------------------------*/
BEGIN TRY
IF (SELECT ((size*8)/1024) as SIZE_IN_MB from sys.master_files where database_id=2 and Name = 'tempdev') > @FileSize
BEGIN
PRINT 'Current tempdb FileSize is larger than the variable @FileSize! Leave this SP.'
RETURN
END
IF @in_Mode = 0
BEGIN
/*********************************************************************************************************************************/
/* Ce script créer automatiquement des fichiers tempDB sizé à l'identique en fonction du nombre de CPU, de l'espace disk etc... */
/*********************************************************************************************************************************/
/* Check if tempDB is already sized*/
IF (select count(file_id)
FROM tempdb.sys.dm_db_file_space_usage) <= 1
BEGIN
/* Get get actual tempDB file size and path for tempDB file*/
SELECT @PhysicalName = physical_name,
@LogicalName = name
FROM tempdb.sys.database_files
WHERE type = 0
SET @FilePath = REVERSE(RIGHT(REVERSE(@PhysicalName),(LEN(@PhysicalName)-CHARINDEX('\', REVERSE(@PhysicalName),1))+1));
SET @PhysicalName = SUBSTRING(@PhysicalName,LEN(@FilePath)+1,LEN(@PhysicalName)-LEN(@FilePath)-4);
/* Get number of CPU */
SELECT @NbCPU = cpu_count
FROM sys.dm_os_sys_info
/* Check if CPU >= 8 */
IF @NbCPU >= 8
BEGIN
SET @NbCPU = 8
END
WHILE (@i <= @NbCPU)
BEGIN
SET @sql = 'ALTER DATABASE [tempdb] ADD FILE ( NAME = N'''+ @LogicalName + CONVERT(VARCHAR(1),@i)+''' , FILENAME = N'''+ @FilePath + @PhysicalName +CONVERT(VARCHAR(1),@i)+'.ndf'', SIZE = '+ CONVERT(VARCHAR(20),@FileSize) +' , FILEGROWTH = '+ CONVERT(VARCHAR(20),@AutoGrow) +')'
IF @in_debug = 1
PRINT @sql
ELSE
EXEC(@sql)
SET @i = @i+1
END
END
ELSE
PRINT 'TempDB is already sized';
/*********************************************************************************************************************************/
/* Ce script shrink et resize automatiquement le fichiers de log de tempDB en fonction des paramètres en entrée */
/*********************************************************************************************************************************/
/* Get File id and file path of tempDB log file */
SELECT @file_id = file_id,
@FilePath = physical_name,
@FileName = name
FROM tempdb.sys.database_files
WHERE type = 1
SET @cmd = 'USE tempDB;
/* SHRINK the tempDB file log */
DBCC SHRINKFILE ('+CAST(@file_id as varchar(3))+') WITH NO_INFOMSGS';
EXEC (@cmd)
/* Change the size of tempDB log file */
SET @sql = 'ALTER DATABASE [tempdb] MODIFY FILE ( NAME = N'''+ @FileName + ''', FILENAME = N'''+ @FilePath + ''', SIZE = '+ CONVERT(VARCHAR(20),@LogFileSize) +' , FILEGROWTH = '+ CONVERT(VARCHAR(20),@LogAutoGrow) +')'
IF @in_debug = 1
PRINT @sql
ELSE
EXEC(@sql)
END
ELSE IF @in_Mode = 1
BEGIN
DECLARE c_Files CURSOR FOR
SELECT file_id,
physical_name,
name
FROM tempdb.sys.database_files
WHERE type = 0
open c_Files
FETCH NEXT FROM c_Files
into @file_id, @FilePath, @FileName
WHILE @@FETCH_STATUS = 0
BEGIN
SET @cmd = 'USE tempDB;
/* SHRINK the tempDB file log */
DBCC SHRINKFILE ('+CAST(@file_id as varchar(3))+') WITH NO_INFOMSGS';
EXEC (@cmd)
/* Change the size of tempDB file */
SET @sql = 'ALTER DATABASE [tempdb] MODIFY FILE ( NAME = N'''+ @FileName + ''', FILENAME = N'''+ @FilePath + ''', SIZE = '+ CONVERT(VARCHAR(20),@FileSize) +' , FILEGROWTH = '+ CONVERT(VARCHAR(20),@AutoGrow) +')'
IF @in_debug = 1
PRINT @sql
ELSE
EXEC(@sql)
FETCH NEXT FROM c_Files
into @file_id, @FilePath, @FileName
END
CLOSE c_Files
DEALLOCATE c_Files
IF @in_Entity = 'SUN'
EXEC msdb.dbo.sp_update_job @job_name='_94021 - Redefine TempDB file Size',@enabled = 0
IF @in_Entity = 'AMA'
EXEC msdb.dbo.sp_update_job @job_name='_94022 - Redefine TempDB file Size',@enabled = 0
IF @in_Entity = 'AAI'
EXEC msdb.dbo.sp_update_job @job_name='_94023 - Redefine TempDB file Size',@enabled = 0
IF @in_Entity = 'RUEG'
EXEC msdb.dbo.sp_update_job @job_name='_94023 - Redefine TempDB file Size',@enabled = 0
IF @in_Entity = 'CVI'
EXEC msdb.dbo.sp_update_job @job_name='_94024 - Redefine TempDB file Size',@enabled = 0
END
/*---------------------- Traitement des erreurs ----------------------*/
END TRY
BEGIN CATCH
/* Traitement des erreurs (avec RaiseError) */
EXEC dbo.get_Error_Info;
END CATCH
GO