我继承了一个 SQL Server,并且发现了一个表分区问题。由于我不确定的原因,我无法将新分区添加到现有表分区。
环境:
SQL Server 2005 Enterprise,数据库大小约为 400GB,4GB RAM,仅限 32 位系统。
分区表详细信息:
*表在多个磁盘卷上的 13 个文件组中分区。
*分区函数为 RANGE LEFT,具有 12 个边界点,它们是日期时间值。
*边界点采用日期季度结构(例如:2009-12-31 23:59:59、2010-03-31 23:59:59、2010-06-30 23:59:59)。
*日期时间值是分区键。
*数据根据当前日期每天插入到表中,但是只有最后一个文件组接收数据,因为函数的最后一个边界点是'2010-06-30 23:59:59'。
*表有一个与表对齐的聚集索引,以及 3 个非唯一非聚集索引(2 个对齐,1 个完全存在于不同的文件组中)。
*当前表卷详细信息:
数据空间:75GB+
索引空间:50GB+
行数:2亿+
问题:
当前最后一个文件组/分区没有最大日期边界点,因此日期 '2010-06-30 23:59:59' 之后的所有数据已经/仍在插入到此分区中。幸运的是,事务数据量相当小,但在两年的时间里,最终分区已增长到令人印象深刻的 22GB 大小。我不希望从这个现有分区中拆分或删除数据。但是,我确实想添加一个新文件组并更改现有的分区功能,以便将所有未来的数据插入到新的文件组中。我想添加一个新的未来日期作为边界点,以便在该日期之后插入的所有数据都进入一个新的文件组/分区。
使用方法:
使用 ALTER DATABASE 函数添加了一个新的文件组/文件 - SUCCESS。
更改了分区方案,以便为新创建的文件组分配 'NEXT USED' - SUCCESS。--用于改变分区方案的脚本--
ALTER PARTITION SCHEME [partition_scheme_name] NEXT USED (new_filegroup_name);
更改了分区函数以添加新的边界点 - FAIL。
--用于向函数添加新边界点的脚本--
ALTER PARTITION FUNCTION partition_function_name() SPLIT RANGE ('2012-10-01 23:59:59) GO
错误:
使用 SPLIT RANGE 技术将新边界点添加到现有分区失败,因为数据库事务日志已填满(限制为 18GB)。这让我感到惊讶,原因有两个 - 1):我认为使用 SPLIT RANGE 只是一个元数据函数(如果我错了,请纠正我)和 2):我的新边界点在表中尚不存在作为日期值,所以我假设不会有数据移动。
到目前为止我已经尝试过:
*我使用测试服务器成功测试了此方法,但数据集要小得多。
*然后我将生产数据库的完整副本恢复到测试系统上。我添加了第二个无限增长的数据库日志文件,并尝试再次更改分区功能。原数据库事务日志按预期填满,但辅助数据库事务日志增长到 60GB!此外,tempdb 增长到 14GB。当整个进程由于另一个错误而再次中止时,新文件组的大小开始增加。这次的错误是:
('无法在具有唯一索引'Index_name'的对象'table_name'中插入重复的键行)。
现在有两件事让我完全困惑:
1):测试错误中提到的索引是非聚集、非唯一索引 - 为什么会出现重复错误?
2):更重要的是,我正在添加一个新的日期时间值作为新的最大边界点,并且该值在表中尚不存在。为什么会有数据移动???
如前所述,我已经使用更小的数据集测试了这种方法,并且效果很好。我不明白为什么它不适用于生产数据集。我在这里遗漏了一些非常明显的东西吗?任何意见是极大的赞赏。感谢您的时间。