I ended up contacting MS support of to assist with resolution. The root cause was the timer service "instance" was offline on the server. Since there was only one server in farm, timer jobs no longer ran. The timer service (windows service) itself was running, but the service instance (Farm level on server) was not.
This was found by running the following commands:
$farm = Get-SPFarm
$disabledTimers = $farm.TimerService.Instances | where {$_.Status -ne "Online"}
After that was ran, then we cold use the following commands to change it back to "online"
if ($disabledTimers -ne $null)
{
foreach ($timer in $disabledTimers)
{
Write-Host "Timer service instance on server " $timer.Server.Name " is not Online. Current status:" $timer.Status
Write-Host "Attempting to set the status of the service instance to online"
$timer.Status = [Microsoft.SharePoint.Administration.SPObjectStatus]::Online
$timer.Update()
}
}
else
{
Write-Host "All Timer Service Instances in the farm are online! No problems found"
}
This then allowed the timer jobs to then run. Of course by this time, the One-Once jobs were backlogged and since they did not complete, they did not clean themselves up.
Ran:
Get-SPTimerJob | ?{$_.schedule.description -eq "One-time"} |select displayname,server,locktype,lastruntime | fl
I then just ran to clean up:
$job = Get-SPTimerJob | ?{$_.schedule.description -eq "One-time"}
$job[0].Delete()
After that was completed, I was able to remove he search service and get everything back to running normal.
Note: (I am not sure if it was part of cause, or a result of troubleshooting but the exact same error was replicated in my test environment when I validated these steps) We found that the Job definitions page gave an "object reference not set to an instance of an object" error after that point. I found this article to finish the clean up: http://sharepointviews.com/review-job-definitions-page-error/
This basically consisted of the following commands:
Get-SPTimerJob | ? { $_.DisplayName -eq $null }| select name, Id
$FaultyJob = Get-SPTimerJob <Guid of the job>
$Faultyjob.Delete()
I hope that at least some of this can help someone else that may be struggling.