SharePoint Migration: Basic tips and tricks in migration project

No comments

Sometimes while we do the SharePoint content database migration thru the detach and attach method – we may encounter with errors. However, if we open the migrated site still it does open and work. Here, I will explain how we can reduce the possibility of getting the error and some basic tips and tricks in migration project.

Descriptions:

Even though we get some error during the database upgrade we may ignore them, as this is generally common behavior in migration project.

Even I had also faced the similar kind of issue and figured this out by doing the proper analysis in the source system. One of the key parameter for succeeding the migration project is proper planning and analyzing the source environment. Try to get an inventory from your source system about all custom solution and where (in which sites) these custom features are activated, I am sure from the inventory report you will find there are many features those are not really being used in the source system. So you can clean those unwanted feature from target environment – after running the Test-SPContentDatabase command.

For cleaning up the the features you may use the below PowerShell script(available in the below link):

https://blogs.technet.microsoft.com/dawiese/2017/05/09/post-upgrade-cleanup-missing-server-side-dependencies/

Sample PowerShell script for running Test-SPContentDatabase:

$wa=Get-SPWebApplication "https://sharepoint.contoso.com"
$outputPath= "\\tools\files\Output\Test_Wss_Content_MissingAssembly_{0}.txt"
-f (Get-Date -Format hhmmss)
$dbName="WSS_Content_MissingAssembly"
$slqServer= "SPSQL"
Test-SPContentDatabase -Name $dbName -WebApplication $wa -ServerInstance $slqServer -ShowLocation:$true -ExtendedCheck:$false | Out-File $outputPath Write-Host "Testresults written to $outputPath"

PowerShell sample for removing features by ID:

$featureID = "ed37484a-c496-455b-b083-3fc157b1603c"
$siteID = "108d28e9-dac1-4eea-9566-6591394e6d40"   
 
#Display site information
$site = Get-SPSite $siteID  
Write-Host "Checking Site:" $site.Url
 
#Remove the feature from all subsites
ForEach ($web in $Site.AllWebs)
    {
        If($web.Features[$featureID])
            {
                Write-Host "`nFound Feature $featureID in web:"$Web.Url"`nRemoving feature"
                $web.Features.Remove($featureID, $true)
            }
            else
            {
                Write-Host "`nDid not find feature $featureID in web:" $Web.Url
            }   
    }
 
#Remove the feature from the site collection
If ($Site.Features[$featureID])
    {
        Write-Host "`nFound feature $featureID in site:"$site.Url"`nRemoving Feature"
        $site.Features.Remove($featureID, $true)
    }
    else
    {
        Write-Host "Did not find feature $featureID in site:" $site.Url
    }

SQL sample for listing setup file information:

USE WSS_Content_MissingAssembly_Snapshot
  
SELECT id, SiteID, DirName, LeafName, WebId, ListId
FROM AllDocs (NOLOCK) where SetupPath = 'Features\ContosoLIb_Feature1\DocLib_WP\DocLib_WP.webpart'

PowerShell sample for removing setup files by ID:

#File Information
$setupFileID = "07462F03-A4C6-455C-B383-947DDE85DF36"
$siteID = "108D28E9-DAC1-4EEA-9566-6591394E6D40"
$WebID = "4E068646-2C87-4868-924E-850C31F607DF"
 
#Get file
$site = Get-SPSite -Identity $siteID
$web = Get-SPWeb -Identity $WebID -Site $siteID
$file = $web.GetFile([GUID]$setupFileID)
 
#Report on location
$filelocation = "{0}{1}" -f ($site.WebApplication.Url).TrimEnd("/"), $file.ServerRelativeUrl
Write-Host "Found file location:" $filelocation
 
#Delete the file, the Delete() method bypasses the recycle bin
$file.Delete()
 
$web.dispose()
$site.dispose()

SQL sample for listing web part information:

USE WSS_Content_MissingAssembly_Snapshot
  
SELECT WebID, SiteID, DirName, LeafName, tp_WebPartTypeId, tp_WebPartIDProperty
FROM AllDocs WITH (NOLOCK) inner join AllWebParts on AllDocs.Id = AllWebParts.tp_PageUrlID
WHERE AllWebParts.tp_WebPartTypeID = '817a5bd9-0698-4c62-7c51-5c9966468f0d'

PowerShell sample for removing webpart by ID:

$siteID = "108D28E9-DAC1-4EEA-9566-6591394E6D40"
$webID = "4E068646-2C87-4868-924E-850C31F607DF"
$dirName = "sites/lab5-4/SitePages"
$leafName = "Home.aspx"
$webPartID = "g_bb56b03e_b830_4e37_ba16_62250601ac26"
 
#Get Web
$web = Get-SPweb -Identity $webID -Site $siteID
 
#Build page url
$pageURL = "{0}{1}/{2}" -f ($site.WebApplication).url, $dirName, $leafName
 
#Get SPFile
$page = $web.GetFile($pageURL)
 
#Delete the web part on the current published page
$webPartManager = $page.GetLimitedWebPartManager([System.Web.UI.WebControls.WebParts.PersonalizationScope]::Shared)
 
#Delete web part by ID
$webPart = $webPartManager.WebParts[$webPartID]
$webPartManager.DeleteWebPart($webPart)
$web.Dispose()

SQL sample for listing event receiver information:

USE WSS_Content_MissingAssembly_Snapshot
  
Select Id, SiteID, WebID, HostType, hostId 
FROM EventReceivers (NOLOCK) where Assembly = 'ContosoLIb, Version=1.0.0.0, Culture=neutral, PublicKeyToken=1b7baa1677de7aa0'

PowerShell sample for removing event receiver:

#Variables
$hostType = "0"
$siteID = "108D28E9-DAC1-4EEA-9566-6591394E6D40"
$webID = "00000000-0000-0000-0000-000000000000"
$hostID = "108D28E9-DAC1-4EEA-9566-6591394E6D40"
$assemblyID = "80A9D912-768A-4289-91AB-9BF368922F8F"
 
 
#Perform cleanup
 
if ($hostType -eq "0")
    {
        $site = GEt-SPSite -limit all -Identity $siteID
        ($site.EventReceivers | ?{$_.id -eq $assemblyID}).delete()
        $site.dispose()
    }
    elseif ($hostype -eq "1")
    {
        $web = Get-SPWeb -Identity $webID -Site $siteID
        ($web.EventReceivers | ?{$_.id -eq $assemblyID}).delete()
        $web.dispose()
    }
    elseif ($hostype -eq "2")
    {
        $web = Get-SPWeb -Identity $webID -Site $siteID
        $list = $web.lists | ?{$_.id -eq $hostID}
        ($list.EventReceivers | ?{$_.id -eq $assemblyID}).delete()
        $web.dispose()
    }

Above code reference URL:

https://blogs.technet.microsoft.com/dawiese/2017/05/09/post-upgrade-cleanup-missing-server-side-dependencies/

For planing and preparing the check list for content DB migration – you may refer the below content:

The basic steps are as below: 

  • Prepare detailed inventory of environment
    Clean up old environment
  • Test content
  • Prepare destination environment and analyze new environment configurations
    Communicate with users
  • Start migration
  • Read only mode until migration completes
  • Post migration, third party tools and resources

Reference URL:

  • https://www.advaiya.com/blog/sharepoint-2016-migration-checklist/
  • https://docs.microsoft.com/en-us/sharepoint/upgrade-and-update/checklist-for-database-attach-upgrade-sharepoint-2013

Various types of issues and their descriptions with fixes during running the Test-SPContentDatabase :

SharePoint Content Database Migration

Notes:

  1. You may ignore the error or exception from Test-SPContentDatabase command, still your Mount-SPContentDatabase will work.
  2. While running the Mount-SPContentDatabase for certain content database – if you get an exception or up to some extend some errors, you can ignore those and continue in further migration, still your migrated site will work fine and in these scenario if you see database upgrade status from central admin, we can see upgrade completed with errors status but we can live with this.
  3. After content db migration thru database detach and attach approach – we may see some issues in the migrated master page, css and java script code as a result we may expect some differences in the migrated site look and feel and other css and scripting related issue – this is a general behavior which we need to fix manually even though it is time consuming.

References:

  • https://blogs.technet.microsoft.com/dawiese/2017/05/09/post-upgrade-cleanup-missing-server-side-dependencies/
  • https://www.advaiya.com/blog/sharepoint-2016-migration-checklist/
  • https://docs.microsoft.com/en-us/sharepoint/upgrade-and-update/checklist-for-database-attach-upgrade-sharepoint-2013
  • https://sharegate.com/blog/sharepoint-content-database-migration-monitoring