3
3
IF OBJECT_ID (' dbo.usp_AnalyzeSpaceCapacity' ) IS NULL
4
4
EXEC (' CREATE PROCEDURE dbo.usp_AnalyzeSpaceCapacity AS RETURN 0;' )
5
5
GO
6
+ -- EXEC tempdb..[usp_AnalyzeSpaceCapacity] @volumeInfo = 1
6
7
-- EXEC tempdb..[usp_AnalyzeSpaceCapacity] @getLogInfo = 1
7
8
-- EXEC tempdb..[usp_AnalyzeSpaceCapacity] @help = 1
8
9
-- EXEC [dbo].[usp_AnalyzeSpaceCapacity] @addDataFiles = 1 ,@newVolume = 'E:\Data1\' ,@oldVolume = 'E:\Data\' --,@forceExecute = 1
12
13
-- EXEC tempdb..[usp_AnalyzeSpaceCapacity] @expandTempDBSize = 1 ,@output4IdealScenario = 1
13
14
-- DECLARE @_errorOccurred BIT; EXEC @_errorOccurred = tempdb..[usp_AnalyzeSpaceCapacity] ; SELECT CASE WHEN @_errorOccurred = 1 THEN 'fail' ELSE 'pass' END AS [Pass/Fail];
14
15
ALTER PROCEDURE [dbo].[usp_AnalyzeSpaceCapacity]
15
- @getInfo TINYINT = 0 , @getLogInfo TINYINT = 0 , @help TINYINT = 0 , @addDataFiles TINYINT = 0 , @addLogFiles TINYINT = 0 , @restrictDataFileGrowth TINYINT = 0 , @restrictLogFileGrowth TINYINT = 0 , @generateCapacityException TINYINT = 0 , @unrestrictFileGrowth TINYINT = 0 , @removeCapacityException TINYINT = 0 , @UpdateMountPointSecurity TINYINT = 0 , @restrictMountPointGrowth TINYINT = 0 , @expandTempDBSize TINYINT = 0 , @optimizeLogFiles TINYINT = 0 ,
16
+ @getInfo TINYINT = 0 , @getLogInfo TINYINT = 0 , @volumeInfo TINYINT = 0 , @ help TINYINT = 0 , @addDataFiles TINYINT = 0 , @addLogFiles TINYINT = 0 , @restrictDataFileGrowth TINYINT = 0 , @restrictLogFileGrowth TINYINT = 0 , @generateCapacityException TINYINT = 0 , @unrestrictFileGrowth TINYINT = 0 , @removeCapacityException TINYINT = 0 , @UpdateMountPointSecurity TINYINT = 0 , @restrictMountPointGrowth TINYINT = 0 , @expandTempDBSize TINYINT = 0 , @optimizeLogFiles TINYINT = 0 ,
16
17
@newVolume VARCHAR (50 ) = NULL , @oldVolume VARCHAR (50 ) = NULL , @mountPointGrowthRestrictionPercent TINYINT = 79 , @tempDBMountPointPercent TINYINT = 89 , @DBs2Consider VARCHAR (1000 ) = NULL , @mountPointFreeSpaceThreshold_GB INT = 60
17
18
,@verbose TINYINT = 0 ,@testAllOptions TINYINT = 0 ,@forceExecute TINYINT = 0 ,@allowMultiVolumeUnrestrictedFiles TINYINT = 0 ,@output4IdealScenario TINYINT = 0
18
19
AS
19
20
BEGIN
20
21
/*
21
22
Created By: Ajay Dwivedi
22
- Updated on: 08-Aug-2017
23
+ Updated on: 16-Mar-2018
23
24
Current Ver: 3.3 - Add functionality to make modification only for specific databases using @DBs2Consider
24
25
25
26
Purpose: This procedure can be used to generate automatic TSQL code for working with ESCs like 'DBSEP2537- Data- Create and Restrict Database File Names' type.
26
- \\gdv01fil01\d101\dba\sqlserver\scripts\sql\Maintenance
27
27
*/
28
28
29
29
SET NOCOUNT ON ;
@@ -225,7 +225,7 @@ DECLARE @_logicalCores TINYINT
225
225
ELSE
226
226
SET @_LogOrData = ' Log' ;
227
227
228
- IF (@help= 1 OR @addDataFiles= 1 OR @addLogFiles= 1 OR @restrictDataFileGrowth= 1 OR @restrictLogFileGrowth= 1 OR @generateCapacityException= 1 OR @unrestrictFileGrowth= 1 OR @removeCapacityException= 1 OR @UpdateMountPointSecurity= 1 OR @restrictMountPointGrowth= 1 OR @expandTempDBSize= 1 OR @optimizeLogFiles= 1 )
228
+ IF (@help= 1 OR @volumeInfo = 1 OR @ addDataFiles= 1 OR @addLogFiles= 1 OR @restrictDataFileGrowth= 1 OR @restrictLogFileGrowth= 1 OR @generateCapacityException= 1 OR @unrestrictFileGrowth= 1 OR @removeCapacityException= 1 OR @UpdateMountPointSecurity= 1 OR @restrictMountPointGrowth= 1 OR @expandTempDBSize= 1 OR @optimizeLogFiles= 1 )
229
229
BEGIN
230
230
SET @getInfo = 0 ;
231
231
SET @getLogInfo = 0 ;
@@ -1176,11 +1176,14 @@ DECLARE @_logicalCores TINYINT
1176
1176
,(CASE WHEN growth = 0 THEN ' 0' WHEN is_percent_growth = 1 THEN CAST (growth AS VARCHAR (5 ))+ ' %'
1177
1177
ELSE CAST (CONVERT ( DECIMAL (20 ,2 ),((65536 * 8 .0 )/ 1024 .0 )) AS VARCHAR (20 ))+ ' (MB)'
1178
1178
END ) AS [growth(GB)]
1179
- ,name as [FileName] ,LEFT (physical_name, CHARINDEX (' \' ,physical_name,4 )) as [Volume]
1179
+ ,name as [FileName]
1180
+ ,v .Volume as [Volume]
1180
1181
FROM sys .master_files AS mf
1181
1182
INNER JOIN
1182
1183
T_FileGroup AS fg
1183
1184
ON mf .database_id = fg .database_id AND mf .data_space_id = fg .data_space_id
1185
+ OUTER APPLY
1186
+ ( SELECT v .Volume FROM @mountPointVolumes as v WHERE mf .physical_name LIKE (v .Volume + ' %' ) ) as v
1184
1187
WHERE mf .type_desc = ' ROWS'
1185
1188
)
1186
1189
,T_Files_Usage AS
@@ -1204,16 +1207,13 @@ DECLARE @_logicalCores TINYINT
1204
1207
,[freespace(GB)]
1205
1208
, [freespace(%)]
1206
1209
FROM @mountPointVolumes as v
1207
- WHERE v .Volume IN (SELECT DISTINCT [Volume] FROM T_Files_Filegroups)
1208
- OR v .Volume LIKE ' [A-Z]:\Data[0-9]\'
1209
- OR v .Volume LIKE ' [A-Z]:\Data[0-9][0-9]\'
1210
+ WHERE EXISTS (SELECT 1 FROM T_Files_Filegroups AS fg WHERE fg .Volume = v .Volume )
1210
1211
)
1211
1212
,T_Files AS
1212
1213
(
1213
1214
SELECT DB_ID , DB_Name , [TotalFilesSize(GB)], [FileGroup],
1214
- -- f.FileName+' (Growth by '+[growth(GB)]+')' AS FileSettings,
1215
1215
f.[FileName]+ ' (Size|% Used|AutoGrowth :: '+ size+ ' |'+ CAST ([% space used] AS VARCHAR (50 ))+ ' %|'+ [growth(GB)]+ ' )' AS FileSettings,
1216
- v .VolumeName + ' = '+ CAST ([freespace(GB)] AS VARCHAR (20 ))+ ' GB('+ CAST ([freespace(%)] AS VARCHAR (20 ))+ ' %) Free of '+ CAST ([capacity(GB)] AS VARCHAR (20 ))+ ' GB' as FileDrive
1216
+ v .VolumeName + ' [' + v . Volume + ' ]' + ' = '+ CAST ([freespace(GB)] AS VARCHAR (20 ))+ ' GB('+ CAST ([freespace(%)] AS VARCHAR (20 ))+ ' %) Free of '+ CAST ([capacity(GB)] AS VARCHAR (20 ))+ ' GB' as FileDrive
1217
1217
,f .growth , f.[growth(GB)], f.[FileName], v .Volume , [capacity(MB)], [freespace(MB)], VolumeName, [capacity(GB)], [freespace(GB)], [freespace(%)]
1218
1218
,ROW_NUMBER ()OVER (PARTITION BY v .Volume , f .DB_Name , f.[FileGroup] ORDER BY f.[file_id])AS FileID
1219
1219
FROM T_Files_Filegroups AS f
@@ -1320,13 +1320,38 @@ DECLARE @_logicalCores TINYINT
1320
1320
PRINT ' /* ******************** End: @getInfo = 1 *****************************/
1321
1321
1322
1322
' ;
1323
+
1323
1324
1324
1325
END -- End Block of @getInfo
1325
1326
1326
1327
-- ----------------------------------------------------------------------------
1327
1328
-- End: @getInfo = 1
1328
1329
-- ============================================================================
1329
1330
1331
+ -- ============================================================================
1332
+ -- Begin: @volumeInfo = 1
1333
+ -- ----------------------------------------------------------------------------
1334
+ IF @volumeInfo = 1
1335
+ BEGIN
1336
+ IF @verbose= 1
1337
+ PRINT '
1338
+ /* ******************** Begin: @volumeInfo = 1 *****************************/' ;
1339
+
1340
+ SELECT v .Volume , v .Label , v.[capacity(GB)], v.[freespace(GB)]
1341
+ ,[UsedSpace(GB)] = v.[capacity(GB)]- v.[freespace(GB)]
1342
+ ,v.[freespace(%)]
1343
+ ,[UsedSpace(%)] = 100 - v.[freespace(%)]
1344
+ FROM @mountPointVolumes AS v;
1345
+
1346
+ IF @verbose= 1
1347
+ PRINT '
1348
+ /* ******************** Begin: @volumeInfo = 1 *****************************/' ;
1349
+ END
1350
+ -- ----------------------------------------------------------------------------
1351
+ -- End: @volumeInfo = 1
1352
+ -- ============================================================================
1353
+
1354
+
1330
1355
1331
1356
-- ============================================================================
1332
1357
-- Begin: @getLogInfo = 1
@@ -1357,6 +1382,9 @@ DECLARE @_logicalCores TINYINT
1357
1382
PRINT ' Start Loop, and find VLFs for each log file of every db' ;
1358
1383
WHILE (@_loopCounter <= @_loopCounts)
1359
1384
BEGIN
1385
+ -- Truncate temp table
1386
+ TRUNCATE TABLE #stage;
1387
+
1360
1388
SELECT @_dbName = DBName FROM @Databases WHERE ID = @_loopCounter ;
1361
1389
SET @_loopSQLText = ' DBCC LOGINFO ('+ QUOTENAME (@_dbName)+ ' )
1362
1390
WITH NO_INFOMSGS;' ;
@@ -1394,10 +1422,14 @@ DECLARE @_logicalCores TINYINT
1394
1422
(
1395
1423
SELECT mf .database_id as [DB_ID], DB_NAME (mf .database_id ) AS [DB_Name], CASE WHEN d .is_read_only = 1 THEN ' Read_Only' ELSE DATABASEPROPERTYEX (DB_NAME (mf .database_id ), ' Status' ) END as DB_State
1396
1424
,[TotalFilesSize(GB)]
1397
- ,(CASE WHEN growth = 0 THEN ' 0' WHEN is_percent_growth = 1 THEN CAST (growth AS VARCHAR (5 ))+ ' %'
1398
- ELSE CAST (CONVERT ( DECIMAL (20 ,2 ),((65536 * 8 .0 )/ 1024 .0 )) AS VARCHAR (20 ))+ ' mb'
1399
- END ) AS [growth(GB)]
1400
- ,mf .name as [FileName] ,LEFT (physical_name, CHARINDEX (' \' ,physical_name,4 )) as [Volume]
1425
+ ,(CASE WHEN growth = 0
1426
+ THEN ' 0'
1427
+ WHEN is_percent_growth = 1
1428
+ THEN CAST (growth AS VARCHAR (5 ))+ ' %'
1429
+ ELSE CAST (CONVERT ( DECIMAL (20 ,2 ),((mf .growth * 8 .0 )/ 1024 .0 )) AS VARCHAR (20 ))+ ' mb'
1430
+ END ) AS [growth(GB)]
1431
+ ,mf .name as [FileName]
1432
+ ,v .Volume as [Volume]
1401
1433
,mf.*
1402
1434
,d .recovery_model_desc
1403
1435
FROM sys .master_files AS mf
@@ -1407,6 +1439,8 @@ DECLARE @_logicalCores TINYINT
1407
1439
LEFT JOIN
1408
1440
T_Files_Size AS l
1409
1441
ON l .database_id = mf .database_id
1442
+ OUTER APPLY
1443
+ ( SELECT v .Volume FROM @mountPointVolumes AS v WHERE mf .physical_name LIKE (v .Volume + ' %' ) ) AS v
1410
1444
WHERE mf .type_desc = ' LOG'
1411
1445
)
1412
1446
,T_Volumes_Derived AS
@@ -1419,16 +1453,15 @@ DECLARE @_logicalCores TINYINT
1419
1453
,[freespace(GB)]
1420
1454
,[freespace(%)]
1421
1455
FROM @mountPointVolumes as v
1422
- WHERE v . Volume IN (SELECT DISTINCT [Volume] FROM T_Files_Filegroups)
1423
- OR v .Volume LIKE ' [A-Z]:\LOG[S][0-9]\'
1424
- OR v .Volume LIKE ' [A-Z]:\LOG[S][0-9][0-9]\'
1456
+ WHERE EXISTS (SELECT * FROM T_Files_Filegroups AS fg WHERE v . Volume = fg.[Volume] )
1457
+ -- OR v.Volume LIKE '[A-Z]:\LOG[S][0-9]\'
1458
+ -- OR v.Volume LIKE '[A-Z]:\LOG[S][0-9][0-9]\'
1425
1459
)
1426
1460
,T_Files AS
1427
1461
(
1428
1462
SELECT DB_ID , DB_Name , [TotalFilesSize(GB)], DB_State,
1429
1463
f .FileName + ' (VLF_Count|Size|AutoGrowth :: '+ CAST (l .VLFCount AS VARCHAR (20 ))+ ' |'+ CAST (CONVERT (DECIMAL (20 ,2 ),((size* 8 .0 )/ 1024 / 1024 )) AS VARCHAR (20 ))+ ' gb|'+ [growth(GB)]+ ' )' AS FileSettings,
1430
- -- f.FileName+' (Growth by '+[growth(GB)]+') with '+CAST(l.VLFCount AS VARCHAR(20))+' VLFs' AS FileSettings,
1431
- v .VolumeName + ' = '+ CAST ([freespace(GB)] AS VARCHAR (20 ))+ ' GB('+ CAST ([freespace(%)] AS VARCHAR (20 ))+ ' %) Free of '+ CAST ([capacity(GB)] AS VARCHAR (20 ))+ ' GB' as FileDrive
1464
+ v .VolumeName + QUOTENAME (v .Volume )+ ' = '+ CAST ([freespace(GB)] AS VARCHAR (20 ))+ ' GB('+ CAST ([freespace(%)] AS VARCHAR (20 ))+ ' %) Free of '+ CAST ([capacity(GB)] AS VARCHAR (20 ))+ ' GB' as FileDrive
1432
1465
,growth, [growth(GB)], [FileName], l .VLFCount
1433
1466
,v .Volume , [capacity(MB)], [freespace(MB)], VolumeName, [capacity(GB)], [freespace(GB)], [freespace(%)]
1434
1467
,ROW_NUMBER ()OVER (PARTITION BY v .Volume , f .DB_Name ORDER BY f.[file_id]) AS FileID
@@ -1459,7 +1492,7 @@ DECLARE @_logicalCores TINYINT
1459
1492
IF @verbose = 1
1460
1493
BEGIN
1461
1494
PRINT ' SELECT * FROM #LogFiles;' ;
1462
- SELECT ' SELECT * FROM #LogFiles;' AS RunningQuery, * FROM #LogFiles;
1495
+ SELECT ' SELECT * FROM #LogFiles;' AS RunningQuery, * FROM #LogFiles ORDER BY DB_Name ;
1463
1496
END
1464
1497
1465
1498
IF @verbose = 1
0 commit comments