サイトコレクションを異なる Web アプリケーションにコピーする

投稿者: | 2013年9月1日

はじめに

サイトコレクションのコピー、簡単そうで実は非常に手間のかかる作業です。
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 だけを表示するようにしています。






続いて、コピー用のコンテンツデータベースを作成するため、New-SPContentDatabase コマンドを実行します。
ここでは、Web アプリケーション http://sp2013dev にコンテンツデータベース WSS_Content_Move を作成します。
コマンドは 2 行になっていますが、実際には 1 行で書いてください。








 

2.作成したコピー用コンテンツデータベースにコピー対象となるサイトコレクションをコピー

サイトコレクション http://sp2013dev/sites/test をコピー用コンテンツデータベースに別名でコピーするため、Copy-SPSite コマンドを実行します。
コマンドは 3 行になっていますが、実際は 1 行で書いてください。



ここで再び Get-SPSite で状態を確認してみます。







7 行目のサイトコレクションが、6 行目のサイトコレクションからコピーされたサイトコレクションになります。

3.コピー用コンテンツデータベースをコピー元 Web アプリケーションから切り離す

コピー用コンテンツデータベースをコピー元 Web アプリケーションから切り離し、コピー先に移動できるようにするため、Dismount-SPContentDatabase コマンドを実行します。








4.コピー用コンテンツデータベースをコピー先 Web アプリケーションに接続

コピー先 Web アプリケーションにコピー用コンテンツデータベースを接続するため、Mount-SPContentDatabase コマンドを実行します。








ここで再び Get-SPSite コマンドを実行して、サイトコレクションがコピーできていることを確認します。







6 行目のサイトコレクション test_copy が、Web アプリケーション sp2013dev:12930 に含まれていることが確認できます。
ただし、この状態ではまだコピー用コンテンツデータベースに属している状態なので、次のステップで、sp2013dev:12930 の既存のコンテンツデータベースにサイトコレクションを移動します。

5.コピー用コンテンツデータベースからコピー先 Web アプリケーションの既存コンテンツデータベースにコピー元サイトコレクションをコピー

コピー先 Web アプリケーション http://sp2013dev:12930 の既存のコンテンツデータベース WSS_Content_ebed969934304a32a00c5118674fb677 にサイトコレクションをコピーするため、Copy-SPSite コマンドを実行します。
コマンドは 3 行になっていますが、実際は 1 行で書いてください。



 

では、Get-SPSite コマンドできちんとコピーされたか確認します。








6 行目のサイトコレクションが、8 行目のサイトコレクションのコピーとなります。
ここで、ブラウザから実際にサイトコレクションにアクセスして、コピーされているかどうか確認してください。
問題なければ、次のステップで 7 行目のサイトコレクションを消します。

6.コピー先 Web アプリケーションからコピー用コンテンツデータベースを削除

最後にコピー用使ったコンテンツデータベースとサイトコレクションを削除します。
コンテンツデータベースを消すことで、サイトコレクションも消すことができるので、Remove-SPContentDatabase コマンドを実行しコンテンツデータベースを削除します。
















これでコピーが完了しました。
最後に Get-SPSite コマンドで状態を確認します。







はい、ゴミも消えて、きちんとコピーされた状態になりました。

上記の通り、非常に手順が多いです。
間違えてもやり直しはききますが、不安な方は市販ツールを使うようにするのが良いと思います。