سؤال

يشتمل تثبيت SharePoint 2007 الخاص بنا على سلة محذوفات هائلة في المرحلة الأولى.لقد كتبت برنامج PowerShell النصي منذ فترة والذي يحذف العناصر القديمة.للمتعة فقط، هذا ما تم نشره أدناه.

التحديث 2: لدينا أكثر من 42,500,000 سجل في جدول سلة المحذوفات في قاعدة بيانات المحتوى!!
لقد اكتشفت أن مهمة BDLC الخاصة بنا والتي تمت جدولتها قبل انضمامي إلى الفريق كانت تضخ الكثير من البيانات في جدول RecycleBin حتى أن SharePoint لا يمكنه إدارتها بشكل صحيح دون انتهاء المهلة.حتى البرنامج النصي المجدول لدينا يمكنه فقط إزالة 1000 سجل كل 30 دقيقة.قم بالحسابات على ذلك، ثم أشعر بالأسف من أجلي.هناك العديد من السجلات التي لا يمكنك الآن فرض الحصص بدون انتهاء مهلة SharePoint.يبدو أننا سنضطر إلى تجميد حذف السجلات في BDLC

التحديث 1: لقد قمت بتنفيذ البرنامج النصي PowerShell الخاص بي لحذف كل عنصر وقمت بتشغيل SQL Profiler لمعرفة ذلك proc_DeleteRecycleBinItem يتم تنفيذه والذي يمس جداول متعددة لذلك سنلتزم ببرنامج PowerShell النصي المجدول للتشغيل/الإبلاغ كل N دقيقة.

لدينا أكثر من 38,500,000 سجل في جدول سلة المحذوفات في قاعدة بيانات المحتوى!!

أعتقد أن السبب وراء ضخامة هذا الأمر هو أن لدينا BDLC بواسطة Layer2 يقوم بمزامنة البيانات من الأنظمة الأخرى وهو يقوم بإعادة تدوير السجلات المحذوفة.بالإضافة إلى ذلك، فهو كبير جدًا لدرجة أنه حتى وظيفة SharePoint Timer الأصلية لا يمكنها التحكم فيه وتنتهي المهلة...

أعلم أنني سأتعرض لإطلاق النار من قبل SharePoint Mafia عندما أطرح هذا السؤال ولكن...هل قام أي شخص بحذف الصفوف من الملف الفعلي RecycleBin الجدول في قاعدة بيانات محتوى SharePoint؟حجمنا هو 15430792 كيلو بايت (14.7 جيجا بايت).

أدرك أن Microsoft ستسقط الدعم إذا قمت بتعديل قاعدة بيانات المحتوى.من فضلك لا تنشر ذلك كإجابة.بالطبع هذه ليست أفضل الممارسات.هذا السؤال هو بوضوح:هل جربها أحد من قبل؟...

أنا ببساطة أبحث عن طريقة أسرع لتنظيف سلة المحذوفات.يمكنك رؤية النصوص الخاصة بي أدناه لذا من الواضح أنني كنت أحاول إنشاء بعض الصيانة معها.تصبح سلة المهملات كبيرة جدًا لدرجة أن تشغيل البرامج النصية يستغرق وقتًا طويلاً نظرًا لوجود الكثير من البيانات.

بيانات المستخدم لدينا هي في الواقع 203790168 كيلو بايت (194.3 جيجا بايت) وقد كتبت برنامج نصي PS للحصول على ملفات كبيرة حتى أتمكن من إدارة هذا الحجم أيضًا.وهذا أيضًا أدناه للمساهمة في الأثير.

لدينا أيضًا BDLC (مع أداة خارجية من Layer2) تقوم بمزامنة بيانات SQL ذهابًا وإيابًا.أعتقد أن هذه الوظيفة تحذف الكثير من البيانات بانتظام مما يجعل جدول RecycleBin ضخمًا.

أعتقد أن الإجابة على سؤالي قد تكون...شيء مثل...جدولة مهمة لتشغيل البرنامج النصي للصيانة الذي كتبته بالفعل ...أمم...

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
هل كانت مفيدة؟

المحلول

لقد قمت بتنفيذ البرنامج النصي PowerShell الخاص بي لحذف كل عنصر وقمت بتشغيل SQL Profiler لمعرفة ذلك proc_DeleteRecycleBinItem يتم تنفيذه والذي يمس جداول متعددة لذلك سنلتزم ببرنامج PowerShell النصي المجدول للتشغيل/الإبلاغ كل N دقيقة.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى sharepoint.stackexchange
scroll top