sql-server - 无法删除 "system"FullText 目录创建的分区方案

标签 sql-server partitioning

因此,我们的 SQL 服务器上运行着大量应用程序,今天我们意识到其中许多应用程序拥有大量并非我们创建的分区方案/函数。

分区方案和函数分别称为 ifts_comp_fragment_data_space_{hash}ifts_comp_fragment_partition_function_{hash}

深入挖掘后,我们发现它们被标记为系统条目(is_systemsys.partition_schemes 中设置为 1),这意味着我们甚至无法删除它们。

经过一些研究,我们发现,如果全文目录太大​​,或者类似的情况,SQL Server 将创建它们来对全文目录进行分区 see here 。问题是 - 我们刚刚删除了所有目录,这些目录就被遗弃了,没有办法清除它们。

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

是否有任何方法可以强制 SQL Server 删除这些对象,或者我可以采取任何其他替代方法?

最佳答案

您可以将 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 View 上执行 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 支持的方法,您可能需要在开始之前在一些非产品服务器上进行测试。

关于sql-server - 无法删除 "system"FullText 目录创建的分区方案,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16677636/

相关文章:

SQL Server 列的大小差异

sql - 从 SQL Server 中的表中选择 XML

Postgresql 分区表删除触发器失败

apache-spark - Spark 在 WholeTextFiles 上创建的分区少于 minPartitions 参数

sql - 优化查询(删除子查询)

sql - 编写一个 T-SQL 查询来过滤包含 NCHAR(2028) 的记录

MySQL : Performance of adding new column to partitioned table vs non-partitioned table

c - 三爪分区(动态编程示例)

oracle - ORA 00904 带有左/右外连接的标识符无效

sql - 如果主键不是 NULL,那么引用它的外键是否也应该指定为 NOT NULL?