Domanda

La nostra installazione di SharePoint 2007 ha un cestino di ricicli di primo stadio immenso. Ho scritto uno script di PowerShell a quando elimina i vecchi articoli. Solo per divertimento, questo è stato pubblicato di seguito.

Update2: Abbiamo 42.500.000 records nella tabella di riciclo nel database dei contenuti !!
Ho capito che il nostro lavoro BDLC che è stato programmato prima che venissi alla squadra ha pompato così tanti dati nella tabella di ricicli che anche SharePoint non riescono a gestirlo correttamente senza tempo. Anche il nostro script programmato può rimuovere 1000 record ogni 30 minuti. Fai la matematica su questo, poi ti dispiace per me. Ci sono così tanti record che ora non puoi nemmeno rafforzare le quote senza tempo di sharepoint. Sembra che sembreremo di congelare l'eliminazione dei record in BDLC

Update1: Ho eseguito il mio script PowerShell per eliminare ogni elemento e RAN SQL Profiler per scoprire Proc_DeletereCyclebinitem è stato eseguito che tocca più tavoli quindi stiamo per attaccare Con uno script PowerShell programmato per eseguire / riportare ogni n minuti.

Abbiamo 38.500.000 records nella tabella di riciclo nel database del contenuto !!

Io credo che il motivo sia così immenso sia perché abbiamo BDLC da Layer2 Sincronizza i dati da altri sistemi ed è il riciclaggio dei record eliminati. Inoltre, è così grande che anche il lavoro del timer di SharePoint nativo non può controllarlo e tempi ...

So che ti farò scattare dalla mafia di SharePoint chiedendo questo, ma ... ha mai eliminato le righe dalla tabella RecycleBin effettiva in un database dei contenuti di SharePoint? Il nostro è 15430792 KB (14,7 GB).

Sono consapevole del fatto che Microsoft deriderà il supporto se si modifica un database dei contenuti. Per favore non inviarlo come risposta. Certo che non è la migliore pratica. Questa domanda è chiaramente: qualcuno ha mai provato? ...

Sto semplicemente cercando un modo più veloce per pulire il cestino del riciclo. Puoi vedere i miei script qui sotto così ovviamente ho cercato di stabilire un po 'di mantenenza con esso. Il bidone diventa così grande che ci vuole per sempre per gli script da eseguire perché ci sono così tanti dati.

I nostri dati utente sono in realtà 203790168 KB (194.3 GB) e ho scritto uno script PS per ottenere file di grandi dimensioni, quindi posso gestire anche quella dimensione. Che, anche sotto per conquistare l'etere.

Inoltre, abbiamo un BDLC (w / 3RD Strumento party da Layer2) che sincronizza i dati di sincronizzazione e FRO SQL. Credo che questo lavoro elimina un sacco di dati regolarmente che rendono enorme la tavola di ricicli.

Immagino che la risposta alla mia stessa domanda possa essere ... qualcosa come ... Pianifica un'attività per eseguire lo script di mantenimento che ho già scritto ... 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
.

È stato utile?

Soluzione

Ho eseguito il mio script PowerShell per eliminare ciascun elemento e Ran SQL Profiler per scoprire Proc_DeletereCyclebinitem è in esecuzione che tocca più tabelle, quindi andremo con uno script di PowerShell programmato per eseguire / reportogni n minuti.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a sharepoint.stackexchange
scroll top