お気に入りのSharepointサイトにアクセスできず、残りのすべてがSharepointサーバーに接続できないコンテンツベースだけであることに気付いた場合はどうなりますか? Sharepointデータベースに保存されている最も重要なドキュメントの「兆」を復元する方法は? この記事から短い悲しい話とこれらの質問への回答を学ぶことができます。
最も美しい朝ではないある日に、偶然Todd Klindt
の記事
「緊急時のSharePoint 2010の復元」で説明されている状況に遭遇しました
。 パート2 " :
1つのSQL Serverシステムと1つのSharePointサーバーで構成される通常の小規模ファームがあるとします。 優れたSQL Server管理者として、毎晩すべてのデータベースのコピーを作成します。 ある晴れた朝、「SharePointがクラッシュしました!」というユーザーの叫び声が聞こえてきます。 一杯のコーヒーを飲んだ後、SharePointに接続しようとしていて、SharePointが本当に失敗したことに気付きます。 そして、SharePointだけでなく、サーバー全体。 RDP経由でサーバーに接続することはできず、ping要求に応答しません-これは明らかな死です。 サーバールームに急いで行くと、このダウンロードを実行するハードドライブが見つからないため、ブート画面でSharePointサーバーがフリーズしたことがわかります。 ディスクサブシステムがどのようなものであっても、単一ディスク、RAID 1、RAID 5のいずれであっても、これはすべて壊れる可能性があります。 サーバーとそのサーバー上のすべてのコンテンツが消えました。 あなたは、履歴書付きのフラッシュドライブをポケットに入れる以外は何をしますか?!
SharePointサーバーのみがクラッシュしたため、これは実際にはそれほど深刻なタイプの緊急事態ではありません。 SharePointサーバーはSharePointシステムの重要な部分ですが、SQL Serverも同様に重要なので、SQL Serverを活用して状況をすばやく修正できます。 新しいサーバーの助けを借りて、または既存のサーバーで壊れたものを修復して、サーバーを動作させる必要があります。その後、Windowsを再インストールしてすべての更新をダウンロードし、ドメインを構成して参加します。 次に、SharePointを再インストールする必要があります。 すべての前提条件が満たされ、SharePointファイルがインストールされたら、SharePoint製品構成ウィザードを実行する必要があります。
これが「魔法」が起こる場所です。 新しいSharePointファームを構築する代わりに、既存のファームに単純に接続できます。 接続するファームを尋ねられたら、既存のSQL Serverシステムと、このシステムに含まれるSharePoint構成データベースを指定します。 ファームの構成データベースの情報を活用して、新しく構築されたSharePointサーバーは既存のWebアプリケーションにアクセスし、ほぼすぐにサービスを開始できます。 SharePointは、計画されたタスクを使用して、コンテンツの提供に必要な環境を作成します。 Webアプリケーションは、これらのスケジュールされたタスクを使用してMicrosoft IISで作成されます。 ファームにインストールされたソリューションは、これらのタスクを使用して新しいサーバーにインストールされます。 構成パラメーターが設定されている場合、いくつかの小さなことをクリーンアップする必要があるかもしれませんが、これらのタスクは、完全なクラッシュ後のサーバーの回復と比較して何もありません。
安ighのため息をつきました。これが問題の解決策だと思いましたが、私のケースは単純ではなく、「魔法」は起こらず、既存のSQLサーバーに接続して構成データベースをプルアップできませんでした。 SharePointインポートウィザードは、構成データベースが無効であり、何もできないことをあらゆる点で保証しました。 また、SharePointにその反対を納得させることもできませんでした(後で判明したように、このSharePointサーバーはSharePointバージョン2007から移行することで取得され、それでも「タンバリンと踊る」ことなしにはできません)。
この時点で、SharePointの「復活」が遅れており、トーチとフォークを持つユーザーがすでに進行中であることが明らかになりました。
SharePointデータのディザスターリカバリーのさまざまなリクエストでGoogleを30分間苦しめ
た結果、ブログ「マイクスミスの技術トレーニングノート」でマイクスミスの記事
「SharePoint CMPエクスポートファイルの調査」に行き
ました 。
この記事では、接続されていないSharepointデータベースからコンテンツをエクスポートするプロセス(* .cmp形式のファイルへのエクスポート)、および* .cmp形式のファイルから必要なドキュメントを抽出するプロセスについて説明します。 また、cmpファイルを自動的に解凍し、そこからドキュメントを抽出するプロジェクト用に既にコンパイルされたプログラムとソースコードが記事に添付されています。 ユーザーが必死にここで必要とするドキュメントをすぐに復元する機能は、これはすでに優れています。 だから私は、ダウンロードしたばかりのプログラムを立ち上げ、その作者に精神的に賞賛を与えると思った。 しかし、ここで、不愉快な驚きが私を待っていました-私がドキュメントを検索しようとしたとき、プログラムは存在しないメモリアドレスへのアクセスエラーで終了しました。 良いことの1つは、記事で説明されているcmpファイルからドキュメントを手動で抽出するアルゴリズムが経験的に決定されるように機能したことです。 このプロセスは、次の一連のアクションで構成されています。
- 接続されていないコンテンツベースからサイトの必要なセクションをエクスポートします(出力ファイルはcmp形式です)。
- 受信したファイルの拡張子をcmpからcabに変更し、組み込みのWindowsツールを使用してすべてのファイルを抽出します。
- manifest.xmlファイルを開き、目的のドキュメントの名前を持つ行を検索し、見つかったセクションでFileValue属性の値を見つけます
- FileValue属性の値に対応するdat-fileの名前を、目的のドキュメントに変更します。
数千のファイルを手動で抽出することはやや非生産的でした(マイクスミスのプログラムが正常に動作しなかったためにエラーを見つけて修正することも私にとって些細な作業ではないことが判明しました)。 私の場合、アクションアルゴリズムは次のとおりです。
- 接続されていないコンテンツベースからサイトの必要なセクションをエクスポートします(出力ファイルはcmp形式です)。
- 受信したファイルの拡張子をcmpからcabに変更し、組み込みのWindowsツールを使用してすべてのファイルを抽出します。
- manifest.xmlを除くすべてのxmlファイルを削除します。
- 解凍されたファイルがあるディレクトリにプログラムをコピーして実行し、すべてのファイルが処理されるまで待ちます。
プログラムは、次のアルゴリズムに従って動作します。
- manifest.xmlが読み取られ、現在のディレクトリの各datファイルについて、manifest.xmlで対応するドキュメント名が検索されます。Datファイルは元のドキュメント名でコピーされ、datファイルは削除されます。
プログラムのソースコード:
using System; using System.Windows.Forms; using System.IO; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace SertConsole { class Program { static void Main(string[] args) { try { //=========================================================== if (File.Exists("Manifest.xml")) { Console.WriteLine(" Manifest.xml "); //=========================================================== string ManifestXML = System.IO.File.ReadAllText(@"Manifest.xml"); Console.WriteLine(" Manifest.xml "); //=========================================================== DirectoryInfo dir = new DirectoryInfo(Directory.GetCurrentDirectory() + "\\"); FileInfo[] DatFiles = dir.GetFiles("*.dat"); Console.WriteLine(" dat : " + DatFiles.Length); //=========================================================== for (int i = 0; i < DatFiles.Length; i++) { if (File.Exists(GetNameFromDat(ManifestXML, DatFiles[i].Name))) { File.Move(DatFiles[i].Name, GetFreeName(GetNameFromDat(ManifestXML, DatFiles[i].Name))); } else { File.Move(DatFiles[i].Name, GetNameFromDat(ManifestXML, DatFiles[i].Name)); } File.Delete(DatFiles[i].Name); Console.WriteLine(": " + DatFiles[i].Name + " -> " + GetNameFromDat(ManifestXML, DatFiles[i].Name)); } Console.WriteLine(" , ..."); Console.ReadLine(); } } catch (Exception ex) { MessageBox.Show(" :" + "\r\n\r\n" + ex.ToString(), " ", MessageBoxButtons.OK,MessageBoxIcon.Error); } } //
もちろん、プログラムは原始的であり、プログラマーから多くの苦情を引き起こす可能性がありますが、操作はルーチンタスクを自動化するというタスクに対処します。 この記事に記載されている情報が役に立たず、読者を見つけることを願っています。 コンパイルされたプログラムおよびプロジェクトファイル(Visual Studio Express 2013 for Desktopで使用)へのリンクが添付されています。
コンパイルされたプログラム。
VisualStudio 2013プロジェクト。