-
Notifications
You must be signed in to change notification settings - Fork 4
Expand file tree
/
Copy pathusp_GrowDatabases.sql
More file actions
157 lines (125 loc) · 4.33 KB
/
usp_GrowDatabases.sql
File metadata and controls
157 lines (125 loc) · 4.33 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
USE DBA;
GO
/*********************************************************************************
Name: dbo.usp_GrowDatabases
Author: Dan Denney
Purpose: This stored procedure will loop through all databases (except TempDB)
and compare the used space percentage against the GrowthThreshold
parameter. If the used space meets or exceeds the GrowthThreshold
then it will grow the database file by its default growth size.
Notes: @GrowthThreshold - Percentage of database used space at which
to grow the database (default is 80%).
Date Initials Description
----------------------------------------------------------------------------
2012-01-30 DDD Initial Release
----------------------------------------------------------------------------
*********************************************************************************
Usage:
EXEC dbo.usp_GrowDatabases
@GrowthThreshold = 75
*********************************************************************************/
CREATE PROC dbo.usp_GrowDatabases
@GrowthThreshold INT = 80
AS
SET NOCOUNT ON;
CREATE TABLE dbo.#Tbl_Logs
(
DatabaseName SYSNAME NULL,
LogSize DEC (10, 2) NULL,
LogSpaceUsedPercent DEC (5, 2) NULL,
[status] INT NULL,
Growth BIGINT NULL,
Is_Percent_Growth BIT NULL
);
CREATE TABLE dbo.#Tbl_DbFileStats
(
[ID] INT IDENTITY,
DatabaseName SYSNAME NULL,
FileId INT NULL,
[FileGroup] INT NULL,
TotalExtents BIGINT NULL,
UsedExtents BIGINT NULL,
LogicalName SYSNAME NULL,
[FileName] VARCHAR(255) NULL,
Growth BIGINT NULL,
IS_Percent_Growth BIT NULL
);
CREATE TABLE #tmp_DBFiles
(
DatabaseName SYSNAME NULL,
FileType BIT NULL,
LogicalName SYSNAME NULL,
Growth BIGINT NULL,
Is_Percent_Growth BIT NULL,
SIZE BIGINT NULL
);
INSERT INTO dbo.#Tbl_Logs (DatabaseName, LogSize, LogSpaceUsedPercent, [status])
EXEC ('DBCC SQLPERF (LOGSPACE) WITH NO_INFOMSGS');
EXEC master.sys.sp_MSforeachdb 'USE [?];
DECLARE @NEWID INT;
SELECT @NEWID = ISNULL(MAX([ID]),0) FROM #Tbl_DbFileStats;
INSERT INTO #Tbl_DbFileStats (FileId, FileGroup, TotalExtents, UsedExtents, LogicalName, FileName)
EXEC (''DBCC SHOWFILESTATS WITH NO_INFOMSGS'');
UPDATE #Tbl_DbFileStats
SET DatabaseName = ''[?]''
WHERE id between @NEWID + 1 and scope_identity();
UPDATE #Tbl_DbFileStats
SET Growth = sdb.Growth,
Is_Percent_Growth = sdb.Is_Percent_Growth
FROM #Tbl_DbFileStats dbfs
INNER JOIN sys.database_files sdb on dbfs.LogicalName = sdb.Name;
INSERT INTO #tmp_DBFiles (DatabaseName, FileType, LogicalName, Growth, Is_Percent_Growth, Size)
SELECT ''?'', [Type], Name, Growth, Is_Percent_Growth, Size
FROM sys.database_files;
';
DECLARE @DBName NVARCHAR(100),
@LogicalName NVARCHAR(200),
@FileSize BIGINT,
@UsedPCT DEC(12,8),
@Growth BIGINT,
@Grwth_PCT BIT,
@NewSize NVARCHAR(20),
@SQL NVARCHAR(1000);
SET @LogicalName = '';
WHILE 1=1
BEGIN
SELECT TOP 1
@DBName = a.DatabaseName,
@LogicalName = a.LogicalName,
@FileSize = a.Size,
@UsedPCT = a.PCT_Used,
@Growth = a.Growth,
@Grwth_PCT = a.Is_Percent_Growth
FROM
(
SELECT dbf.*,
((UsedExtents * 1.0) / TotalExtents) * 100 AS PCT_Used
FROM #tmp_DBFiles dbf
INNER JOIN #Tbl_DbFileStats dbfs ON dbf.LogicalName = dbfs.LogicalName
WHERE dbf.FileType = 0
UNION ALL
SELECT dbf.*,
LogSpaceUsedPercent AS PCT_Used
FROM #tmp_DBFiles dbf
INNER JOIN #Tbl_Logs l ON dbf.DatabaseName = l.DatabaseName
WHERE dbf.FileType = 1
) a
WHERE LogicalName > @LogicalName
ORDER BY LogicalName ASC, FileType ASC;
IF @@ROWCOUNT = 0
BREAK;
IF @UsedPCT > @GrowthThreshold
BEGIN
IF @Grwth_PCT = 0
SET @NewSize = CAST(ROUND(((@FileSize + @Growth) * 8) / 1024, 0) AS INT);
ELSE
SET @NewSize = CAST(ROUND( @FileSize + (@FileSize * (@Growth *.10)),0) AS INT);
SET @SQL = 'ALTER DATABASE [' + @DbName + '] MODIFY FILE (name = ' + @LogicalName + ', SIZE = ' + @NewSize + 'MB);'
PRINT @SQL;
EXEC sp_executesql @SQL;
END;
END; -- WHILE 1=1
DROP TABLE #Tbl_Logs;
DROP TABLE #Tbl_DbFileStats;
DROP TABLE #tmp_DBFiles;
GO