スポンサードリンク

2017年11月14日

Exchange Server 2013 回復メールボックス

私の会社では、Exchange Server 2013 を使用しています。
DAGを設定して、2拠点にデータベースを置いていますので、万一の場合でも、メールデータを失う事は無いと考えていますが、一応、OSに標準装備されている、Windows Server バックアップで、バックアップは取ってあります。

このバックアップから、データを戻す事は無いと思いますが、今回、回復メールボックスの使い方を調べましたので、備忘録代わりに掲載しておきます。

手順は、以下の通りです。

(A) バックアップの edb ファイルをリストア用に準備
(B) edb ファイルから回復用データベースを作成
(C) 回復用データベース内のメールボックスから、既存のメールボックスへアイテムをリストア
(D) リストアされたアイテムの確認

(A) バックアップの edb ファイルをリストア用に準備
1.バックアップから復元したデータベース ファイル(.edb)、および トランザクション ログ ファイル、チェックポイント ファイルをメールボックス サーバー上の任意のフォルダに配置します。
Windows Server バックアップの「回復」で戻しました。

2.コマンドプロンプトを起動して、上記 1. で配置したフォルダのパスにカレント ディレクトリを移動します。

- 実行例
cd C:\Recovery\RDB01

3. データベースが Clean Shutdown の状態であるか確認します。
- 構文
Eseutil /mh <データベース ファイルのパス>

- 実行例
Eseutil /mh "C:\Recovery\RDB01\RDB01.edb"

上記コマンドの結果で、
"State: Dirty Shutdown"
の場合には、以下のコマンドによりトランザクション ログを再生します。
"State: Clean Shutdown"
である場合には、本手順は省略し、(B)に進みます。

- 構文
Eseutil /R Enn /l <トランザクション ログ ファイルの格納ディレクトリ> /d <データベース ファイルの格納ディレクトリ>
※ Enn はデータベースのログ生成プレフィックスです (E00、E01、E02 など)

- 実行例
Eseutil /R E00 /l "C:\Recovery\RDB01" /d "C:\Recovery\RDB01"

上記コマンドの実行後、Eseutil /mh コマンドにて、データベースが Clean Shutdown の状態であるか確認します。

ウチの場合、ここで手間取りました。
ファイルが使用中か、ロックされているという内容のメッセージが出て、ログ再生が出来ませんでした。
それも、コマンド実行から1時間以上もたってからエラーストップします。
DBのサイズにもよると思いますが、本来は、数秒で終了するはずです。

この症状は、サーバーを再起動しても解消しませんでした。
データベースが格納されているフォルダ名の変更はできるので、実際には他で使用されている筈はないと思われます。
フォルダ名変更直後、実行したところ、数秒で完了しました。

(B) edb ファイルから回復用データベースを作成
==============
1. Exchange 管理シェルを起動します。
2. 以下のコマンドレットを実行して、バックアップの edb ファイルから回復用データベースを作成します。
- 構文
New-MailboxDatabase -Recovery -Name <回復用データベース名> -Server <メールボックス サーバー名> -EdbFilePath <データベース ファイル配置先> -LogFolderPath <ログ ファイル作成先>

- 実行例
New-MailboxDatabase -Recovery -Name RDB01 -Server MBX01 -EdbFilePath "C:\Recovery\RDB01\RDB01.edb" -LogFolderPath "C:\Recovery\RDB01"

新規にメールボックス データベースを追加した後は、該当サーバー (上記の例では MBX01) にて、Microsoft Exchange Information Store サービスの再起動が必要です。
Microsoft Exchange Information Store サービスの再起動中は、当該メールボックス サーバーのデータベースにアクセスできない状態となります。
また、DAG 環境の場合はサービスを再起動するとフェール オーバーが発生する為、事前にデータベースのスイッチオーバーを実施するなどの対応を検討する必要があります。

3. 以下のコマンドレットを実行して、回復用データベースをマウントします。
- 構文
Mount-Database -Identity <回復用データベース名>

- 実行例
Mount-MailboxDatabase -Identity RDB01

(C) 回復用データベース内のメールボックスから、既存のメールボックスへアイテムをリストア
1. Exchange 管理シェルから以下のコマンドレットを実行して、リストア元のユーザーのメールボックスの GUID を確認します。
- 構文
Get-MailboxStatistics -Database <回復用データベース名> | Where {$_.DisplayName -eq <リストアするユーザーの表示名>} | fl DisplayName,MailboxGuid

- 実行例
Get-MailboxStatistics -Database "RDB01" | Where {$_.DisplayName -eq "user01"} | fl DisplayName,MailboxGuid

- 出力例
DisplayName : user01
MailboxGuid : 26d59c79-c694-477a-9325-e8c0e8b085e9

2. 以下のコマンドレットを実行して、リストア元のユーザーのメールボックスから、リストア先のユーザーのメールボックスにアイテムをリストアします。
- 構文
New-MailboxRestoreRequest -SourceDatabase <回復用データベース名> -SourceStoreMailbox <手順1. で確認した GUID> -TargetMailbox <復元先メールボックスのユーザー名> -AllowLegacyDNMismatch

- 実行例 ※ 以下の例では、回復用データベース内の user01 のメールボックス データを、user02 のメールボックスへ復元しています。
New-MailboxRestoreRequest -SourceDatabase "RDB01" -SourceStoreMailbox "26d59c79-c694-477a-9325-e8c0e8b085e9" -TargetMailbox "user02" -AllowLegacyDNMismatch

Get-MailboxRestoreRequest コマンドレットを使用して、メールボックス復元要求の状態を定期的に確認します。実行結果の Status が Completed で完了です。

これで、user01 のメールボックスに、user02 のメールデータがコピーされます。

完了したメールボックス復元要求は、以下のコマンドレットにて削除できます。

Get-MailboxRestoreRequest -Status Completed | Remove-MailboxRestoreRequest


D) リストアされたアイテムの確認
==============
user01 でログオンし、outlook を起動すれば、内容確認できます。
また、リストア先のメールボックスを他のユーザーが参照したい場合は、以下のコマンドレットを実行し、そのメールボックスに対するフル アクセス権を付与すれば、参照可能となります。
(これは、Exchange管理センターからでも設定可)

- 構文
Add-MailboxPermission -Identity <アクセス許可を追加するメールボックス> -User <アクセス許可を与えるメールボックス> -AccessRights <付与するアクセス許可>

- 実行例 ※ 以下の例では、user03 に user02 に対するフル アクセス権限を与えています。
Add-MailboxPermission -Identity user02 -User user03 -AccessRights FullAccess

アイテムのリストア完了後、作成した回復用データベースが不要になったら、以下のコマンドレットにて削除できます。

- 構文
Remove-MailboxDatabase <回復用データベース名>

- 実行例
Remove-MailboxDatabase "RDB01"



posted by まさ at 14:29| Comment(0) | ExchangeServer

2017年06月16日

バッチファイルで環境変数の一部を比較する その1

こんな要望が出てきました。

ログオンスクリプトで、ある処理をしたい。
しかし、コンピュータ名がSRVから始まるPCの場合は、処理しないで欲しい。

コンピュータ名は、環境変数 computername で取得できますが、頭3文字だけを判別するにはどうしたら良いのか・・・

こんなバッチで解決しました。

-------バッチの中身-------
:コンピュータ名がSRVから始まる場合はインストールしない
if %computername:~0,3%==SRV goto end

必要な処理を列記

:end
---------------------------

 %computername:~0,3%
この書き方で、conputernameの先頭から3文字が取り出せます。


posted by まさ at 14:11| Comment(0) | その他

バッチファイルでの繰り返し処理

例1
aaa.txt に書かれた内容をechoコマンドで表示する
aaa.txtの内容
----
AAA
BBB
CCC
---

バッチファイル(test.bat)の中身
----
ecoh off
for /F %%A in (aaa.txt) do echo %%A
----

これで、testを実行すると、aaa.txt の内容が画面に表示される。


例2
C:\data\pclist.txt に記入されたPCを再起動したい。
pclist.txtの中身は、
---
PC-001
PC-002
PC-003
---

バッチファイルの中身は、下でOK。
これで、pclist.txt に列挙されたPCが、再起動する。
---
for /F %%A in (c:\data\pclist.txt) do shutdown -r -m \\%%A -t 0
---

1台シャットダウンしたら、次に行く前に5秒待つならバッチの中身はこうなる。

-----
for /F %%A in (c:\data\pclist.txt) do (
shutdown -r -m \\%%A -t 0
timeout /t 5
)
-----
posted by まさ at 13:43| Comment(0) | その他
システム管理者日記」の先頭へ