今天,我的 SQL Server DB 在多个文件组中有多个文件时遇到了以下错误。
事件 ID:1105。无法为数据库中的对象分配空间,因为“PRIMARY”文件组已满。通过删除不需要的文件、删除文件组中的对象、向文件组添加其他文件或为文件组中的现有文件设置自动增长来创建磁盘空间。
MSSQL 2014:无法为数据库中的对象分配空间,因为文件组已满
它发生在我的索引维护作业运行时。特别是在索引之一的索引重组期间。经过调查,我发现我的所有文件组至少有一个启用了自动增长的文件,并且驻留在各自驱动器上的所有启用自动增长的文件都有足够的可用空间。所以不存在空间问题或文件自动增长的问题(考虑到我在每个文件组中至少有一个文件启用了自动增长)。进一步深入研究后,可以从下面的 MS 链接https://msdn.microsoft 中找到。 com/en-us/library/aa337441.aspx
当索引位于多个文件上时,当其中一个文件已满时,ALTER INDEX REORGANIZE 会返回错误 1105。当进程试图将行移动到整个文件时,重组进程被阻止。要解决此限制,请执行 ALTER INDEX REBUILD 而不是 ALTER INDEX REORGANIZE 或增加任何已满文件的文件增长限制。
因此,为了解决我的问题,我继续重建修复了问题的索引。但是,我正在寻找避免这种情况的方法,因为将来可能会发生在不同的索引中,并且一直进行手动索引重建不是修复它的好方法吗?我很想听听您对此的建议。
文件组中不要只有一个文件有任何可用空间。将您的文件设置为相同的大小,同时将它们增长到相同的大小,并让具有比例填充算法的循环法完成它的工作。
然后应该将它们移动到有空间的不同驱动器上,或者四处移动以使所有驱动器都有空间,或者扩展驱动器。
这真的归结为管理。这将是一个永远存在的问题,而数据文件的可用空间和大小有很大不同。原因归结为按比例填充和循环分配。
SQL Server 中按比例填充的一个非常快速的总结是,文件组中空闲空间最多的文件应该比空闲空间较少的文件更频繁地分配。如果有一个文件几乎没有可用空间,它将被跳过。这意味着当您的文件组中只有一个文件真正有任何空间时,您实际上是在热点那里的所有分配。循环部分只是文件之间的分配。
由于您只保留一个具有不平衡可用空间量的文件,因此这将成为所有分配的单一热点。这就是为什么我建议上面尽可能地平等你的文件。