Question

Notre installation SharePoint 2007 dispose d'une corbeille de première étape particulièrement immense.J'ai écrit il y a quelque temps un script PowerShell qui supprime les anciens éléments.Juste pour le plaisir, c'est posté ci-dessous.

MISE À JOUR2 : Nous avons plus de 42 500 000 enregistrements dans la table Corbeille de la base de données de contenu !!
J'ai compris que notre travail BDLC qui était planifié avant mon arrivée dans l'équipe avait pompé tellement de données dans la table RecycleBin que même SharePoint ne pouvait pas le gérer correctement sans délai.Même notre script programmé ne peut supprimer que 1 000 enregistrements toutes les 30 minutes.Faites le calcul là-dessus, puis soyez désolé pour moi.Il y a tellement d’enregistrements que vous ne pouvez même plus appliquer de quotas sans que SharePoint n’expire.Il semble que nous devrons geler la suppression des enregistrements dans BDLC

MISE À JOUR1 : J'ai exécuté mon script PowerShell pour supprimer chaque élément et exécuté SQL Profiler pour le savoir. proc_DeleteRecycleBinItem est en cours d'exécution et touche plusieurs tables. Nous allons donc nous en tenir à un script PowerShell planifié pour être exécuté/rapporté toutes les N minutes.

Nous avons plus de 38 500 000 enregistrements dans la table Corbeille de la base de données de contenu !!

Je crois que la raison pour laquelle cela est si immense est que nous avons BDLC by Layer2 qui synchronise les données d'autres systèmes et qu'il s'agit du recyclage des enregistrements supprimés.De plus, il est si volumineux que même le travail SharePoint Timer natif ne peut pas le contrôler et expire...

Je sais que je me ferais tirer dessus par la mafia SharePoint en posant cette question, mais...quelqu'un a-t-il déjà supprimé des lignes du fichier réel RecycleBin table dans une base de données de contenu SharePoint ?Le nôtre fait 15430792 Ko (14,7 Go).

Je suis conscient que Microsoft abandonnera le support si vous modifiez une base de données de contenu.S'il vous plaît, ne postez pas cela comme réponse.Bien sûr, ce n’est pas une bonne pratique.Cette question est clairement :est-ce que quelqu'un l'a déjà essayé ?...

Je cherche simplement un moyen plus rapide de nettoyer la corbeille.Vous pouvez voir mes scripts ci-dessous, donc j'ai évidemment essayé d'établir une certaine maintenance avec eux.Le chutier devient si grand que l'exécution des scripts prend une éternité car il y a tellement de données.

Nos données utilisateur sont en réalité de 2 037 90 168 Ko (194,3 Go) et j'ai écrit un script PS pour obtenir des fichiers volumineux afin de pouvoir également gérer cette taille.Cela, également ci-dessous, pour contribuer à l'éther.

En outre, nous avons un BDLC (avec un outil tiers de Layer2) qui synchronise les données vers et depuis SQL.Je crois que ce travail supprime régulièrement de nombreuses données, ce qui rend la table RecycleBin énorme.

Je suppose que la réponse à ma propre question pourrait être...quelque chose comme...planifier une tâche pour exécuter le script de maintenance que j'ai déjà écrit...hmmm...

function RemoveOldItems-SPFirstStageRecycleBin([string]$url, [int]$rowlimit, [int]$days) 
{
    $siteCollection = New-Object Microsoft.SharePoint.SPSite($url);  
    $recycleQuery = New-Object Microsoft.SharePoint.SPRecycleBinQuery;
    $recycleQuery.ItemState = [Microsoft.SharePoint.SPRecycleBinItemState]::FirstStageRecycleBin
    $recycleQuery.OrderBy = [Microsoft.SharePoint.SPRecycleBinOrderBy]::DeletedDate
    $recycleQuery.RowLimit = $rowlimit

    $recycledItems = $siteCollection.GetRecycleBinItems($recycleQuery);

    $count = $recycledItems.Count;

    for($i = 0; $i -lt $count; $i++){
        $age = ((Get-Date) - $recycledItems[$i].DeletedDate).Days;
        if($age -gt $days){
            $g = New-Object System.Guid($recycledItems[$i].ID);
            $recycledItems.Delete($g);
        }
    }

    $siteCollection.Dispose()
}



function Get-DocInventory() {
    [void][System.Reflection.Assembly]::LoadWithPartialName("Microsoft.SharePoint")
    $farm = [Microsoft.SharePoint.Administration.SPFarm]::Local
    foreach ($spService in $farm.Services) {
        if (!($spService -is [Microsoft.SharePoint.Administration.SPWebService])) {
            continue;
        }

        foreach ($webApp in $spService.WebApplications) {
            if ($webApp -is [Microsoft.SharePoint.Administration.SPAdministrationWebApplication]) { continue }

            foreach ($site in $webApp.Sites) {
                foreach ($web in $site.AllWebs) {
                    foreach ($list in $web.Lists) {
                        if ($list.BaseType -ne "DocumentLibrary") {
                            continue
                        }
                        foreach ($item in $list.Items) {
                            $data = @{
                                "Web Application" = $webApp.ToString()
                                "Site" = $site.Url
                                "Web" = $web.Url
                                "list" = $list.Title
                                "Item ID" = $item.ID
                                "Item URL" = $item.Url
                                "Item Title" = $item.Title
                                "Item Created" = $item["Created"]
                                "Item Modified" = $item["Modified"]
                                "Size (kb)" = $item.File.Length/1KB
                                "Size (gb)" = $item.File.Length/1GB

                            }

                            Write-Host $item.Url -ForegroundColor DarkGray

                            # Only add files larger than 100 MB
                            if($item.File.Length -gt 100MB){
                                Write-Host $site.Url + $item.Url -ForegroundColor Red
                                New-Object PSObject -Property $data
                            }
                        }
                    }
                    $web.Dispose();
                }
                $site.Dispose()
            }
        }
    }
}
#Get-DocInventory | Out-GridView
Get-DocInventory | Export-Csv -NoTypeInformation -Path D:\Logs\inventory.csv


$jobName = "Get Large Lists"

function Get-LargeLists() {
    [void][System.Reflection.Assembly]::LoadWithPartialName("Microsoft.SharePoint")

    #create stop watch
    [System.Diagnostics.Stopwatch] $sw;
    $sw = New-Object System.Diagnostics.Stopwatch
    $sw.Start()

    $lists = @()
    $reportSiteUrl = "http://my-site.gov/sites/applications/reporting/"
    $reportListUrl = $reportSiteUrl + "Lists/Large%20Lists/"
    $farm = [Microsoft.SharePoint.Administration.SPFarm]::Local
    foreach ($spService in $farm.Services) {
        if (!($spService -is [Microsoft.SharePoint.Administration.SPWebService])) {continue}

        foreach ($webApp in $spService.WebApplications) {
            if ($webApp -is [Microsoft.SharePoint.Administration.SPAdministrationWebApplication]) {continue}

            foreach ($site in $webApp.Sites) {
                foreach ($web in $site.AllWebs) {
                    foreach ($list in $web.Lists) {
                        # only add items that have 1000 items or more
                        if($list.ItemCount -le 99){continue}

                        # create new object
                        $o = New-Object Object
                        Add-Member -InputObject $o -MemberType NoteProperty -Name SiteCollectionUrl -Value $list.ParentWeb.Site.RootWeb.Url
                        Add-Member -InputObject $o -MemberType NoteProperty -Name ListURL -Value ($list.ParentWeb.Url + "/" + $list.RootFolder.Url)
                        Add-Member -InputObject $o -MemberType NoteProperty -Name Title -Value $list.Title
                        Add-Member -InputObject $o -MemberType NoteProperty -Name Description -Value $list.Description
                        Add-Member -InputObject $o -MemberType NoteProperty -Name ItemCount -Value $list.ItemCount

                        # add object to $list global array
                        $lists += $o
                    }
                    $web.Dispose()
                }
                $site.Dispose()
            }
        }
    }

    #export array to csv
    $lists | Export-Csv D:\Logs\large_lists.csv -NoTypeInformation -Force

    #connect to SharePoint Site and List
    $s = New-Object Microsoft.SharePoint.SPSite($reportSiteUrl)
    $w = $s.openweb()
    $l = $w.GetList($reportListUrl)

    #clear SharePoint List
    $query = New-Object Microsoft.SharePoint.SPQuery
    $query.ViewAttributes = "Scope='Recursive'"
    $query.Query = ""

    $items = $l.GetItems($query)
    $items | % { $l.GetItemById($_.Id).Delete() }

    #export to SharePoint List
    $lists | ForEach{
        $item = $l.Items.Add()
        $item["Title"] = $_.Title
        $item["SiteCollectionUrl"] = $_.SiteCollectionUrl

        $u = New-Object Microsoft.SharePoint.SPFieldUrlValue
        $u.Description = "Link"
        $u.Url = $_.ListURL
        $item["URL"] = $u

        $item["Description"] = $_.Description
        $item["Count"] = $_.ItemCount
        $item.Update()
    }

    $w.Dispose()
    $s.Dispose()

    #stop timer and log event
    $sw.Stop()

    C:\_scripts\sp_log.ps1 -jobName $jobName -message "Reported large lists on SharePoint Farm." -type "Success" -duration $sw.Elapsed.Seconds -linkTitle "Link" -linkUrl "http://my-site.gov/sites/applications/reporting/Lists/Large%20Lists/"
}

#catch exceptions
trap [Exception]{
    C:\_scripts\sp_log.ps1 -jobName $jobName -message  $_.Exception.Message -type "Error" -duration $sw.Elapsed.Seconds -linkTitle "Link" -linkUrl "http://my-site.gov/sites/applications/reporting/Lists/Large%20Lists/"
}

Get-LargeLists
Était-ce utile?

La solution

J'ai exécuté mon script PowerShell pour supprimer chaque élément et Ran SQL Profiler pour savoir proc_déléterecyclebinitem est exécuté qui touche plusieurs tables afin que nous allons coller avec un script PowerShell planifié pour exécuter / signalertoutes les n minutes.

Licencié sous: CC-BY-SA avec attribution
Non affilié à sharepoint.stackexchange
scroll top