有很多可以为数据库启用的SQL Server选项,而最容易被误解的是自动缩减。 安全吗? 如果没有,为什么不呢?
(我原本是作为一个普通的问题询问的,但后来发现了正确的方法 – 感谢BrentO)
没有永不。
我已经多次在ServerFault上遇到这个问题,并希望通过一些很好的build议来吸引更多的观众。 如果人们在这种做事的方式上皱眉头,那么我们会很乐意去除这个问题。
自动缩小是一个非常常见的数据库设置已启用。 这似乎是一个好主意 – 从数据库中删除额外的空间。 有很多“非自愿的DBA”(认为TFS,SharePoint,BizTalk或者只是普通的旧SQL Server),他们可能不知道自动收缩是邪恶的。
虽然在微软我曾经拥有SQL Server存储引擎,并试图删除自动收缩function,但它不得不留下来向后兼容。
为什么自动收缩如此糟糕?
数据库可能只是再次增长,为什么缩小呢?
我做了一个博客文章,有一个示例SQL脚本,它显示了它引起的问题,并在一个更详细的解释。 请参阅自动收缩 – 将其closures! (在我的博客上没有广告或垃圾)。 不要因为收缩日志文件而感到困惑,有时候这是有用的和必要的。
所以,你自己一个忙 – 看看你的数据库设置,并closures自动收缩。 完全相同的原因,您的维护计划也不应该缩水。 把这个词传播给你的同事。
编辑:我应该补充说,第二个答案提醒 – 有一个普遍的误解,认为中断缩小操作可能会导致腐败。 不,不会的。 我曾经拥有SQL Server中的收缩代码,它会回滚当前页面的移动,如果中断的话。
希望这可以帮助!
当然,保罗是对的。
查看所有数据库及其自动收缩设置。 如果你有很多数据库,就会潜入。
sp_msforeachdb @command1 = 'Select ''[?]'',DATABASEPROPERTYEX(''?'',''IsAutoShrink'')'
这是在dmv的某个地方….我想知道。
这不是“不安全” – 它不会损害任何东西。
但不build议在数据库可能决定启动昂贵的重新安排练习的生产环境中,在一堆请求进入之前,这些请求需要更长时间才能提供。 使用调度缩减操作以及其他维护操作(如备份(实际上,在备份之后 – 它将更多地从事务日志中这样做))要好得多。 或者根本不缩小,除非有增长问题 – 您可以随时设置一个显示器,让您知道未使用的分配空间何时超过一定比例或固定大小。
IIRC除默认外,所有MSSQL版本中的所有数据库的默认值都是closures的。
TechNet上有一个白皮书,更详细地解释了SQL维护。
我看到一个SQL服务器同时启用了Autogrow和Autoshrink。 这个(相对强大的)服务器非常慢,因为它整天所做的只是缩小和扩大数据库文件。 Autoshrink可以是有用的,但我build议两件事情:
我被迫缩小数据库的唯一时间是在磁盘空间较less(不足以保存生产数据库)的testing服务器上刷新副本。
生产数据库的文件具有慷慨的可用空间,不幸的是,您必须恢复与您备份的数据库相同的文件大小。 所以在备份之前别无select,只能缩减生产。 (这个缩水花了很长时间,大量的资源被消耗掉,随后的交易日志增长是有问题的。)
另外看看这个video教程….
观看Paul Randal演示如何缩小和自动缩小可能导致严重的数据库碎片问题http://wtv.watchtechvideos.com/topic194.html