无法从 SharePoint 导出网站

Failing to export web from SharePoint

我正在尝试从 SharePoint 2010 导出网站,通过 powershell 从根网站集中导出网站,但每个 Export-SPWeb 命令都失败并显示此消息。

Export-SPWeb : String or binary data would be truncated.
The statement has been terminated.

我测试过的任何网站集中的任何网站都会发生这种情况,而不仅仅是 Web 应用程序根目录。

据我了解,这是一个错误,表示 URL 的长度超过 260 个字符。但是,即使站点中没有文件,也会发生这种情况。如果相关,地址的 FQDN 是 28 个字符。

这是我尝试过的实际示例(当然使用不同的主机名)。

> new-spweb http://sharepoint.example.com/a

Url
---
http://sharepoint.example.com/a

> export-spweb http://sharepoint.example.com/a -path "a.cmp"
Export-SPWeb : String or binary data would be truncated.
The statement has been terminated.
At line:1 char:13
+ export-spweb <<<<  http://sharepoint.example.com/a -path "a.cmp"
    + CategoryInfo          : InvalidData: (Microsoft.Share...CmdletExportWeb:SPCmdletExportWeb) [Export-SPWeb], SqlException
    + FullyQualifiedErrorId : Microsoft.SharePoint.PowerShell.SPCmdletExportWeb

有谁知道会发生这种情况的原因,以及由于错误消息似乎不正确而可能如何修复它?

在我们的案例中,解决此问题的方法似乎是将网站集备份并还原到新创建的网站集。在我们的目标中,我们使用 Export-SPWeb 将一个大型网站集拆分为多个网站集,然后 Import-SPWeb 拆分为多个网站集。

实际上,这就是我们所做的,以防它能帮助其他遇到同样神秘问题的人。

首先确保用于主网站集备份的新 URL 不会导致它们超过 260 个字符的限制。如果它们超过 260 个字符,您仍然可以执行 Backup-SPSite,但使用 Restore-SPSite.

将无法恢复

example found on Microsoft forums 进行了一些小修改。此处新网站集为 sites/NewSC.

declare @oldSiteCollection nvarchar(20) = N'sites/old'
declare @newSiteCollection nvarchar(20) = N'sites/NewSC'

SELECT
   concat([DirName], N'/', [LeafName]) AS [FullRelativePath],
   len(concat(@newSiteCollection, [DirName], N'/', [LeafName])) - len(@oldSiteCollection) AS [Length]
FROM 
   [dbo].[AllDocs]
where
    [DirName] not like 'sites/%'
    and len(concat(@newSiteCollection, [DirName], N'/', [LeafName])) - len(@oldSiteCollection) > 260
ORDER BY 
   [FullRelativePath] desc

此查询将给出在以下命令成功之前要处理的事情列表。您不希望在备份/恢复之前查询返回任何结果。

主站集Backup-SPSite下一个

Backup-SPSite http://sharepoint.example.com/sites/old -Path e:\old.bak

之后 Restore-SPSite 到新位置

Restore-SPSite http://sharepoint.example.com/sites/NewSC -Path e:\old.bak

在这整个操作之后,Export-SPWeb 按预期工作。

如果我不得不猜测为什么会出现此问题,可能是因为自 SharePoint 2003 以来我们一直在使用相同的内容数据库。从 2003 年到 2007 年再到 2010 年的这些年升级可能对这些造成了影响.

考虑到这一点,将 Move-SPSite 用于新的内容数据库也没有解决这个问题。经过数周的各种尝试,唯一有效的方法是上述方法。