Pregunta

Nuestro SharePoint 2007 instalación tiene una particularmente inmenso de la Primera Etapa de la Papelera de reciclaje.Escribí un script de PowerShell un tiempo que elimina los elementos antiguos.Sólo por diversión, que se publica a continuación.

UPDATE2: Hemos 42,500,000+ registros en la Papelera de reciclaje de la tabla en la Base de datos de Contenido!!
Me di cuenta de que nuestro BDLC trabajo que estaba programada antes de que me vino en el equipo ha sido bombeo tanto de datos en la Papelera de la tabla que incluso SharePoint puede gestionar correctamente sin que se agote el tiempo.Incluso nuestro script programado sólo puede eliminar registros de 1000 cada 30 minutos.Hacer los cálculos en que, luego de sentir lástima por mí.Hay muchos registros que ahora usted no puede incluso hacer cumplir las cuotas de SharePoint sin tiempo de espera.Parece vamos a tener que congelar el borrado de registros en BDLC

UPDATE1: He ejecutado mi script de PowerShell para eliminar cada elemento y corrió el Analizador de SQL para averiguar proc_DeleteRecycleBinItem está siendo ejecutado que toca varias mesas así que vamos a seguir con un programado un script de PowerShell para ejecutar/informe de cada N minutos.

Hemos 38,500,000+ registros en la Papelera de reciclaje de la tabla en la Base de datos de Contenido!!

Creo que la razón de esto es tan inmenso es porque tenemos BDLC por Layer2 la sincronización de datos desde otros sistemas y es el Reciclaje de los registros eliminados.Además, es tan grande que incluso el nativo de Trabajo de Temporizador de SharePoint que no puede controlarlo y el tiempo de espera...

Sé que me gustaría recibir un disparo por el SharePoint de la Mafia por preguntar esto, pero...¿alguien ha eliminado las filas de la real RecycleBin tabla en una base de datos de contenido de SharePoint?La nuestra es 15430792 KB (14.7 GB).

Soy consciente de que Microsoft eliminará la compatibilidad si desea modificar una base de datos de contenido.Por favor, no publicar que como la respuesta.Por supuesto que no es la mejor práctica.Esta pregunta es clara:¿alguien ha probado?...

Simplemente estoy buscando una manera más rápida de limpiar la Papelera de reciclaje.Usted puede ver mi secuencias de comandos de abajo así que, obviamente, he estado tratando de establecer algunas mantenimiento con ella.El Reciclaje llega a ser tan grande que se tarda una eternidad para la ejecución de los scripts porque hay tantos datos.

Los datos de nuestros usuarios es realmente 203790168 KB (194.3 GB) y escribí un PS script para obtener archivos de gran tamaño para que yo pueda manejar ese tamaño.Que, también contribuyen a continuación para volver a éter.

Además, disponemos de un BDLC (w/ 3 ª parte de la herramienta de Layer2) que la sincronización de datos de un lado a otro de SQL.Creo este trabajo se elimina gran cantidad de datos con regularidad que hacen de la Papelera de mesa enorme.

Supongo que la respuesta a mi propia pregunta podría ser...algo así como...programar una tarea para que se ejecute el mantenimiento de secuencia de comandos ya he escrito...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
¿Fue útil?

Solución

ejecuté mi script de PowerShell para eliminar cada elemento y corrí a SQL Profiler para averiguar proc_deleterecyclebinitem se está ejecutando, lo que toca varias tablas para que vamos a seguir con un script de PowerShell programado para ejecutar / informarcada n minutos.

Licenciado bajo: CC-BY-SA con atribución
scroll top