繁体   English   中英

从分区表中回收分配的可用空间

[英]Reclaiming allocated free space from partitioned tables

我们有一个包含大约 4TB 数据文件的数据仓库。 其中一些数据库由分区表组成。

由于我们的磁盘空间不足(本地环境),我们希望删除旧数据并将其中的一些数据归档。 但是数据文件中有很多分配的可用空间。

我正在寻找一种方法来摆脱这个可用空间,以便我们可以迁移到更新的版本(目前是 2008 R2)。

我读到的是,在新服务器上进行压缩的完整备份并恢复它也会删除这个分配的空间。 不幸的是,我还没有找到信息来验证这种方法。 有人知道这是否成立,或者你们中的任何人都知道更好的方法吗?

问题是每个月都会创建一个新分区。 所有旧分区都只是历史数据。 所以逻辑上 SQL 服务器永远不会利用这些旧分区中的可用空间。

我们总共谈论一千个文件,所以我正在寻找自动化或节省时间的东西。 如果我们不想在生产时间内造成任何负载,那么收缩最终可能需要数周时间。

我读到的是,在新服务器上进行压缩的完整备份并恢复它也会删除这个分配的空间。

恢复的数据库在文件和空间方面与原始数据库完全相同。 备份是否被压缩并不重要。

我们总共谈论一千个文件,所以我正在寻找自动化或节省时间的东西。

我建议DBCC SHRINKFILE('file_name_here', TRUNCATEONLY); 作为第一步。 这将在不移动数据的情况下从文件末尾释放未使用的空间,因此它应该运行得相当快。 下面的脚本将为指定的分区方案生成这些命令,假设一个时间分区类型的分区列:

SELECT DISTINCT N'DBCC SHRINKFILE(N' + QUOTENAME(df.name, '''') + N',TRUNCATEONLY);'
FROM sys.partition_schemes AS ps
JOIN sys.partition_range_values AS prv ON prv.function_id = ps.function_id
JOIN sys.destination_data_spaces AS dds ON dds.partition_scheme_id = ps.data_space_id
JOIN sys.filegroups AS fg ON fg.data_space_id = dds.data_space_id
JOIN sys.database_files AS df ON df.data_space_id = fg.data_space_id
WHERE 
    ps.name = N'PS_Date' --specify partition scheme here
    AND prv.value < CAST('20220801' AS date);

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM