はじめに
サイトコレクションのコピー、簡単そうで実は非常に手間のかかる作業です。
AvePoint さんの製品 コンテンツマネージャー を使えば簡単にできてしまいますが、ここでは手動で異なる Web アプリケーションにサイトコレクションをコピーする方法をご紹介します。
(2013年9月13日追記)
本記事は2013年9月1日に公開しましたが、マイクロソフトのサポートサービスさんにテクニカルサポートを依頼し、詳細な確認をしていただいたところ、この手順ではコピーはできるものの問題があることが分かりました。
詳細はこの後書きますが、基本的にはこの手順でのコピーは行わないでください。
Copy-SPSite の問題
Copy-SPSite は、Backup/Restore と同様、SharePoint が内部的に持っている各種 GUID を書き換えることなく、コピーを行います。
そのため、一つのサイトコレクションのコピーを、同一コンテンツ DB に Copy-SPSite を使って複数個コピーすると、GUID が重複してしまい、SharePoint として不整合なデータの状態になってしまうことが分かりました。
これにより、エクスポートでエラーが起きたり、ゴミ箱のアイテムを削除するのにエラーが起きたりと、一部動作に問題がでます。
従って、せっかくの Copy-SPSite ですが、これを使ってサイトコレクションを量産していくということには使えないということになります。
調査の結果、SharePoint 標準機能を使ってサイトコレクションのコピーを完ぺきに実現する方法はない、という結論に至りました。
残念。。。
もちろん、Copy-SPSite を使って、毎回異なるコンテンツ DB にコピーする分には問題なく使えますので、そのような用途でのみ Copy-SPSite を使うようにしてください。
概要
今回は http://sp2013dev/sites/test というサイトを、http://sp2013dev:12930/sites/test にコピーする手順を題材にします。
これから説明する手順は、すべて PowerShell で行う必要があるのですが、実行するコマンドが多いので先に全体の流れを説明します。
コピーの全体の流れは以下の通りとなります。
1.サイトコレクションコピー用のコンテンツデータベース作成
2.作成したコピー用コンテンツデータベースにコピー対象となるサイトコレクションをコピー
3.コピー用コンテンツデータベースをコピー元 Web アプリケーションから切り離す
4.コピー用コンテンツデータベースをコピー先 Web アプリケーションに接続
5.コピー用コンテンツデータベースからコピー先 Web アプリケーションの既存コンテンツデータベースにコピー元サイトコレクションをコピー
6.コピー先 Web アプリケーションからコピー用コンテンツデータベースを削除
実施手順
それでは1ステップずつ説明します。
まずは、PowerShell を利用するため、SharePoint がインストールされたサーバーにログインして「SharePoint 2013 管理シェル」を起動してください。
1.サイトコレクションコピー用のコンテンツデータベース作成
まず、現在のサイトコレクションの状態を確認するため Get-SPSite コマンドを実行します。
「| select url, id」を付けることで、URL と ID だけを表示するようにしています。
1 | <span class="lnum"> 1: </span>PS C:> Get-SPSite | select url,id |
1 | <span class="lnum"> 2: </span> |
1 | <span class="lnum"> 3: </span>Url ID |
1 | <span class="lnum"> 4: </span>--- -- |
1 | <span class="lnum"> 5: </span>http://sp2013dev:12930 a4dc6b0e-6013-4e70-9357-610cae9e1f34 |
1 | <span class="lnum"> 6: </span>http://sp2013dev/sites/test 14eee793-4466-4ac8-b297-8823a7ccec71 |
続いて、コピー用のコンテンツデータベースを作成するため、New-SPContentDatabase コマンドを実行します。
ここでは、Web アプリケーション http://sp2013dev にコンテンツデータベース WSS_Content_Move を作成します。
コマンドは 2 行になっていますが、実際には 1 行で書いてください。
1 | <span class="lnum"> 1: </span>New-SPContentDatabase -Name WSS_Content_Move |
1 | <span class="lnum"> 2: </span>-WebApplication http://sp2013dev |
1 | <span class="lnum"> 3: </span> |
1 | <span class="lnum"> 4: </span>Id : a2c84a3e-f55b-41f1-934e-8e5c4b29f46b |
1 | <span class="lnum"> 5: </span>Name : WSS_Content_Move |
1 | <span class="lnum"> 6: </span>WebApplication : SPWebApplication Name=SharePoint - 80 |
1 | <span class="lnum"> 7: </span>Server : SP2013DEVSharePoint |
1 | <span class="lnum"> 8: </span>CurrentSiteCount : 0 |
2.作成したコピー用コンテンツデータベースにコピー対象となるサイトコレクションをコピー
サイトコレクション http://sp2013dev/sites/test をコピー用コンテンツデータベースに別名でコピーするため、Copy-SPSite コマンドを実行します。
コマンドは 3 行になっていますが、実際は 1 行で書いてください。
1 | <span class="lnum"> 1: </span>PS C:> Copy-SPSite -Identity http://sp2013dev/sites/test |
1 | <span class="lnum"> 2: </span>-TargetUrl http://sp2013dev/sites/test_copy |
1 | <span class="lnum"> 3: </span>-DestinationDatabase WSS_Content_Move |
ここで再び Get-SPSite で状態を確認してみます。
1 | <span class="lnum"> 1: </span>PS C:> Get-SPSite | select url,id |
1 | <span class="lnum"> 2: </span> |
1 | <span class="lnum"> 3: </span>Url ID |
1 | <span class="lnum"> 4: </span>--- -- |
1 | <span class="lnum"> 5: </span>http://sp2013dev:12930 a4dc6b0e-6013-4e70-9357-610cae9e1f34 |
1 | <span class="lnum"> 6: </span>http://sp2013dev/sites/test 14eee793-4466-4ac8-b297-8823a7ccec71 |
1 | <span class="lnum"> 7: </span>http://sp2013dev/sites/test_copy 31d5ea5e-1fa7-42f5-a56e-039e656f8fdd |
7 行目のサイトコレクションが、6 行目のサイトコレクションからコピーされたサイトコレクションになります。
3.コピー用コンテンツデータベースをコピー元 Web アプリケーションから切り離す
コピー用コンテンツデータベースをコピー元 Web アプリケーションから切り離し、コピー先に移動できるようにするため、Dismount-SPContentDatabase コマンドを実行します。
1 | <span class="lnum"> 1: </span>PS C:> Dismount-SPContentDatabase -Identity WSS_Content_Move |
1 | <span class="lnum"> 2: </span> |
1 | <span class="lnum"> 3: </span>確認 |
1 | <span class="lnum"> 4: </span>この操作を実行しますか? |
1 | <span class="lnum"> 5: </span>対象 <span class="str">"WSS_Content_Move"</span> に対して操作 <span class="str">"Dismount-SPContentDatabase"</span> |
1 | <span class="lnum"> 6: </span>を実行しています。 |
1 | <span class="lnum"> 7: </span>[Y] はい(Y) [A] すべて続行(A) [N] いいえ(N) [L] すべて無視(L) [S] 中断(S) |
1 | <span class="lnum"> 8: </span>[?] ヘルプ(既定値は <span class="str">"Y"</span>): Y |
4.コピー用コンテンツデータベースをコピー先 Web アプリケーションに接続
コピー先 Web アプリケーションにコピー用コンテンツデータベースを接続するため、Mount-SPContentDatabase コマンドを実行します。
1 | <span class="lnum"> 1: </span>PS C:> Mount-SPContentDatabase -Name WSS_Content_Move |
1 | <span class="lnum"> 2: </span>-WebApplication http://sp2013dev:12930 |
1 | <span class="lnum"> 3: </span> |
1 | <span class="lnum"> 4: </span>Id : a2c84a3e-f55b-41f1-934e-8e5c4b29f46b |
1 | <span class="lnum"> 5: </span>Name : WSS_Content_Move |
1 | <span class="lnum"> 6: </span>WebApplication : SPWebApplication Name=SharePoint - 12930 |
1 | <span class="lnum"> 7: </span>Server : SP2013DEVSharePoint |
1 | <span class="lnum"> 8: </span>CurrentSiteCount : 1 |
ここで再び Get-SPSite コマンドを実行して、サイトコレクションがコピーできていることを確認します。
1 | <span class="lnum"> 1: </span>PS C:> Get-SPSite | select url,id |
1 | <span class="lnum"> 2: </span> |
1 | <span class="lnum"> 3: </span>Url ID |
1 | <span class="lnum"> 4: </span>--- -- |
1 | <span class="lnum"> 5: </span>http://sp2013dev:12930 a4dc6b0e-6013-4e70-9357-610cae9e1f34 |
1 | <span class="lnum"> 6: </span>http://sp2013dev:12930/sites/test_copy 31d5ea5e-1fa7-42f5-a56e-039e656f8fdd |
1 | <span class="lnum"> 7: </span>http://sp2013dev/sites/test 14eee793-4466-4ac8-b297-8823a7ccec71 |
6 行目のサイトコレクション test_copy が、Web アプリケーション sp2013dev:12930 に含まれていることが確認できます。
ただし、この状態ではまだコピー用コンテンツデータベースに属している状態なので、次のステップで、sp2013dev:12930 の既存のコンテンツデータベースにサイトコレクションを移動します。
5.コピー用コンテンツデータベースからコピー先 Web アプリケーションの既存コンテンツデータベースにコピー元サイトコレクションをコピー
コピー先 Web アプリケーション http://sp2013dev:12930 の既存のコンテンツデータベース WSS_Content_ebed969934304a32a00c5118674fb677 にサイトコレクションをコピーするため、Copy-SPSite コマンドを実行します。
コマンドは 3 行になっていますが、実際は 1 行で書いてください。
1 | <span class="lnum"> 1: </span>PS C:> Copy-SPSite -Identity http://sp2013dev:12930/sites/test_copy |
1 | <span class="lnum"> 2: </span>-TargetUrl http://sp2013dev:12930/sites/test |
1 | <span class="lnum"> 3: </span>-DestinationDatabase WSS_Content_ebed969934304a32a00c5118674fb677 |
では、Get-SPSite コマンドできちんとコピーされたか確認します。
1 | <span class="lnum"> 1: </span>PS C:> Get-SPSite | select url,id |
1 | <span class="lnum"> 2: </span> |
1 | <span class="lnum"> 3: </span>Url ID |
1 | <span class="lnum"> 4: </span>--- -- |
1 | <span class="lnum"> 5: </span>http://sp2013dev:12930 a4dc6b0e-6013-4e70-9357-610cae9e1f34 |
1 | <span class="lnum"> 6: </span>http://sp2013dev:12930/sites/test d2aa70b4-9948-4ff7-b60e-801f1ac5d452 |
1 | <span class="lnum"> 7: </span>http://sp2013dev:12930/sites/test_copy 31d5ea5e-1fa7-42f5-a56e-039e656f8fdd |
1 | <span class="lnum"> 8: </span>http://sp2013dev/sites/test 14eee793-4466-4ac8-b297-8823a7ccec71 |
6 行目のサイトコレクションが、8 行目のサイトコレクションのコピーとなります。
ここで、ブラウザから実際にサイトコレクションにアクセスして、コピーされているかどうか確認してください。
問題なければ、次のステップで 7 行目のサイトコレクションを消します。
6.コピー先 Web アプリケーションからコピー用コンテンツデータベースを削除
最後にコピー用使ったコンテンツデータベースとサイトコレクションを削除します。
コンテンツデータベースを消すことで、サイトコレクションも消すことができるので、Remove-SPContentDatabase コマンドを実行しコンテンツデータベースを削除します。
1 | <span class="lnum"> 1: </span>PS C:> Remove-SPContentDatabase -Identity WSS_Content_Move |
1 | <span class="lnum"> 2: </span> |
1 | <span class="lnum"> 3: </span>確認 |
1 | <span class="lnum"> 4: </span>この操作を実行しますか? |
1 | <span class="lnum"> 5: </span>対象 <span class="str">"WSS_Content_Move"</span> に対して操作 <span class="str">"Remove-SPContentDatabase"</span> |
1 | <span class="lnum"> 6: </span>を実行しています。 |
1 | <span class="lnum"> 7: </span>[Y] はい(Y) [A] すべて続行(A) [N] いいえ(N) [L] すべて無視(L) [S] 中断(S) |
1 | <span class="lnum"> 8: </span>[?] ヘルプ(既定値は <span class="str">"Y"</span>): Y |
1 | <span class="lnum"> 9: </span> |
1 | <span class="lnum"> 10: </span>確認 |
1 | <span class="lnum"> 11: </span><span class="str">'WSS_Content_Move'</span> を削除すると、SQL |
1 | <span class="lnum"> 12: </span>データベースおよびデータベース内に格納されているすべての内容が完全に削除されま |
1 | <span class="lnum"> 13: </span>す。SQL データベースを削除しない場合は、Dismount-SPContentDatabase |
1 | <span class="lnum"> 14: </span>を使用してください。 |
1 | <span class="lnum"> 15: </span>[Y] はい(Y) [A] すべて続行(A) [N] いいえ(N) [L] すべて無視(L) [S] 中断(S) |
1 | <span class="lnum"> 16: </span>[?] ヘルプ(既定値は <span class="str">"Y"</span>): Y |
これでコピーが完了しました。
最後に Get-SPSite コマンドで状態を確認します。
1 | <span class="lnum"> 1: </span>PS C:> Get-SPSite | select url,id |
1 | <span class="lnum"> 2: </span> |
1 | <span class="lnum"> 3: </span>Url ID |
1 | <span class="lnum"> 4: </span>--- -- |
1 | <span class="lnum"> 5: </span>http://sp2013dev:12930 a4dc6b0e-6013-4e70-9357-610cae9e1f34 |
1 | <span class="lnum"> 6: </span>http://sp2013dev:12930/sites/test d2aa70b4-9948-4ff7-b60e-801f1ac5d452 |
1 | <span class="lnum"> 7: </span>http://sp2013dev/sites/test 14eee793-4466-4ac8-b297-8823a7ccec71 |
はい、ゴミも消えて、きちんとコピーされた状態になりました。
上記の通り、非常に手順が多いです。
間違えてもやり直しはききますが、不安な方は市販ツールを使うようにするのが良いと思います。