Database using Full Text Catalog 备份失败

我最近在做一个关于备份失败的Case。这个备份和Full Text Catalog一起使用。这种状况在SharePoint数据库中很常见。它使用了SQL Server中的全文索引功能(Full Text Searching)。如果你遇到了如下的错误:

Msg 3007, Level 16, State 1, Line 1

The backup of the file or filegroup "<full_text_catalog>" is not permitted because it is not online. BACKUP can be performed by using the FILEGROUP or FILE clauses to restrict the selection to include only online data.

Msg 3013, Level 16, State 1, Line 1

BACKUP DATABASE is terminating abnormally.

 

以下是我写个我客户的相关问题的邮件:

在多次尝试重现您的问题后,我有所发现,并且这可能就是造成您问题的原因。

 

在我的测试中,我自身是sysadmin的角色,理论上拥有对于当前SQL Server 实例上的完全权限。

但是,当我选择 Full Text Catalog的“属性”时,我遇到了如下的报错。

它告诉我,我没有足够的进入权限。但是,要记住我自己是SQL Server 实例的sysadmin!

而且,我也无法再“通常”中看到任何东西。而且,我可以在“表/视图”中看到Full Text的定义。

 

并且,当我试图做一个备份时,我遇到和你所遇到的同样错误。

 

那么秘密是什么呢?

 

如果时间回退10分钟,我做了一些有趣的事情来使如上的情况重现。

 

我从SQL Server配置管理器中停止了SQL Server 服务。

 

我到那个SQL实例的FTData目录下,将“Test_Full_Text_Catalog” 改为“Test_Full_Text_Catalog1”,以使其“被删除”。

而后重启SQL Server 服务,我就能够重现以上的问题。我认为,这个可能就是造成你问题的原因。

 

所以,你遇到的问题可能就是SQL Server无法找到相应的Full Text Catalog文件,即使在你拥有足够的权限的情况下!

 

为了验证我的观点,假设我还没有意识到我先前所做的,使它不工作的步骤,我在我的SSMS中运行如下语句。select * from <database_name>.sys.database_files

第三行提示了在当前的问题下Full Text Catalog文件的信息。在“state_desc”列中,它告诉我文件处于Offline状态。它在“physical_name”中显示了文件的物理路径。我根据“physical_name”的值,搜索了相关的文件,发现他们不在哪里!(记住我通过改名的方式,把文件“删除”了)。

 

我尝试使用Process Monitor < https://technet.microsoft.com/en-us/sysinternals/bb896645 >来抓取在SQL Server服务启动过程中,以及在Rebuild“Test_Full_Text_Catalog” 的文件访问轨迹,但是没有发现。而且由于我们能够在<database_name>.sys.database_files 中得到相关信息,我猜想那就是为什么这些信息无法在Process Monitor中被得到的原因,因为它们通过某种其他的方式缓存/维护在了系统表中。关于如何维护该系统表不在本文讨论范围之内。

 

回复的方式:

1. 如果你足够幸运,你可以通过Rebuild的方式重建Full Text Catalog。而有时候,你也会经历长时间的Rebuild,而无法完成的情况。这种情况下,你就要尝试以下方式。

2. 手动重建Full-Text Catalog.   ( 如果你能够找到这些文件,最简单的方法就是把他们拷贝到相应的位置)

1. 将索引列记录下来 (你需要对这一步相当谨慎,否则你将会丢失相关索引信息)

2. 删除原有的Catalog

3. 原名重建Catalog, 你可能需要做一个日志备份。

4. 在“属性->表/视图”中对列重新做索引。

 

然后,你应该可以对该数据库做完整备份了!