Spring til indholdet

Flyt et SharePoint-dokumentbibliotek til en ny SiteCollection med PowerShell

Et SharePoint 2010-site var vokset ud af sin Content Database og bygget på en skabelon, der ikke fandtes mere. Så lister og biblioteker måtte flyttes én ad gangen med Export-SPWeb og Import-SPWeb.

PowerShell 3 min. læsning

Sagen#

For nylig løb jeg ind i et typisk SharePoint-problem. Et SharePoint 2010-site eksploderede i lagerforbrug. Brugerne uploadede som gale til ét enkelt dokumentbibliotek, og jeg havde brug for at flytte dokumentbiblioteket og et par lister til et nyt site i en ny SiteCollection. Kildesitet, var bygget på en SiteTemplate, som kunden ikke længere havde adgang til. Det betød, at en traditionel backup/restore ikke virkede. Jeg var nødt til at eksportere/importere det enkelte dokumentbibliotek og listerne én ad gangen.

Ifølge Microsoft Best Practise (som man næsten/nogle gange altid bør følge) skal størrelsen på Content Databasen holdes under 100 GB-mærket. Nogle siger 200 GB, men Health Analyzer brokker sig, når man når 100 GB. Problemet er heldigvis ikke så stort, hvis man bruger 2013. De nyere SharePoint- og SQL-servere er bedre til at håndtere større databaser, men ikke desto mindre holder jeg gerne mine DB’er under 200 GB.

Løsning#

Der er to måder at lave flytningen på. Den ene er at tage en backup af hele sitet og så gendanne backuppen i en ny SiteCollection. Det virkede ikke for mig, da jeg kun skulle flytte nogle få dokumentbiblioteker og ikke ville have afhængighederne med. Så jeg gik med plan B. At flytte listerne og bibliotekerne hver for sig.

  1. Opret en ny Content Database til WebApplication’en
  2. Sæt den nuværende Content Database til “Offline”
  3. Opret en ny SiteCollection og et nyt site, som skal bruges som destinationssite (Det burde placere den nye SiteCollection i den nye Content Database)
  4. Brug scriptet nedenfor til at kopiere listerne og bibliotekerne til den nye SiteCollection, der ligger i den nye Content Database

PowerShell-script#

 ##Don't forget to tweak the code below to fit your needs.
 add-pssnapin microsoft.sharepoint.powershell

##Location of temporary backup files
 $path = "e:\"

## Add a few variables to work with
 $OldURL = "http://intranet.domain.com/departement/"
 $NewURL = "http://intranet.domain.com/departements/"
 $departement = "sales"

##All lists that needs to be exported
 $list = @("Clients","Contacts")

##All libraries that needs to be exported
 md -Path ($path + "\" + $afdeling)

##Export and import the lists
 foreach($i in $list){Export-SPWeb ($OldURL + $departement) -Path ($path + $departement + "\" + $i + ".cmp") -ItemUrl ("/departement/" + $departement + "/" + $i) -IncludeVersions All -IncludeUserSecurity}

foreach($i in $list){Import-SPWeb ($NewURL + $departement) -Path ($path + $departement + "\" + $i + ".cmp") –UpdateVersions Overwrite -IncludeUserSecurity}

##Export and import the libraries
 foreach($i in $list){Export-SPWeb ($OldURL + $departement) -Path ($path + $departement + "\" + $i + ".cmp") -ItemUrl ("/departement/" + $departement + "/" + $i) -IncludeVersions All -IncludeUserSecurity}

foreach($i in $list){Import-SPWeb ($NewURL + $departement) -Path ($path + $departement + "\" + $i + ".cmp") –UpdateVersions Overwrite -IncludeUserSecurity}

##Cleanup
 Remove-Item -Recurse -Force ($path + $afdeling)

Detaljer#

I SharePoint er der flere måder at skalere indholdet ud på. Afhængigt af kunden og deres behov kan man lave nogle skøn over, hvor meget lagerplads de vil bruge. Men min erfaring er, at kunden ofte overrasker og bruger sit SharePoint på en måde, man ikke havde forventet.

SharePoints arkitektur:#

  • WebApplication
    • SiteCollections
      • Sites
        • Lister og biblioteker

SharePoints regler:#

  • Man kan have masser af Content Databases i én WebApplication.
    • Man kan have masser af SiteCollections i én Content Database
      • Man kan have masser af Sites i én SiteCollection
        • Man kan have masser af lister og biblioteker i ét site
  • En SiteCollection kan kun ligge i én Content Database
  • SiteCollections kan nemt flyttes mellem Content Databases med en simpel PowerShell-kommando
  • Sites har ingen PowerShell-kommando til at flytte Sites mellem SiteCollections
  • I PowerShell hedder et SharePoint-site SPWeb (hvilket bare er pokkers forvirrende)

Sidst opdateret

Del

Relaterede

Tags