SQL Server-增长数据库文件的最佳实践


16

我已经通过SQL Server 2008 R2中的数据收集器监视文件增长了两个星期。该数据库以每天约35(MB)的速度持续增长。该数据库尚未达到2 GB的初始大小。

数据库文件的自动增长设置为5MB,我想尝试另一种方法,所以我正在寻找建议和/或评论。

每个星期天晚上1:30 AM都会运行一项调优任务。该任务将:

  • 检查数据库完整性
  • 缩小日志文件–(可以,因为日志记录模式很简单)
  • 收缩数据库
  • 重组索引
  • 重建索引
  • 更新统计
  • 清理历史

我想在每周调整计划中增加两个步骤:

  1. 如果使用的空间达到某个阈值或总大小,则将数据库文件增加500 MB。
  2. 如果使用的空间达到总大小的特定阈值,则将日志文件增加250 MB(缩小后)。

通过将增长负担放在离线时间,我希望通过减少重负载下的自动增长事件的数量来提高性能。

我有两个有关自动增长文件的问题。

  • 放置文件增长步骤的最佳位置是在当前步骤之前还是之后?
  • 如果我使用ALTER DATABASE|MODIFY FILE来增大文件,那么如何确定是否SpaceUsedInFile >= (TotalFileSpace-@AllowanceThreshold)呢?

2
您的数据库应该有足够的大小以至于永不增长。尽管如此,请确保已启用即时文件初始化
Remus Rusanu 2012年

3
@Remus虽然很理想,但您是说您已经在整个职业生涯中对每个数据库进行了完美的预大小设置了吗?总是会涉及一些猜测工作,需要进行调整。我同意应该控制增长,而不仅仅是每天7次控制增长。
阿龙贝特朗

3
@AaronBertrand:我赞成简单化,夸张的建议。随着时间的推移,我知道它的粘性更好。大多数用户无法处理“取决于情况”,而这样做的用户可以自己弄清楚黑白之间存在灰色阴影……
Remus Rusanu 2012年

3
@DanAndrews:过度分配可能会影响“下游”。想想一个开发人员试图恢复他机器上的数据库,只是发现它需要两个新的1TB驱动器来存储1Gb数据...
Remus Rusanu 2012年

2
我只是在扮演魔鬼的拥护者。但是,高清硬盘价格便宜。用于重新配置的生产中浪费的时间和性能损失是昂贵的。
丹·安德鲁斯

Answers:


24

您应该以尽可能少的自动增长为目标。即使使用即时文件初始化,一天也要耗费7倍的时间。

不要做收缩数据库。曾经 可能是收缩文件,但仅在发生异常事件之后。收缩它只是为了再次生长是徒劳的,实际上应该称为自动分裂。

如果恢复模型很简单,那么您根本就不需要将日志文件增加250 GB。文件中的已用空间会随着时间的流逝自动清除,除非您一个月前开始事务并且没有打算提交或回滚它的意图。

所以我的建议是:

在安静的时段内手动将数据文件自动增长到可以容纳数月增长的大小。在此期间,您将其保存为什么?

将数据文件的自动增长增量设置为相对较小的值(以使它在发生时不会中断用户),并在发生此事件时发出警报(例如,可以在默认跟踪中捕获它,也可以通过扩展事件)。这可以告诉您您达到了估计的最高点,是时候再次进行手动增长了。此时,您将需要保留本手册,以防您想在其他驱动器上添加新文件/文件组以容纳该空间,因为最终您将填充当前驱动器。

自动将日志文件增长到原来最大的两倍。除非有一些异常的交易阻止了它,否则它不应进一步自动增长。您还应该监视此事件,以便您了解它们。


感谢您的输入...我将为您提供有关增加日志文件并在一段时间内对其进行监视的建议。我错误地使用了GB作为秋天大小的MB。我同意并且不认为收缩数据库正在按计划进行。到年底,数据库达到15GB,在创建作业时,我们的备份空间已用完。

+1的名称应称为自动片段化:-)您是否已经为此发起了连接问题?:-)
marc_s 2012年

10

自动增长是您应尽量避免的事情。问题是您无法控制何时可以发生增长,并且您的系统可能因此受到严重影响。

将文件大小设置为一个月左右的合理值,然后从那里监视您的增长率,以计算出您估计X的时间量有多少空间,并将大小设置为该值+误差幅度。

我已经建立了一个简单的监视作业,当文件大小达到自动增长之前达到预定义的最大值时,它将提醒我。您可以使用如下形式:

SELECT instance_name,
       [Data File(s) Size (KB)],
       [LOG File(s) Size (KB)],
       [Log File(s) Used Size (KB)],
       [Percent Log Used]
       into ##Logsize
FROM
(
   SELECT *
   FROM sys.dm_os_performance_counters
   WHERE counter_name IN
   (
       'Data File(s) Size (KB)',
       'Log File(s) Size (KB)',
       'Log File(s) Used Size (KB)',
       'Percent Log Used'
   )
     AND instance_name = 'database your interested in' 
) AS Src
PIVOT
(
   MAX(cntr_value)
   FOR counter_name IN
   (
       [Data File(s) Size (KB)],
       [LOG File(s) Size (KB)],
       [Log File(s) Used Size (KB)],
       [Percent Log Used]
   )
) AS pvt 
go
declare @logsize int
Select @logsize = [Percent Log Used] from ##Logsize

If @logsize > the maximum percent you want the log to fill too i.e 90
    BEGIN
        --Do your thing here
    END

Drop table ##Logsize

这当然可以安排为工作。


我删除了“ AND instance_name ='您感兴趣的数据库”,因此它将返回所有数据库。然后,在IF语句中使用日志大小大于阈值的计数。如果计数大于1,则使用temp表中的select name语句执行sp_send_dbmail,以电子邮件发送超出限制的日志名称。
尼克·温斯坦利
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.