由于sysfiles1表,DBCC SHRINKFILE EMPTYFILE陷入困境

时间:2014-09-24 15:19:19

标签: sql-server sql-server-2008 data-migration

我试图将SQLServer 2008上相当大的数据库从一个驱动器迁移到另一个驱动器,停机时间最短并且存在一些问题。

所以,基本上,我的计划是使用DBCC SHRINKFILE(' filename',EMPTYFILE)进行范围移动。 经过一段时间后,我缩小此文件以避免日志传送db在其他服务器中出现一些空间问题。 大量的范围被成功移动,但后来我发现了这个错误

DBCC SHRINKFILE:系统表SYSFILES1 Page 1:21459450无法移动到其他文件,因为它只能驻留在数据库的主文件中。 Msg 2555,Level 16,State 1,Line 3 无法移动文件的所有内容" filename"到其他地方完成emptyfile操作。 DBCC执行完成。如果DBCC打印了错误消息,请与系统管理员联系。

所以,我已经尝试过了:

  • 通过添加空格来手动使我的数据库变大(只需通过更改数据库使文件变大)
  • 使用SECONDARY filegroup中的文件进行一些工作
  • 在完全\事务备份后使用db

这并没有奏效。 有人可以帮我解决这个问题吗?

非常感谢。

1 个答案:

答案 0 :(得分:0)

正如错误消息所述,有些东西需要驻留在PRIMARY文件组中。使用sys.allocation_units中的信息找出仍在PRIMARY中的用户(而不是系统)对象,并使用create index … with (drop_existing = on) on OTHER_FILEGROUP移动它们。移动完所有对象后,您应该能够将文件缩小到尽可能小的范围。您的最后一步将是停止移动主文件的停机时间(在这种情况下,最短的停机时间并不意味着“没有停机时间”)。幸运的是,实际需要驻留在PRIMARY中的数据并不多,因此停机时间应该很短。但是一旦你把所有东西都拿出来,你就会有一个好主意。

当您使用它时,请将数据库的默认文件组设置为非主要文件组,以避免将来放置用户对象。