在 SQL Server(本例中为 2008)中,如何快速收缩实例上所有数据库的所有文件,包括日志和数据?我可以通过 SSMS 并右键单击每个并选择 Tasks -> Shrink,但我正在寻找更快的东西。
我编写了一些“创建数据库”脚本并忘记了它们的默认大小已经膨胀,并且不需要为该项目中的这些文件保留那么多空间。
在 SQL Server(本例中为 2008)中,如何快速收缩实例上所有数据库的所有文件,包括日志和数据?我可以通过 SSMS 并右键单击每个并选择 Tasks -> Shrink,但我正在寻找更快的东西。
我编写了一些“创建数据库”脚本并忘记了它们的默认大小已经膨胀,并且不需要为该项目中的这些文件保留那么多空间。
DBCC SHRINKDATABASE
当您从 GUI 执行“Tasks -> Shrink”时,它实际上会在幕后发出命令。试试看。当对话框出现时,不要单击“确定”按钮。相反,单击“脚本”按钮。您将在查询窗口中看到该命令。将它与 sys.databases 上的查询结合起来(省略 master 和 msdb),您可以编写一个脚本来缩小所有数据库。例如(取自 jcolebrand 的评论):
复制该查询的输出并运行它以缩小所有文件。
单行sql语句怎么样?
请在执行以下 sql 语句之前阅读这篇非常有趣的博客文章。
DBCC SHRINKDB(及其表亲 SHRINKFILE)非常慢,因为该代码中有很多单线程执行。
缩小数据库文件的一种更快的方法是:
sp_spaceused
确定有多大)因为索引重建是大规模并行的,所以这种技术通常会导致数据库更快地收缩。当然,它确实需要您在处理过程中为新文件组留出一些额外的空间。但是,您只需要在新文件组中有足够的空间来保存实例中最大的文件组(因为您将在进行过程中回收空间)。
此技术还具有在此过程中对索引进行碎片整理的额外好处。
我调整了一点查询以仅根据请求缩小 LOG:
下面的代码,获取非系统数据库列表,将数据库设置为只读,然后收缩文件。我使用 SQL 代理作业将这段代码保存在几个 SQL Server 框中,其中空间总是一个问题。每周周六/周日晚上,它开始运行并在几个小时内收缩所有数据库(取决于数据库的大小)。
我们可以动态地对所有数据库重复
SHRINKDB
和:SHRINKFILE
您可以在本文中找到详细信息。
收缩除 master、model、msdb 之外的所有日志文件:
这个扩展了上面的答案,使用游标逐个遍历 SQL 语句。它不像 Emrah 的答案那么短,但它确实允许在光标内的 while 循环中添加额外的逻辑。