SharePoint – User profile – ResetSynchronizationDatabase : Operation is not valid due to the current state of the object

Problème

En voulant faire un reset de la base de synchronisation UPS de SharePoint, j’ai eu le message d’erreur suivant:

PS C:> $upa.ResetSynchronizationDatabase()
 Exception calling "ResetSynchronizationDatabase" with "0" argument(s):
 "Operation is not valid due to the current state of the object."
 At line:1 char:1
 + $upa.ResetSynchronizationDatabase()
 + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
 + CategoryInfo : NotSpecified: (:) [], MethodInvocationException
 + FullyQualifiedErrorId : InvalidOperationException

Solution

La base est en fait en miroir SQL. Au même moment, dans les journaux du serveur SharePoint:

event_5586

Il faut d’abord supprimer le miroir puis recommencer.

 

 

Restaurer une base SQL server via powershell

clear

#---------------------------------------------------
$server="mysqlserver"
$endpoint_port="5022"
$instance="myNamedSQLinstance"
$emailFrom = "provisioning@mydomain.com"
$emailTo = "mathieu.chateau@lotp.fr"
$smtpServer = "mysmtpserver"
$sendmail=$true
$foldersource='\myfileserverbackupFromDev$'
$folderarchived='\myfileserverbackupFromDev$done'
$excludeList=@()
$excludeList+='master'
$excludeList+='tempdb'
$excludeList+='model'
#---------------------------------------------------
$foldersource="c:"
$folderarchived="F:"

$majorError=$true
$global:log=@()
try
{
    [System.Reflection.Assembly]::LoadWithPartialName("Microsoft.SqlServer.SMO")  | out-null
    [System.Reflection.Assembly]::LoadWithPartialName("Microsoft.SqlServer.SmoExtended") | Out-Null
    [System.Reflection.Assembly]::LoadWithPartialName("Microsoft.SqlServer.ConnectionInfo") | Out-Null
    [System.Reflection.Assembly]::LoadWithPartialName("Microsoft.SqlServer.SmoEnum")
    $source = new-object ('Microsoft.SqlServer.Management.Smo.Server') "$server$instance"
    $majorError=$false
}
catch
{
       AddLog "major error, one side not reachable $_"
       "major error, one side not reachable $_"
       $majorError=$true
}

function AddLog($text)
{
       $global:log+=$text
       Write-Host $text
}

if ($majorError -eq $false)
{
       $databases = $source.Databases
       foreach ($file in (Get-childitem $foldersource -Filter "*.bak"))
       {
               $dbname=$file.Name -replace (".bak","")
               if ($excludeList -notcontains $dbname)
            {
                #not on the blacklist
                if (($databases | ?{$_.Name -ieq $dbname}) -eq $null)
                {
                    #database does not exist
                    try
                    {
                        #Restore
                        $targetDBFilePath = $source.MasterDBPath + "" + $dbName + ".mdf"
                        $targetLogFilePath = $source.MasterDBLogPath + "" + $dbName + ".ldf"
                        AddLog "   going to restore $dbname to:"
                        AddLog "   $targetDBFilePath and $targetLogFilePath"
                        $restore = new-object ('Microsoft.SqlServer.Management.Smo.Restore')
                        $restore.Action = 'Database'
                        $restore.Database = $dbname
                        ##$backupDataFile=$dbbk.Devices[0].Name
                        #$restore.Devices.AddDevice($backupDataFile, [Microsoft.SqlServer.Management.Smo.DeviceType]::File)
                        $backupfile=New-Object ("Microsoft.SqlServer.Management.Smo.BackupDeviceItem")($file.FullName, "File")
                        $restore.Devices.Add($backupfile)
                        #$restoredetails=$restore.ReadBackupHeader($source)
                        $relocateDataFile = new-object ('Microsoft.SqlServer.Management.Smo.RelocateFile')
                        $relocateLogFile  = new-object ('Microsoft.SqlServer.Management.Smo.RelocateFile')
                        $dbFileList = $restore.ReadFileList($source)
                        $relocateDataFile.LogicalFileName = $dbFileList.Select("Type = 'D'")[0].LogicalName
                        $relocateDataFile.PhysicalFileName = $targetDBFilePath
                        $relocateLogFile.LogicalFileName = $dbFileList.Select("Type = 'L'")[0].LogicalName
                        $relocateLogFile.PhysicalFileName = $targetLogFilePath
                        $restore.RelocateFiles.Add($relocateDataFile)
                        $restore.RelocateFiles.Add($relocateLogFile)
                        $restore.ReplaceDatabase = $False
                        $restore.NoRecovery = $False
                        $restore.SqlRestore($source)
                        AddLog "     Restore done"
                        Move-Item $file.FullName $folderarchived
                    }
                    catch
                    {
                        AddLog "    error during restore: $_"
                        $majorError=$true
                        break
                    }
                    
                }
                else
                {
                    #blacklisted name
                    AddLog "database $dbname / $($files.Names) already exist"
                }
            }
            else
            {
                AddLog "Forbidden databasename: $dbname"
            }
       
       }
}

if($sendmail)
{
       $temp=""
       foreach ($line in $log)
       {
              $temp+=$line+"`r`n"
       }
       $smtp = new-object Net.Mail.SmtpClient($smtpServer)
       $smtp.Send($emailFrom, $emailTo,"SQL mirror automator",$temp)
}


$log

SCOM 2007 R2: base operationsManager sur SQL Server 2008 R2

Contrairement à SCCM 2007R2, SCOM n’accepte pas d’installer la base OperationsManager/Data Warehouse sur un SQL Server 2008 R2. La vérification des pré requis échoue, indiquant que SQL Server n’est pas installé:

Le moyen le plus simple que j’ai trouvé est d’utiliser DBCreateWizard, disponible sur le CD/iso dans \SupportTools\AMD64. Il permet de créer la base OperationsManager et Data Warehouse:

Une fois le RMS installé, je vous conseil de passer la Cumulative Update #2.

SQL 2005: erreur 17809

Récemment, j’ai eu une erreur surprenante: le nombre maximum d’utilisateur a été atteint sur SQL Server 2005. C’est pourtant une édition entreprise en cluster. Le DBA précédant avait configuré la limite à 200 utilisateurs simultanés, ce qui va assez vite quand on a du Sharepoint à proximité…

Le message d’erreur peut induire en erreur, car l’adresse IP est juste celle du 200ème client, qui n’y est pas forcément pour grand chose dans la quantité de connexions simultanées:

error 17809  could not connect because the maximum number of user connections has already been reached

Affichez les options avancées, dont le paramètre user connections:

sp_configure 'show advanced options', 1
go
reconfigure 
go

Modifier la limite à 500:

sp_configure 'user connections', 500
go

Enlever la limite (paramètre par défaut):

sp_configure 'user connections', 500
go

Le point noir est qu’il faut redémarrer l’instance pour que le paramètre soit effectif…