我不是 dba...让我们从那个开始 :) 我是应用程序开发人员。但是我们的数据库有一个存档表,它有 2.52 亿行和 170GB,我被派去修复它(实际上,这个类别中有多个表我需要清理)。但我们决定不需要保留任何此类数据。因为这个表是一个存档表,我的意思是这个数据有一个主事务表,但是应用程序有办法通过存档或移动旧记录到这个存档表来保持事务表更小。
作为存档表,它没有每个 SSMS 的依赖项(没有索引或外键)。此数据库设置为完全恢复模式。
我们的维护窗口很短,所以需要一个快速的过程,而且我们的磁盘空间有限,所以我们需要从这个表中回收磁盘空间。
我们可以截断表,那么如何回收空间呢?我们不想进行数据库收缩,因为它会收缩所有表,因此我们需要运行索引重建……至少这是我的理解,这可能是不正确的。
我可以从 SSMS 中保存一个脚本(脚本表作为 Create To...)。然后删除表,然后重新创建它......这有风险吗?它会回收空间吗?
其他想法?
因为您在数据库管理方面的经验有限,所以要格外小心。您设置了数据库服务器的测试副本,对吗?
您提到数据库使用完整恢复模式。这非常重要,因为如果事务日志没有足够频繁地备份,就没有办法收缩它们。您必须将数据库置于简单恢复模式(出于所有意图和目的摆脱事务日志)并等待该过程,然后您可以继续前进。考虑到数据量,我想这需要一段时间。有关恢复模型的信息,请访问此处: https ://learn.microsoft.com/en-us/sql/relational-databases/backup-restore/recovery-models-sql-server本文提供了基本概述。
要回答您的问题,截断或删除存档表不会释放空间——这就是缩小数据库的作用。truncate/drop 所做的只是将数据库中适当的页面标记为未使用。删除表并重新创建它没有什么意义。截断基本上得到相同的最终结果并且不太容易出错。
请记住,如果此应用程序向此存档表发送更多数据,则在您运行收缩过程后数据库将扩展!(你真的在使用 SQL Server 2005 吗?如果是这样,请认真考虑升级到受支持的版本,如果是物理服务器,则使用更新的硬件。)因此,就像应用程序将数据移动到存档表一样,你应该考虑实现一种方法从归档表中删除不需要的数据以避免将来出现这种情况。但首先是第一件事。
如果您还没有阅读此内容,请阅读:https ://learn.microsoft.com/en-us/sql/t-sql/database-console-commands/dbcc-shrinkdatabase-transact-sql这是一个描述收缩的 Microsoft 文档一个非常详细的数据库。这是一个不错的概述,包含一些最佳实践和注意事项。
如果你不想缩小数据库,你的另一个选择是创建一个新数据库,将你想要从旧数据库中保留的内容转移到它,然后删除旧数据库。当然,这会占用相当多的磁盘空间和时间。它还会使服务器承受相当大的负载。
您是正确的,因为数据库收缩会增加索引碎片。话虽如此,这种碎片化可能不会对性能产生明显影响。这就是为什么你有一个测试服务器。:-)
您可能必须为此操作调整维护窗口。它会花多少时间。在截断过程中,数据库将联机。您也可以在收缩期间保持数据库在线。根据使用情况、查询的调整方式、硬件和操作系统配置,性能可能会受到明显影响。同样,在生产中做任何事情之前进行测试!收缩可以停止并在稍后时间开始,但是,如果空间非常宝贵,则开始和停止会达不到目的。
还有一件事:根据将数据添加到该数据库的速度,截断和收缩可能只会延迟不可避免的事情。考虑增加存储容量。
如果您有更多详细信息或说明,我会相应地更新我的答案。与此同时,祝你好运,让我们知道事情进展如何!