6

所以我们在 SQL 服务器上运行了一堆应用程序,今天我们意识到其中一些应用程序有一堆我们没有创建的分区方案/函数。

分别调用了分区方案和ifts_comp_fragment_data_space_{hash}函数ifts_comp_fragment_partition_function_{hash}

深入挖掘,我们意识到它们被标记为系统条目(is_system设置为 1 in sys.partition_schemes),这意味着我们甚至无法删除它们。

经过一些研究,我们发现如果全文目录变得太大,SQL Server 会创建它们来对全文目录进行分区,或者类似的情况,请参见此处。问题是——我们刚刚删除了所有的目录,这些都被遗弃了,没有办法清除它们。

我不会太担心,除非我需要删除它们,因为我正在尝试将我们的数据库导出为 .bacpac 文件,并且崩溃并抱怨数据库包含分区方案/函数并且它们不受支持。

是否有任何方法可以强制 SQL 服务器删除这些对象,或者我可以做的任何其他替代方法?

4

1 回答 1

6

您可以将 is_system 标志从 1 更改为 0,然后像其他任何方式一样删除分区方案。去做这个:

首先允许在您的服务器上进行更新:

exec sp_configure 'allow updates', 1
go
reconfigure with override
go
  1. 关闭 SQL 服务器
  2. 通过从具有提升权限的控制台运行“C:\Program Files\Microsoft SQL Server\MSSQL11.MSSQLSERVER\MSSQL\Binn\sqlservr.exe -m”以单用户模式启动它。
  3. 使用 SQL Server DAC http://technet.microsoft.com/en-us/library/ms178068(v=sql.105).aspx登录到服务器
  4. 如果我们对 sys.partition_schemes 视图执行 SP_HELPTEXT,您会看到 is_system 列基于 sys.sysclsobjs 表中的状态标志。“sysconv(位,o.status & 0x4)AS is_system,”
  5. 所以要更改标志,我们必须查看状态的当前值是什么,并取消标记 4 位。我的值是 4,所以我将其更新为 0。

    update sys.sysclsobjs set status = 0 where name = 
      'ifts_comp_fragment_data_space_033D368C'
    

现在,您只需关闭控制台窗口并启动 sql server windows 服务即可关闭单用户模式 ​​SQL Server 进程。然后像往常一样登录并删除分区方案。

最后,将“允许更新”设置回 0。

这可能需要为生产服务器计划停机时间。

免责声明这可能不是 Microsoft 支持的执行此操作的方式,您可能希望在深入研究之前在一些非产品服务器上进行测试。

于 2013-10-23T15:28:25.233 回答