--批量修改非系统数据库的数据文件的增长大小
--FILEGROWTH = 51200KB 这个值表示每次增长大小
SET NOCOUNT ON
DECLARE @i INT,@iMax INT,@dbName NVARCHAR(200), @sqlTotal NVARCHAR(MAX),@sqlSingle NVARCHAR(MAX),@sql NVARCHAR(MAX)
DECLARE @t TABLE (rowNum INT IDENTITY(1,1), dbName NVARCHAR(200))
INSERT INTO @t (dbName)
SELECT d.name FROM sys.databases AS d WHERE d.name NOT IN ('master','tempdb','model','msdb')
SELECT @i=1,@iMax=MAX(rowNum),@sqlTotal='',@sqlSingle='' FROM @t
WHILE @i<=@iMax
BEGIN
SELECT @dbName=dbName FROM @t WHERE rowNum=@i
SET @sql='use '+@dbName+' SET @sqlSingle= (SELECT ''ALTER DATABASE ['+@dbName+'] MODIFY FILE ( NAME = N{''+s.name+''}, FILEGROWTH = 51200KB );'' FROM sys.sysfiles s FOR XML PATH('''') )'
EXEC sys.sp_executesql @sql, N'@sqlSingle nvarchar(max) out', @sqlSingle OUT
SET @sqlTotal=@sqlTotal+@sqlSingle
SET @i=@i+1
END
SET @sqlTotal=REPLACE(REPLACE( REPLACE(@sqlTotal,';','
'),'{',''''),'}','''')
PRINT @sqlTotal
EXEC (@sqlTotal)
#2
数据库文件 选默认值 就行了 10~15%,占用太多空间没用是浪费
#3
谢谢楼上两位的指点,按照1楼的方法已成功解决,非常感谢!
#4
给分结贴吧,
#5
昨天改好了,今天发现又变成5400%的自动增长,这是怎么回事
#6
--创建一个新表, 专门用于监控数据文件的变化
IF OBJECT_ID('dbo.dbLogWarning','U') IS NOT NULL
DROP TABLE dbo.dbLogWarning
GO
CREATE TABLE dbLogWarning(
execTime DATETIME,
Warning BIT,
[文件名称] VARCHAR(128),
[文件设置大小(MB)] DECIMAL(12),
[文件所占空间(MB)] DECIMAL(12),
[所占空间率%] DECIMAL(12, 1),
[增长模式] VARCHAR(128),
[增量模式] VARCHAR(128),
[增长值(%或MB)] VARCHAR(128),
[文件所在目录] VARCHAR(256),
[文件类型] VARCHAR(20)
)
GO
IF EXISTS(SELECT 1 FROM SYS.objects o WHERE o.[object_id]=OBJECT_ID(N'[dbo].[Proc_DBA_DbLogWarning]') AND TYPE IN (N'P',N'PC'))
DROP PROCEDURE [dbo].[Proc_DBA_DbLogWarning]
GO
-- =============================================
-- Author: yng
-- Create date: 2015-01-10
-- Description: 日志占比预警
-- =============================================
CREATE PROCEDURE [dbo].[Proc_DBA_DbLogWarning]
(
@dbSizeMB_Warning INT=102400, --数据库的大小(数据+)至少是多少MB才预警, 满足(@dbSizeMB_Warning 和 @logSizeMB_Warning)而且满足下面2个百分比条件其中之一才能预警。默认为 102400 (100GB)
@logSizeMB_Warning INT=51200, --日志的大小至少是多少MB才预警, 满足(@dbSizeMB_Warning 和 @logSizeMB_Warning)而且满足下面2个百分比条件其中之一才能预警。默认为 51200 (50GB)
@logDataPercent INT=60, --当前库中,日志与数据的百分比超过多少时则预警。默认为 60
@logUsedPercent INT=80 --当前库中,日志所占空间已使用的百分比超过多少时则预警。默认为 80
)
AS
BEGIN
SET NOCOUNT ON
DECLARE @t TABLE(Warning BIT,[文件名称] VARCHAR(128),[文件设置大小(MB)] DECIMAL(12),[文件所占空间(MB)] DECIMAL(12),[所占空间率%] DECIMAL(12,1),[增长模式] VARCHAR(128) ,[增量模式] VARCHAR(128),[增长值(%或MB)] VARCHAR(128),[文件所在目录] VARCHAR(256),[文件类型] varchar(20))
INSERT @t(Warning ,[文件名称] ,[文件设置大小(MB)],[文件所占空间(MB)],[所占空间率%] ,[增长模式] ,[增量模式],[增长值(%或MB)] ,[文件所在目录], [文件类型])
SELECT
0
,a.name [文件名称]
,cast(a.[size]*1.0/128 as decimal(12,1)) AS [文件设置大小(MB)]
,CAST( fileproperty(s.name,'SpaceUsed')/(8*16.0) AS DECIMAL(12,1)) AS [文件所占空间(MB)]
,CAST( (fileproperty(s.name,'SpaceUsed')/(8*16.0))/(s.size/(8*16.0))*100.0 AS DECIMAL(12,1)) AS [所占空间率%]
,CASE WHEN A.growth =0 THEN '文件大小固定,不会增长' ELSE '文件将自动增长' end [增长模式]
,CASE WHEN A.growth > 0 AND is_percent_growth = 0 THEN '增量为固定大小'
WHEN A.growth > 0 AND is_percent_growth = 1 THEN '增量将用整数百分比表示'
ELSE '文件大小固定,不会增长' END AS [增量模式]
,CASE WHEN A.growth > 0 AND is_percent_growth = 0 THEN cast(cast(a.growth*1.0/128as decimal(12,0)) AS VARCHAR)+'MB'
WHEN A.growth > 0 AND is_percent_growth = 1 THEN cast(cast(a.growth AS decimal(12,0)) AS VARCHAR)+'%'
ELSE '文件大小固定,不会增长' end AS [增长值(%或MB)]
,a.physical_name AS [文件所在目录]
,a.type_desc AS [文件类型]
FROM sys.database_files a
INNER JOIN sys.sysfiles AS s ON a.[file_id]=s.fileid
LEFT JOIN sys.dm_db_file_space_usage b ON a.[file_id]=b.[file_id]
ORDER BY a.[type]
DECLARE @logSizeMB INT,@dataSizeMB INT
SELECT @logSizeMB = SUM(A.[文件所占空间(MB)]) from @t as a where a.[文件类型]='LOG'
SELECT @dataSizeMB = SUM(A.[文件所占空间(MB)]) from @t as a where a.[文件类型]!='LOG'
--如果
--1. 总大小 > 预警值
--2. 日志大小 > 日志预警值
--2. 日志/数据 百分比 > 预警百分比 或 日志所占空间率 > 预警占用百分比
IF ((@logSizeMB+@dataSizeMB) > @dbSizeMB_Warning)
AND
( @logSizeMB > @logSizeMB_Warning )
AND
(
(@logSizeMB/@dataSizeMB)> (@logDataPercent/100.0)
or
EXISTS(SELECT * FROM @t AS a WHERE a.[文件类型]='LOG' and a.[所占空间率%] > @logUsedPercent )
)
BEGIN
UPDATE @t SET Warning = 1
END
INSERT INTO dbLogWarning
(
[execTime],
[Warning],
文件名称,
[文件设置大小(MB)],
[文件所占空间(MB)],
[所占空间率%],
[增长模式],
[增量模式],
[增长值(%或MB)],
[文件所在目录],
[文件类型]
)
SELECT
GETDATE(),
[Warning],
文件名称,
[文件设置大小(MB)],
[文件所占空间(MB)],
[所占空间率%],
[增长模式],
[增量模式],
[增长值(%或MB)],
[文件所在目录],
[文件类型] FROM @t
END
GO
EXEC sys.sp_addextendedproperty
@name=N'Version', @value=N'4.0' ,
@level0type=N'SCHEMA',@level0name=N'dbo',
@level1type=N'PROCEDURE',@level1name=N'Proc_DBA_DbLogWarning'
--批量修改非系统数据库的数据文件的增长大小
--FILEGROWTH = 51200KB 这个值表示每次增长大小
SET NOCOUNT ON
DECLARE @i INT,@iMax INT,@dbName NVARCHAR(200), @sqlTotal NVARCHAR(MAX),@sqlSingle NVARCHAR(MAX),@sql NVARCHAR(MAX)
DECLARE @t TABLE (rowNum INT IDENTITY(1,1), dbName NVARCHAR(200))
INSERT INTO @t (dbName)
SELECT d.name FROM sys.databases AS d WHERE d.name NOT IN ('master','tempdb','model','msdb')
SELECT @i=1,@iMax=MAX(rowNum),@sqlTotal='',@sqlSingle='' FROM @t
WHILE @i<=@iMax
BEGIN
SELECT @dbName=dbName FROM @t WHERE rowNum=@i
SET @sql='use '+@dbName+' SET @sqlSingle= (SELECT ''ALTER DATABASE ['+@dbName+'] MODIFY FILE ( NAME = N{''+s.name+''}, FILEGROWTH = 51200KB );'' FROM sys.sysfiles s FOR XML PATH('''') )'
EXEC sys.sp_executesql @sql, N'@sqlSingle nvarchar(max) out', @sqlSingle OUT
SET @sqlTotal=@sqlTotal+@sqlSingle
SET @i=@i+1
END
SET @sqlTotal=REPLACE(REPLACE( REPLACE(@sqlTotal,';','
'),'{',''''),'}','''')
PRINT @sqlTotal
EXEC (@sqlTotal)
#2
数据库文件 选默认值 就行了 10~15%,占用太多空间没用是浪费
#3
谢谢楼上两位的指点,按照1楼的方法已成功解决,非常感谢!
#4
谢谢楼上两位的指点,按照1楼的方法已成功解决,非常感谢!
给分结贴吧,
#5
谢谢楼上两位的指点,按照1楼的方法已成功解决,非常感谢!
给分结贴吧,
昨天改好了,今天发现又变成5400%的自动增长,这是怎么回事
#6
--创建一个新表, 专门用于监控数据文件的变化
IF OBJECT_ID('dbo.dbLogWarning','U') IS NOT NULL
DROP TABLE dbo.dbLogWarning
GO
CREATE TABLE dbLogWarning(
execTime DATETIME,
Warning BIT,
[文件名称] VARCHAR(128),
[文件设置大小(MB)] DECIMAL(12),
[文件所占空间(MB)] DECIMAL(12),
[所占空间率%] DECIMAL(12, 1),
[增长模式] VARCHAR(128),
[增量模式] VARCHAR(128),
[增长值(%或MB)] VARCHAR(128),
[文件所在目录] VARCHAR(256),
[文件类型] VARCHAR(20)
)
GO
IF EXISTS(SELECT 1 FROM SYS.objects o WHERE o.[object_id]=OBJECT_ID(N'[dbo].[Proc_DBA_DbLogWarning]') AND TYPE IN (N'P',N'PC'))
DROP PROCEDURE [dbo].[Proc_DBA_DbLogWarning]
GO
-- =============================================
-- Author: yng
-- Create date: 2015-01-10
-- Description: 日志占比预警
-- =============================================
CREATE PROCEDURE [dbo].[Proc_DBA_DbLogWarning]
(
@dbSizeMB_Warning INT=102400, --数据库的大小(数据+)至少是多少MB才预警, 满足(@dbSizeMB_Warning 和 @logSizeMB_Warning)而且满足下面2个百分比条件其中之一才能预警。默认为 102400 (100GB)
@logSizeMB_Warning INT=51200, --日志的大小至少是多少MB才预警, 满足(@dbSizeMB_Warning 和 @logSizeMB_Warning)而且满足下面2个百分比条件其中之一才能预警。默认为 51200 (50GB)
@logDataPercent INT=60, --当前库中,日志与数据的百分比超过多少时则预警。默认为 60
@logUsedPercent INT=80 --当前库中,日志所占空间已使用的百分比超过多少时则预警。默认为 80
)
AS
BEGIN
SET NOCOUNT ON
DECLARE @t TABLE(Warning BIT,[文件名称] VARCHAR(128),[文件设置大小(MB)] DECIMAL(12),[文件所占空间(MB)] DECIMAL(12),[所占空间率%] DECIMAL(12,1),[增长模式] VARCHAR(128) ,[增量模式] VARCHAR(128),[增长值(%或MB)] VARCHAR(128),[文件所在目录] VARCHAR(256),[文件类型] varchar(20))
INSERT @t(Warning ,[文件名称] ,[文件设置大小(MB)],[文件所占空间(MB)],[所占空间率%] ,[增长模式] ,[增量模式],[增长值(%或MB)] ,[文件所在目录], [文件类型])
SELECT
0
,a.name [文件名称]
,cast(a.[size]*1.0/128 as decimal(12,1)) AS [文件设置大小(MB)]
,CAST( fileproperty(s.name,'SpaceUsed')/(8*16.0) AS DECIMAL(12,1)) AS [文件所占空间(MB)]
,CAST( (fileproperty(s.name,'SpaceUsed')/(8*16.0))/(s.size/(8*16.0))*100.0 AS DECIMAL(12,1)) AS [所占空间率%]
,CASE WHEN A.growth =0 THEN '文件大小固定,不会增长' ELSE '文件将自动增长' end [增长模式]
,CASE WHEN A.growth > 0 AND is_percent_growth = 0 THEN '增量为固定大小'
WHEN A.growth > 0 AND is_percent_growth = 1 THEN '增量将用整数百分比表示'
ELSE '文件大小固定,不会增长' END AS [增量模式]
,CASE WHEN A.growth > 0 AND is_percent_growth = 0 THEN cast(cast(a.growth*1.0/128as decimal(12,0)) AS VARCHAR)+'MB'
WHEN A.growth > 0 AND is_percent_growth = 1 THEN cast(cast(a.growth AS decimal(12,0)) AS VARCHAR)+'%'
ELSE '文件大小固定,不会增长' end AS [增长值(%或MB)]
,a.physical_name AS [文件所在目录]
,a.type_desc AS [文件类型]
FROM sys.database_files a
INNER JOIN sys.sysfiles AS s ON a.[file_id]=s.fileid
LEFT JOIN sys.dm_db_file_space_usage b ON a.[file_id]=b.[file_id]
ORDER BY a.[type]
DECLARE @logSizeMB INT,@dataSizeMB INT
SELECT @logSizeMB = SUM(A.[文件所占空间(MB)]) from @t as a where a.[文件类型]='LOG'
SELECT @dataSizeMB = SUM(A.[文件所占空间(MB)]) from @t as a where a.[文件类型]!='LOG'
--如果
--1. 总大小 > 预警值
--2. 日志大小 > 日志预警值
--2. 日志/数据 百分比 > 预警百分比 或 日志所占空间率 > 预警占用百分比
IF ((@logSizeMB+@dataSizeMB) > @dbSizeMB_Warning)
AND
( @logSizeMB > @logSizeMB_Warning )
AND
(
(@logSizeMB/@dataSizeMB)> (@logDataPercent/100.0)
or
EXISTS(SELECT * FROM @t AS a WHERE a.[文件类型]='LOG' and a.[所占空间率%] > @logUsedPercent )
)
BEGIN
UPDATE @t SET Warning = 1
END
INSERT INTO dbLogWarning
(
[execTime],
[Warning],
文件名称,
[文件设置大小(MB)],
[文件所占空间(MB)],
[所占空间率%],
[增长模式],
[增量模式],
[增长值(%或MB)],
[文件所在目录],
[文件类型]
)
SELECT
GETDATE(),
[Warning],
文件名称,
[文件设置大小(MB)],
[文件所占空间(MB)],
[所占空间率%],
[增长模式],
[增量模式],
[增长值(%或MB)],
[文件所在目录],
[文件类型] FROM @t
END
GO
EXEC sys.sp_addextendedproperty
@name=N'Version', @value=N'4.0' ,
@level0type=N'SCHEMA',@level0name=N'dbo',
@level1type=N'PROCEDURE',@level1name=N'Proc_DBA_DbLogWarning'