实现一个SiteCollection一个ContentDatabase
在Sharepoint中,一个WebApplication可以有一个到多个ContentDatabase,而一个SiteCollection只能在一个ContentDatabase中(不能跨ContentDB)。
如果Farm Administrator不手动添加,可能就会一直用一个ContentDB,其结果就是多个SiteCollection共享一个ContentDB,这本身没有大的问题,因为一个ContentDB即使大到100G,据说Sharepoint也可以管理得很好。
但是作为Best Practice,推荐是为每一个SiteCollection使用独立的ContentDB,这样便于管理,便于备份恢复...N多好处。
新发现:如果创建WebApplication时手动添加了多个ContentDatabase,当你在该WebApp中创建新的SC时,Sharepoint会自动使用空的ContentDB而不是在默认的那个ContentDB中加入新SC,以此看来,Sharepoint默认会follow一个SC一个ContentDB的最佳实践。
但是如何能实现这一点呢?很简单,既可以用Central Administration来实现也可以用Powershell来实现:
1. Central Administration
思路是将WebApplication中现有的ContentDatabase的容量最大值设置成当前已有的SiteCollection数,然后再创建新的ContentDatabase,并且设置成最多只能放一个SiteCollection。这样当创建新的SiteCollection时,系统就会自动选择新建的那个ContentDatabase了。
这篇Blog的作者做了更多的实验,比如把一个空的ContentDatabase的WarningSiteCount和MaxSiteCount都设置成0,Central Admin会给出错误提示,而实际上设置是有作用的。有趣的是,当再一次更改其他ContentDatabase的属性时,那个0-0设置会自动恢复成系统默认值9000-15000。
在Central Admin里面创建SiteCollection时无法指定ContentDatabase,而用Powershell可以做到(New-SPSite的-ContentDatabase参数)
2. Powershell
function Create-SC-OwnCDB($dbserver, $ncdbname, $webapp, $site, $owner1, $owner2)
{
Add-PSSnapin Microsoft.SharePoint.PowerShell -ErrorAction SilentlyContinue
New-SPContentDatabase -Name $ncdbname -DatabaseServer $dbserver -WebApplication $webapp | out-null
New-SPSite -URL $site -OwnerAlias $owner1 -SecondaryOwnerAlias $owner2 -ContentDatabase $ncdbname | out-null
Get-SPContentDatabase -Site $site | Set-SPContentDatabase -MaxSiteCount 1 -WarningSiteCount 0
Write-Host " "
Write-Host "Site Collection at " $site " has been created in the " $ncdbname " content database" -ForegroundColor Yellow
}Create-SC-OwnCDB -dbserver xxx -ncdbname WSS_Content_Abc -webapp http://aserver:6666/ -site http://aserver:6666/sites/Abc -owner1 domain\user1 -owner2 domain\user2
此外,还有一个有用的Powershell命令可以用来将一个SiteCollection迁移到其它ContentDB:
Move-SPSite: http://technet.microsoft.com/en-us/library/ff607915.aspx