Bienvenue à Blogs CodeS-SourceS Identification | Inscription | Aide

Blog Technique de Romelard Fabrice

Les dernières Actualités de Romelard Fabrice (Alias fabrice69 ou F___) principalement autour des technologies Microsoft

Actualités

  • Toutes les actualités et informations sur les technologies Microsoft principalement autour de .NET et SQL Server

Archives

SharePoint : Déplacement de plusieurs collections de sites entre les bases de données de contenu

Dans le cadre de l’administration d’une ferme SharePoint, il existe une situation qui peut être compliquée à gérer.

En effet, lorsque l’on crée sa ferme SharePoint, une base de données de contenu est automatiquement créée, sans que l’on y prète vraiment attention. On ajoute au fil du temps de nouvelles collections de sites qui chacune va croitre à son propre rythme.


Le cas classique se présente alors au bout de quelques mois par des complications lors des taches de sauvegarde ou autres taches d’administration. En effet, on se retrouve alors au bout d’un certain temps avec notre base de données par défaut qui atteint une taille critique pour son administration.

Nous avions vu dans un précédent article comment gérer correctement les bases de données de contenu SharePoint :

La solution est donc bien évidemment de créer une nouvelle base de données de contenu. Le soucis est que celle-ci ne sera utile que pour les futures collections de sites à créer et non pour celles existantes.


Déplacement d’une collection spécifique de sites

On peut alors utiliser la méthode expliquée dans cette page :

Cette méthode fonctionne parfaitement si on ne possèpde qu’une seule collection de sites à bouger, mais devient rapidement impossible si notre base de contenu contient plusieurs dizaines de collections.


Déplacement automatique de plusieurs collections

Cette question s’est donc posée face à une ferme WSS V3 de production possédant une seule base de contenu avec une centaine de collections de sites. Cette base dépassait les 500 GB de volume et posait de réels problèmes lors des sauvegardes.

L’idée a donc été de créer un script permettant de déplacer les collections de sites les plus légères de cette grosse base de contenu vers une nouvelle créée spécifiquement pour l’occasion.

Pour cela il faut commencer par créer une nouvelle base de données de contenu depuis le site SharePoint (ou via STSADM) en donnant une valeur limite Maximale de collection plus élevée que celles déjà existantes.

En effet, SharePoint placera la collection dans la base de données ayant la valeur la plus élevée :

  • Différentiel = [Maximum Number of Sites] - [Current Number of Sites]

Cela donnera quelque chose proche de :

image

A ce stade, notre ferme placera toute nouvelle collection de sites dans la base de données Content_DB5. On doit définir de quelle base voulons nous passer les collections dans la nouvelle Content_DB5.

Il nous suffit maintenant d’utiliser un script PowerShell développé pour l’occasion :


function Move-SmallSiteCollections([string]$WebApplicationURL, [string]$ContentDataBaseSource, [int]$SPSiteSizeLimit, [string]$RootPathTostore)
{
    [xml]$SPSiteList = stsadm -o enumsites -url $WebApplicationURL -databasename $ContentDataBaseSource

    Write-Host " Web Application URL $WebApplicationURL - ContentDB: $ContentDataBaseSource - Total Site Collection:", $SPSiteList.Sites.Site.Count

    $SPSitesFromDBToMove = $SPSiteList.Sites.Site | Sort-Object { [int]$_.StorageUsedMB } | Where-Object { [int]$_.StorageUsedMB -lt $SPSiteSizeLimit }

    Write-Host " Site Collections to move (less than $SPSiteSizeLimit MB) :", $SPSitesFromDBToMove.Count

    if ($SPSitesFromDBToMove.Count -gt 0)
    {
        foreach ($mySPSiteToMove in $SPSitesFromDBToMove)
        {
            Write-Host "   ------ "
            [string]$SPSiteURL = $mySPSiteToMove.Url
            [int]$LastSlashIndex = $SPSiteURL.LastIndexOf("/") + 1
            [int]$URLLenght = $SPSiteURL.length
            [int]$SPSiteSize = $mySPSiteToMove.StorageUsedMB
            [string]$SPSiteName = $SPSiteURL.Substring($LastSlashIndex, ($URLLenght - $LastSlashIndex) )
            [string]$BackUpFilePath = $RootPathTostore + $SPSiteName + ".DAT"

            Write-Host " SPSite $SPSiteName - Size: $SPSiteSize"
            #Write-Host " Last Slash Index:", $LastSlashIndex, "- URL Lenght:", $URLLenght

            Write-Host " MOVE SHAREPOINT SPSite $SPSiteName - $SPSiteURL"

            Write-Host " BACKUP SPSite $SPSiteURL to $BackUpFilePath"
            stsadm -o backup -url $SPSiteURL -filename $BackUpFilePath -overwrite

            Write-Host " DELETE SPSite $SPSiteURL"
            stsadm -o deletesite -url $SPSiteURL

            Write-Host " RESTORE SPSite $SPSiteURL"
            stsadm -o restore -url $SPSiteURL  -filename $BackUpFilePath -overwrite

            Write-Host "   ------ "
        }
    }
    Write-Host "------------------------------------------------------------------"

}

function StartProcess()
{
    [string]$MyWebApplicationURL = "

    [string]$MyContentDataBaseSource = "MyContentDBSource01"
    [int]$MySPSiteSizeLimit = 100
    [string]$MyRootPathTostore = "C:\Temp\BackupRestoreTemp\"

    # Create the stopwatch
    [System.Diagnostics.Stopwatch] $sw;
    $sw = New-Object System.Diagnostics.StopWatch
    $sw.Start()
    #cls

    Write-Host "------------------------------------------------------------------"
    Move-SmallSiteCollections $MyWebApplicationURL $MyContentDataBaseSource $MySPSiteSizeLimit $MyRootPathTostore
   
    Write-Host "------------------------------------------------------------------"
    $sw.Stop()
    # Write the compact output to the screen
    write-host "Site collection moved - Time: ", $sw.Elapsed.ToString()
}

StartProcess


Il vous suffit dès lors de fournir les valeurs pour votre ferme :

  • $MyWebApplicationURL : URL de la Web App
  • $MyContentDataBaseSource : Content DB où se trouvent les collections à déplacer
  • $MySPSiteSizeLimit : Taille maximale des collections qui doivent être déplacées
  • $MyRootPathTostore : Répertoire permettant le Backup des collections durant le transfert

Dans notre exemple, le script fera le déplacement de toutes les collections présentes dans la base de données “MyContentDBSource01” dont la taille ne dépasse pas 100 MB.


ATTENTION :

Comme toutes les taches d’administration, il faut absolument effectuer ce travail avec une grande prudence et surtout bien vérifier que vos collections soient bien restaurées. En effet, dans des fermes ayant encore des traces de WSS V2, cette restauration peut poser problème et vous risquer de ne pas pouvoir remonter celle-ci.


Conclusion

Ce travail permet de répartir la charge entre différentes bases de données indépendantes les unes des autres. Cela aura aussi pour conséquence d’améliorer les performances globales de votre ferme, car le moteur SQL travaillera sur des volumes plus raisonnables.

Il est aussi primordial d’isoler les collections qui sont susceptibles de dépasser les 50 GB de contenu (valeur empirique). L’idée étant de laisser chaque grosse collection dans sa base de données de contenu. Vous aurez alors une meilleure souplesse en cas d’évolution de cette collection vers une éventuelle ferme dédiée.

Le script PowerShell est ajouté dans le projet CodePlex dédié :


Liens utiles :

Romelard Fabrice [MVP]

Ce post vous a plu ? Ajoutez le dans vos favoris pour ne pas perdre de temps à le retrouver le jour où vous en aurez besoin :
Posted: mardi 4 janvier 2011 16:50 par ROMELARD Fabrice

Commentaires

lognoulm a dit :

Bonjour Fabrice. J'avais l'habitude de passer par le backup/restore quand le command "mergecontentdbs" n'était pas encore dispo ou que celle-ci pouvait provoquer une corruption des bases de contenu (http://support.microsoft.com/kb/969242/fr).

Maintenant que ce problème est résolution, elle est à privilégier car plus rapide, moins intrusive et surtout beaucoup moins complexe à mettre en oeuvre. http://technet.microsoft.com/fr-fr/library/cc262923(office.12).aspx

Bonne journée!

# janvier 6, 2011 09:09

ROMELARD Fabrice a dit :

OK

Bonne remarque, même si la solution du MergeDB ne fait pas exactement la même chose que mon script, il est important de la connaître.

Merci en tous cas.

Romelard Fabrice [MVP]

# janvier 6, 2011 10:33
Les commentaires anonymes sont désactivés

Les 10 derniers blogs postés

- Merci par Blog de Jérémy Jeanson le 10-01-2019, 20:47

- Office 365: Script PowerShell pour auditer l’usage des Office Groups de votre tenant par Blog Technique de Romelard Fabrice le 04-26-2019, 11:02

- Office 365: Script PowerShell pour auditer l’usage de Microsoft Teams de votre tenant par Blog Technique de Romelard Fabrice le 04-26-2019, 10:39

- Office 365: Script PowerShell pour auditer l’usage de OneDrive for Business de votre tenant par Blog Technique de Romelard Fabrice le 04-25-2019, 15:13

- Office 365: Script PowerShell pour auditer l’usage de SharePoint Online de votre tenant par Blog Technique de Romelard Fabrice le 02-27-2019, 13:39

- Office 365: Script PowerShell pour auditer l’usage d’Exchange Online de votre tenant par Blog Technique de Romelard Fabrice le 02-25-2019, 15:07

- Office 365: Script PowerShell pour auditer le contenu de son Office 365 Stream Portal par Blog Technique de Romelard Fabrice le 02-21-2019, 17:56

- Office 365: Script PowerShell pour auditer le contenu de son Office 365 Video Portal par Blog Technique de Romelard Fabrice le 02-18-2019, 18:56

- Office 365: Script PowerShell pour extraire les Audit Log basés sur des filtres fournis par Blog Technique de Romelard Fabrice le 01-28-2019, 16:13

- SharePoint Online: Script PowerShell pour désactiver l’Option IRM des sites SPO non autorisés par Blog Technique de Romelard Fabrice le 12-14-2018, 13:01