Sql Server - 增加数据库文件的最佳实践

Ros*_*ush 18 sql-server-2008 sql-server best-practices sql-server-2008-r2 transaction-log

我一直在通过 sql server 2008 r2 中的数据收集器监视文件增长两周。数据库以大约 35(MB)/天的速度持续增长。数据库尚未达到 2 GB 的初始大小。

DB 文件自动增长设置为 5MB,我想尝试不同的方法,所以我正在寻找建议和/或评论。

每周周日晚上 1:30 有一项调整任务运行。该任务将:

  • 检查数据库完整性
  • 缩小日志文件 - (这没关系,因为日志模式很简单)
  • 收缩数据库
  • 重组索引
  • 重建索引
  • 更新统计
  • 清理历史

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

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

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

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

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

Aar*_*and 28

您的目标应该是尽可能少地自动增长。一天七次是痛苦的,即使是即时文件初始化。

不要做收缩数据库。曾经。Shrinkfile,也许,但只有在一个非凡的事件之后。缩小它只是为了再次增长是徒劳的,实际上应该称为自动碎片。

如果恢复模式很简单,那么您根本不需要将日志文件增加 250 GB。文件中的已用空间会随着时间的推移自动清除,除非您在一个月前开始了一个事务并且无意提交或回滚它。

所以我的建议是:

在安静时期手动将数据文件自动增长到可以适应几个月增长的大小。在此期间你保存它做什么?

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

将日志文件自动增长到比以往任何时候都大的两倍。它不应该进一步自动增长,除非有一些异常交易阻碍了事情。您还应该监视此事件,以便了解它们。


Nic*_*ley 12

如果可能,您应该尽量避免自动增长。问题是您无法控制增长何时发生,并且您的系统在增长时可能会受到严重打击。

将您的文件大小设置为一个月左右的合理大小,并从那里监控您的增长率,计算出您估计 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
Run Code Online (Sandbox Code Playgroud)

这当然可以安排为一项工作。