Перенос данных большого объёма в другую базу контента SharePoint 2013. Move SharePoint large content DB to another content DB into the same farm.

Всем привет. Сегодня хотел поделиться опытом переноса данных большого объёма с одной базы контента в другую без потери существующих идентификаторов документов или элементов, а также с сохранением Document ID. Проблем не возникает, если у Вас данные, например список или библиотека содержащая до 5000 элементов или документов соответственно. Но здесь совершенно другая история. Данные одной из библиотек превышают 120 000 документов с включённой версионностью, содержащими в определённых сценариях уникальные разрешения и прочие нестандартные вещи. И таких библиотек десяток. Стандартными средствами перенос не получится такой, который необходим.

Предупреждаю - этот способ не является поддерживаемым Microsoft, но увы нет стандартных средств.

Основными требованиями являются:

1. Сохранение структуры, навигации, стилей и настроек коллекции сайтов.

2. Сохранение идентификаторов и Document ID в библиотеках и списках.

3. Сохранение App приложений.

4. Сохранение рабочих процессов и всех запущенных экземпляров.

Это минимальные требования должны быть выполнены при переносе данных и задача должна решиться в кратчайшие сроки.

Итак, что для начала нужно сделать. Все наверно сталкивались с историей, когда просто брали и клонировали базы данных контента и при подключении базы получали сообщение о том, что такая коллекция сайтов уже зарегистрирована. Дело всё в том, что эта информация храниться в двух местах:

1. Базе данных конфигурации SharePoint 2013. Таблица SiteMap. Хранит информацию GUID коллекции сайтов и GUID базы контента

2. База данных контента. Таблица DatabaseInformation. Хранит информацию GUID базы контента.

Первый этап, что нужно сделать - это сделать резервную копию и потом восстановить эту копию, изменив название базы контента. После этого в таблице DatabaseInformation необходимо изменить GUID будущей базы контента.

Например,

UPDATE [dbo].[DatabaseInformation]

SET [Value] ='478e5aa1-5eb5-4674-acb6-8c81272d5377'

WHERE Name ='Id'

GO

Теперь можно подключить базу контента без ошибок, но никакой коллекции сайтов, ферма не увидит.

Второй шаг, который необходимо выполнить - это во всех таблицах, которые используют GUID коллекции сайтов, необходимо поменять на новый GUID. Начать необходимо с таблицы [dbo].AllSites

Например,

UPDATE [dbo].AllSites

SET Id ='ECFDB6C2-F964-4456-9ADF-4A8FF8921E3B',

HostHeader ='archive-demo.contoso.com'

WHERE Id ='ECFDB6C2-F964-4456-9ADF-4A8FF8921E3A'

GO

В запросе также изменено URL header, чтобы не было потом проблем с пониманием где новая коллекция сайтов.

В некоторых таблицах колонка называется SiteId, а в некоторых tp_SiteId. Это одна  и та же колонка, просто так исторически сложилось в структуре базы контента SharePoint. Полный перечень таблиц, где необходимо поменять GUID такой:

AllSites, AllWebs, AllDocs, AllDocVersions, AllLinks, AllLists, AllListsAux, AllListsItemCount, AllListsPlus, AllListUniqueFields, AllLookupRelationships, AllUserData, [AllUserDataJunctions], [AllWebParts], [AppDatabaseMetadata], [AppInstallationProperty], [AppInstallations], [AppJobs], [AppLifecycleErrors], [AppPackages], [AppPrincipalPerms], [AppPrincipals], [AppResources], [AppRuntimeIcons], [AppRuntimeMetadata], [AppRuntimeSubstitutionDictionary], [AppSourceInfo], [AppTaskDependencies], [AppTasks], [BuildDependencies], [ContentTypes], [ContentTypeUsage], [CustomActions], [Deps], [DocsToStreams], [DocStreams], [EventReceivers], [EventSubsMatches], [Features], [FeatureTracking], [GroupMembership], [Groups], [HT_Cache], [ImmedSubscriptions], [NameValuePair], [NavNodes], [Perms], [Personalization], [RecycleBin], [Resources], [RoleAssignment], [Roles], [SchedSubscriptions], [ScheduledWorkItems], [SiteQuota], [SiteVersions], [SolutionFiles], [SolutionResourceUsageDaily], [Solutions], [StorageMetrics], [StorageMetricsChanges], [UserInfo], [WebMembers], [WebPartLists], [WebsPlus], [Workflow], [WorkflowAssociation].

После того, как все таблицы обновлены необходимо перезагрузить IIS на всех веб серверах.

Удачи в Ваших делах.