SharePoint Server、通称SPSで原因不明のエラーが出ることがある。
特定の条件でコンテンツデータベース(WSS_Content)をリストアした後、エラーとなってサイトが閲覧できなくなるという厄介な問題である。
オンプレミス(サーバー設置型)のSharePoint Serverを構築・検証したことのある方だと経験されたことがあるかもしれない。
この現象の根本原因は謎だが、打ち手はある。しかしWEB上に情報がないため記録しておこうと思う。
- WFEサーバー複数台環境でコンテンツDBをリストアすると、WFE経由でサイトが閲覧できない
- 原因不明だが打ち手はある。犯人は恐らくsharepoint timer service
- 上記がダメならもうpowershellでunmount、mountを実施せよ
- キャッシュクリアを自動化したい場合
WFEサーバー複数台環境でコンテンツDBをリストアすると、WFE経由でサイトが閲覧できない
サーバーの全体管理のコンテンツデーターベースの管理からGUIでコンテンツDB(WSS_Content)を追加すると、WFEサーバー経由でアクセスした場合にコンテンツDBへの接続ができずにサイト閲覧ができないという現象。
クライアントPCからWFE経由でWEBサイトにアクセスすると、ブラウザで真っ白な画面が表示されてしまう。まるで精神と時の部屋のようだ。状況によっては404エラーが表示されることもある。
しかし、なぜかAPPサーバーからサイトにアクセスすると通常通りサイトの閲覧が可能になっている。
サーバーの全体管理において、コンテンツデーターベースの管理ではコンテンツDBは正しく追加されており、開始済みの表示になっている。
また、サーバーの全体管理のサイトコレクションのリストでは正常にリスト表示されている。
各サーバーでPowerShellを起動し、get-spcontentdatabase -webapplication http://www.pastel-software.work などと確認するとAPPサーバーではリストアしたコンテンツDB表示されることが確認できるが、WFEサーバーではリストアしたDBが確認できないという状況である。
原因不明だが打ち手はある。犯人は恐らくsharepoint timer service
複数台構成のWFEサーバーそれぞれでPowershellを起動し、sharepoint timer serviceのconfiguration cacheをクリアするというもの。
-
対象WFEサーバーにて、SharePoint TimerJobServiceを停止
- C:ProgramDataMicrosoftSharePointConfig{GUID} 配下のXMLファイルを全削除、cache.iniの値を1に修正して保存
- 対象WFEサーバーのSharePoint TimerJobServiceを開始
- 2の{GUID}フォルダーの中にXMLのキャッシュファイルが自動作成されていくことを確認
- get-spcontentdatabase -webapplication https://www.pastel-software.work/ を確認しコンテンツDBの存在を確認
- 1~5をすべてのWFEサーバーで実行
- 動作確認をする(これで大丈夫のはず。検討を祈る)
XMLファイルを2で全削除する前のXMLのファイル数と、4以降に自動作成されるconfiguration cacheのXMLファイル数が微妙に異なる。
比較はしていないが、その差分のファイルのどこかにリストア前のDBの情報が格納されていてDBの登録がうまくいかないように見えている。
上記がダメならもうpowershellでunmount、mountを実施せよ
こちらも何故うまくいくのかわからないが、回避できるケースがある。
- 対象コンテンツDBを切断(サーバーの全体管理を使うGUI操作でもPowerShellからDismount-SPContentDatabaseでも良い)
- SMS(SQLserver Management Studio)から対象のDBをデタッチ。
- SMSから対象のコンテンツDBをアタッチ。
- 対象コンテンツDBをPowerShellからMount-SPContentDatabaseで追加登録する
これでWFEサーバー経由でWEBサイトが閲覧できるようになることがある。
ただし、この方法ではsharepoint timer serviceのconfiguration cacheはクリアできていないので、内部に不整合が生じていると後々の不具合の原因になるかもしれない。
上記1~4の後にキャッシュクリアもしておくことを推奨する。
キャッシュクリアを自動化したい場合
何度も繰り返し行う必要はないと想定されますが、手作業はミスの原因となるリスクがあるため、スクリプトで対応する方法を検討されると思います。
powershellで以下のコマンドを実行することで自動化が可能です。お手元の環境で確認をした上でご活用ください。
------
# Add Snapin
# Start Loading SharePoint Snap-in$snapin = (Get-PSSnapin -name Microsoft.SharePoint.PowerShell -EA SilentlyContinue)IF ($snapin -ne $null){write-host -f Green “SharePoint Snap-in is loaded… No Action taken”}ELSE {write-host -f Yellow “SharePoint Snap-in not found… Loading now”Add-PSSnapin Microsoft.SharePoint.PowerShellwrite-host -f Green “SharePoint Snap-in is now loaded”}# END Loading SharePoint Snapin
##################
Stop-Service SPTimerV4
$folders = Get-ChildItem C:\ProgramData\Microsoft\SharePoint\Config
foreach ($folder in $folders)
{
$items = Get-ChildItem $folder.FullName -Recurse
foreach ($item in $items)
{
if ($item.Name.ToLower() -eq “cache.ini”)
{
$cachefolder = $folder.FullName
}
}
}
$cacheIn = Get-ChildItem $cachefolder -Recurse
foreach ($cachefolderitem in $cacheIn)
{
if ($cachefolderitem -like “*.xml”)
{
$cachefolderitem.Delete()
}
}
$a = Get-Content $cachefolder\cache.ini
$a = 1
Set-Content $a -Path $cachefolder\cache.ini
read-host “press ENTER”
start-Service SPTimerV4
------
どなたかのお役に立ちますように。
役に立った方はtwitteなどでシェアお願いいたします。
では、また次の記事で!