对于“Value”无效,“value”应介于 ‘Minimum’和’Maximum’之间。。。

时间:2021-04-05 16:05:03
数据库突然运行很慢,查询了一下,自动增长百分比很大,收缩了一下运行暂时正常了,但修改自动增长设置时报错,请教该如何修改!

对于“Value”无效,“value”应介于 ‘Minimum’和’Maximum’之间。。。

对于“Value”无效,“value”应介于 ‘Minimum’和’Maximum’之间。。。

14 个解决方案

#1


--批量修改非系统数据库的数据文件的增长大小
--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


引用 3 楼 wpasoka 的回复:
谢谢楼上两位的指点,按照1楼的方法已成功解决,非常感谢!

给分结贴吧,  对于“Value”无效,“value”应介于 ‘Minimum’和’Maximum’之间。。。

#5


引用 4 楼 yenange 的回复:
Quote: 引用 3 楼 wpasoka 的回复:

谢谢楼上两位的指点,按照1楼的方法已成功解决,非常感谢!

给分结贴吧,  对于“Value”无效,“value”应介于 ‘Minimum’和’Maximum’之间。。。


昨天改好了,今天发现又变成5400%的自动增长,这是怎么回事 对于“Value”无效,“value”应介于 ‘Minimum’和’Maximum’之间。。。

#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

,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'


你按我上面的:
1. 增加一个新的监控表 dbLogWarning ;
2. 增加一个存储过程 Proc_DBA_DbLogWarning.
3. 增加一个作业, 5分钟调用一次上面的存储过程。看什么时候百分比发生变化吧。
因为你的系统环境我们也不了解, 只能先监控取得一些数据再说了。

#7


Quote: 引用 6 楼 yenange 的回复:


简单测试了一下,问题发生在sql服务重启之后,因前几天发现有外网攻击,所以把数据库服务器改为内网连接,重启服务后发现自动增长由原来设定的50MB变成很大的一个百分比,重新修改后又重启服务测试了一下,结果又变成很大数值的百分比。

#8


我的服务器环境是win2003 mssql2005 ,sql没有打补丁,版本还是9.0.2047,现在升级SP4补丁会不会对现有的数据和运行有影响?

#9


这能有什么影响

#10


还是先升级一下补丁吧,之前好像看过2005有个自动增长的问题,升级完看看有没有效果,回头再开贴联系您。谢谢!

#11


数据库默认开了自动收缩,关闭自动收缩重启服务后暂时正常了。

#12


引用 11 楼 wpasoka 的回复:
数据库默认开了自动收缩,关闭自动收缩重启服务后暂时正常了。


自动收缩不能开的, 影响性能。

#13


怕数据库过大, 可以在晚上做日志备份。

#14


截图里面的回复模式这里默认是用简单还是完整呢?
对于“Value”无效,“value”应介于 ‘Minimum’和’Maximum’之间。。。

#1


--批量修改非系统数据库的数据文件的增长大小
--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


引用 3 楼 wpasoka 的回复:
谢谢楼上两位的指点,按照1楼的方法已成功解决,非常感谢!

给分结贴吧,  对于“Value”无效,“value”应介于 ‘Minimum’和’Maximum’之间。。。

#5


引用 4 楼 yenange 的回复:
Quote: 引用 3 楼 wpasoka 的回复:

谢谢楼上两位的指点,按照1楼的方法已成功解决,非常感谢!

给分结贴吧,  对于“Value”无效,“value”应介于 ‘Minimum’和’Maximum’之间。。。


昨天改好了,今天发现又变成5400%的自动增长,这是怎么回事 对于“Value”无效,“value”应介于 ‘Minimum’和’Maximum’之间。。。

#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

,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'


你按我上面的:
1. 增加一个新的监控表 dbLogWarning ;
2. 增加一个存储过程 Proc_DBA_DbLogWarning.
3. 增加一个作业, 5分钟调用一次上面的存储过程。看什么时候百分比发生变化吧。
因为你的系统环境我们也不了解, 只能先监控取得一些数据再说了。

#7


Quote: 引用 6 楼 yenange 的回复:


简单测试了一下,问题发生在sql服务重启之后,因前几天发现有外网攻击,所以把数据库服务器改为内网连接,重启服务后发现自动增长由原来设定的50MB变成很大的一个百分比,重新修改后又重启服务测试了一下,结果又变成很大数值的百分比。

#8


我的服务器环境是win2003 mssql2005 ,sql没有打补丁,版本还是9.0.2047,现在升级SP4补丁会不会对现有的数据和运行有影响?

#9


这能有什么影响

#10


还是先升级一下补丁吧,之前好像看过2005有个自动增长的问题,升级完看看有没有效果,回头再开贴联系您。谢谢!

#11


数据库默认开了自动收缩,关闭自动收缩重启服务后暂时正常了。

#12


引用 11 楼 wpasoka 的回复:
数据库默认开了自动收缩,关闭自动收缩重启服务后暂时正常了。


自动收缩不能开的, 影响性能。

#13


怕数据库过大, 可以在晚上做日志备份。

#14


截图里面的回复模式这里默认是用简单还是完整呢?
对于“Value”无效,“value”应介于 ‘Minimum’和’Maximum’之间。。。