Gradual Site Collection Deletion
I had a mission to achieve overnight; move 28 site collections into a new managed path, as well as rename the 28 associated content databases. Pretty straightforward to do, and to script in advance to run in stages:
- Backup site collections
- Delete site collections
- Dismount content databases
- Rename content databases and shuffle around underlying storage including FILESTREAM RBS location
- Create the new managed path; reset of IIS
- Remount 28 content DBs
- Delete the old managed path
- Restore the 27 content databases (this is where tinkling glass is heard, followed by painful silence)
After enough jolt cola to get that turtle to beat the hare fair and square, I got to the bottom of the problem. First the problem. The site collections could not be restored into their original database, as the site collection purportedly already existed there. Even though it was deleted.
By midnight I gave up, and did the 28 Restore-SPSite into any random content databases, tossing organization and structure to the winds (temporarily), knowing I’ve got gads of available storage, knowing once I got to the bottom of the issue, a simple set of move-spsite commands would set things right. No, I don’t like randomness, but I also like a few winks of sleep and happy users…
Now the cause. Since SharePoint 2010 SP1 and SP2013 and SP2013, has the ability to recover deleted site collections (not through the UI, but only through PowerShell). I used the -gradualdelete option, thinking I would be nice and gentle with a production farm. Here’s a sample of my delete commands, where I also disable prompting:
Remove-spsite href="http ://sharepoint/div/clm/int/A/" -confirm:$false -gradualdelete
Here’s the kicker. After the delete, the site collection is indeed still there. It sticks around actually for the duration of the the Recycle Bin duration (default 30 days). There’s one good way to see, let’s dive into the forbidden content database, and have a peek:
SELECT [DeletionTime] ,[Id] ,[SiteId] ,[InDeletion] ,[Restorable] FROM [Content_mydivision_a].[dbo].[SiteDeletion] where (Restorable=1)
Restorable=1 indicates this site collection could be restored.
The solution? Well, it’s not the recycle bin job, that has no effect on this. There is a gradual delete job at the web application level, but that won’t help us either; at least not just yet. First you have to use the remove-spsite CmdLet to remove each site permanently. Here’s the syntax:
remove-spdeletedsite f5f7639d-536f-4f76-8f94-57834d177a99 -confirm:$false
Ah, you don’t know your Site Collection GUIDs by heart? well, me neither, I prefer more useful allocation of brain cells, so here’s the command that will give you the Site Collection GUIDs that have been (partially) deleted:
get-spdeletedsite -webapplication "http ://sharepoint/"
So, you got your partially deleted GUIDs, you diligently did a remove-spdeletedsite for each, but the Restore-SPSite still will not work. Now’s the time to run the handy-dandy Gradual Delete timer job for your web application, in Central Admin, Monitoring. First thing you might notice is the job is taking a bit of time to run. That’s good, it’s doing something for you, and actually triggering the Content DB Stored Procedure called proc_DeleteSiteCoreAsync. It actually deletes in batches.
Here’s how to wipe out all these mildly annoying site collections from your recycle bin for a web application:
get-spdeletedsite -webapplication "http://my-srv-sp10/" | Remove-SPDeletedSite
At this point your Restore-SPSite will work to your target content database, and if you played SharePoint Roulette like me and restored to a random location, a move-SPSite will make fast work of putting things where they should be.
More information on the Gradual Deletion Timer Job can be found in this Technet Article by Bill Baer