Windows

고장난 Exchange 2013 서버의 Database 복구 및 PST로 추출 하기

미나리나물 2021. 4. 21. 15:43

먼저 복구의 전제 조건은 Exchange의 데이터베이스 파일, 즉 EDB파일이 무조건 있어야 한다. 이거 없으면 복구도 없다.
트랜잭션 로그파일도 있으면 도움이 된다. 이건 선택사항이다.
그리고 EDB파일의 최소 2.5배~3배 이상의 여유 공간이 있어야 작업이 가능하다.


아래에서 실행되는 콘솔은 일반 Powershell이 아닌 Exchange Management Shell에서 수행해야 한다


먼저 EDB 파일의 상태를 살펴보자.

eseutil /mh "db파일.edb"

[PS] D:\>eseutil /mh "D:\Old\Mailbox Database DB\Mailbox Database 0123456789.edb"

Extensible Storage Engine Utilities for Microsoft(R) Exchange Server
Version 15.00
Copyright (C) Microsoft Corporation. All Rights Reserved.

Initiating FILE DUMP mode...
         Database: Mailbox Database 0123456789.edb
         
                         ...

            State: Dirty Shutdown

                         ...

출력 결과에서 State 값을 찾아본다

State: Dirty Shutdown

정상적인 종료가 아닐 경우 Dirty Shutdown이 되면서 다른 Exchange 서버에 탑재(Mount)가 되지 않는다.
따라서 첫 번째 목표는 Dirty Shutdown을 Clean Shutdown으로 만드는 것이다.


먼저 트랜잭션 로그파일이 살아있다면 소프트 복구를 시도해 본다.

[소프트복구]
eseutil /r E00 /l "트랜잭션 로그 폴더" /d "EDB파일이 있는 폴더"

/r : Recovery 모드
E00 : 로그 파일의 접두어 (로그파일의 앞 3글자. 모든 로그파일에 공통적으로 붙어있음)
/l (소문자 L) : 트랜잭션 로그가 들어있는 폴더 지정
/d : edb 파일의 들어있는 폴더 지정
** 만약 로그와 edb가 함께 들어있다면 둘 다 같은 폴더 이름을 지정해도 상관없다.

[PS] D:\>eseutil /r E00 /l "D:\Old\Mailbox Database Log" /d "D:\Old\Mailbox Database DB"

Extensible Storage Engine Utilities for Microsoft(R) Exchange Server
Version 15.00
Copyright (C) Microsoft Corporation. All Rights Reserved.

Initiating RECOVERY mode...
    Logfile base name: E00
            Log files: D:\Old\Mailbox Database Log
         System files: 
   Database Directory: D:\Old\Mailbox Database DB

Performing soft recovery...
                      Restore Status (% complete)

          0    10   20   30   40   50   60   70   80   90  100
          |----|----|----|----|----|----|----|----|----|----|
          ...................................................

Operation completed successfully in 0.273 seconds.


복구 후 EDB 파일의 상태를 살펴보자.

eseutil /mh "db파일.edb"

[PS] D:\>eseutil /mh "D:\Old\Mailbox Database DB\Mailbox Database 0123456789.edb"

Extensible Storage Engine Utilities for Microsoft(R) Exchange Server
Version 15.00
Copyright (C) Microsoft Corporation. All Rights Reserved.

Initiating FILE DUMP mode...
         Database: Mailbox Database 0123456789.edb
         
                         ...

            State: Clean Shutdown

                         ...


위와 같이 State에 Clean Shutdown이 나온다면 다음으로 넘어가면 된다.

하지만 소프트복구를 진행해도 Dirty Shutdown 상태이거나, 소프트복구에 실패했거나,
로그파일 없이 EDB파일만 가지고 있다면 하드복구를 수행해야 한다.
이 방법은 로그파일이 없어도 Clean Shutdown으로 만들어 주지만, 데이터의 유실 위험이 있으므로 신중하게 판단하자.

[하드복구 (데이터 유실 가능성 있음)]
eseutil /p "D:\Old\Mailbox Database DB\Mailbox Database 0123456789.edb"

위 박스 내용은 "트랜잭션 로그가 없으니 정보가 손실될 수 있다. 진행할까요?"이다. OK를 눌러 진행한다.


EDB 파일 상태를 Clean Shutdown으로 변경했으면,
두 번째 목표인 EDB의 복구 데이터베이스를 만들어 새 Exchange 서버로의 탑재를 수행한다.

[복구 데이터베이스 생성]
New-MailboxDatabase -Server 서버명 -Name 생성할복구DB명 -Recovery -EdbFilePath "EDB파일 절대경로\edb파일명" -LogFolderPath "트랜잭션 로그파일저장 경로"

[PS] C:\>New-MailboxDatabase -Server NEWEXC -Name RecoveryDB -Recovery -EdbFilePath "D:\Old\Mailbox Database DB\Mailbox Database 0123456789.edb" -LogFolderPath "D:\Old\Mailbox Database DB"
WARNING: Recovery database 'RecoveryDB' was created using existing file D:\Old\Mailbox Database DB\Mailbox Database 0123456789.edb. The database must be
brought into a clean shutdown state before it can be mounted.

Name                           Server          Recovery        ReplicationType
----                           ------          --------        ---------------
RecoveryDB                     NEWEXC          True            None
WARNING: Please restart the Microsoft Exchange Information Store service on server NEWEXC after adding new mailbox
databases.


[데이터베이스 탑재]
Mount-Database 복구DB명

[PS] D:\>Mount-Database RecoveryDB


이제 탑재한 데이터베이스 내부에 사서함을 찾아본다.

Get-Get-MailboxStatistics -Database 복구DB명 | ft -auto

[PS] D:\>Get-MailboxStatistics -Database RecoveryDB | ft -auto

DisplayName                                                      ItemCount StorageLimitStatus            LastLogonTime
-----------                                                      --------- ------------------            -------------
SystemMailbox{8d453193-6067-4617-ab70-d17f2bbcfea4}              2
HealthMailbox8d45319360674617ab70d17f2bbcfea4                    406589                       2021-04-14 오전 10:58:24
HealthMailboxfe6dcec19be44f14b9b4f22c43e13dce                    1805512                      2021-04-14 오전 10:58:24
HealthMailboxd7b705f0b17746deb41c44f4a46e297b                    2                            2014-05-18 오후 11:10:47
원본 위치 보관 - HealthMailboxb8182b2d26524313a7b035feb229e654    1                            2014-05-18 오후 11:17:04
원본 위치 보관 - HealthMailbox754fefc3fc9d475288c10bf1898f33ba    1                             2021-04-14 오전 7:16:36
Administrator                                                    6160                         2020-11-27 오전 10:03:57
가렌                                                             28                           2020-10-14 오전 10:19:37
나르                                                             55471                         2021-04-13 오후 5:58:11
나서스                                                           44029                        2021-04-14 오전 10:24:49
다리우스                                                         12275                         2018-12-09 오전 6:25:51
레넥톤                                                           14514                         2020-01-15 오후 9:04:40
리신                                                             71955                        2021-03-29 오후 12:36:14
리븐                                                             43339                        2021-04-14 오전 10:50:11
문도박사                                                         19023                        2021-04-14 오전 10:52:58
바이                                                             374                           2014-08-28 오후 6:01:27
세트                                                             40702                         2021-04-14 오전 7:36:58
쉬바나                                                           13201                        2021-04-14 오전 10:48:51
야스오                                                           5779                          2021-03-25 오전 7:10:21
오공                                                             13379                         2021-04-14 오전 8:35:24
올라프                                                           3540                         2021-04-14 오전 10:37:46


복구 데이터베이스의 복구 준비가 되어있는지 확인한다.

[PS] C:\>Get-MailboxDatabase | where recovery

Name                           Server          Recovery        ReplicationType
----                           ------          --------        ---------------
RecoveryDB                     NEWEXC          True            None


이제 신규 Exchange 서버에서 사서함을 생성해 준다.

참고로 표시 이름은 복구 데이터베이스의 사서함과 헷갈리지 않기 위해서 일단 영어로 생성했다.

이제 복구 데이터베이스의 기존 사서함에서 신규 사서함으로 내용을 복구한다.
이때 두 사서함의 LegacyExchangeDN 값이 서로 다르기 때문에 -AllowAllowLegacyDNMismatch 옵션을 반드시 붙여줘야 한다.

New-MailboxRestoreRequest -SourceDatabase 복구DB명 -SourceStoreMailbox "MailboxLocationIdParameter" -TargetMailbox "MailboxLocationIdParameter" -AllowLegacyDNMismatch

MailboxLocationIdParameter 매개 변수에는 여러 가지가 들어갈 수 있다.
Name / DisplayName / Alias / GUID 등등...
여기서 우리는 가장 보기 쉬운 DisplayName(표시 이름)을 사용한다.

[PS] D:\>New-MailboxRestoreRequest -SourceDatabase RecoveryDB -SourceStoreMailbox "가렌" -TargetMailbox Garen -AllowLegacyDNMismatch

Name                                           TargetMailbox                                  Status
----                                           -------------                                  ------
MailboxRestore                                 lol.com/Users/Garen                            Queued


사서함 복원 요청 상태를 확인하려면 다음 명령어를 사용한다.

Get-MailboxRestoreRequest | Get-MailboxRestoreRequestStatistics

[PS] D:\>Get-MailboxRestoreRequest | Get-MailboxRestoreRequestStatistics

Name                                   StatusDetail              TargetAlias                           PercentComplete
----                                   ------------              -----------                           ---------------
MailboxRestore                         CopyingMessages           Garen                                 48


좀 더 정확하게 완료된 백분율 및 전송될 아이템의 총개수와 전송된 아이템의 개수를 확인하고자 할 땐 다음 명령어를 사용한다.

Get-MailboxRestoreRequest | Get-MailboxRestoreRequestStatistics | fl percentcomplete,itemstransferred,*count*

Get-MailboxRestoreRequest | Get-MailboxRestoreRequestStatistics | fl percentcomplete,itemstransferred,*count*


PercentComplete            : 50
ItemsTransferred           : 14
BadItemsEncountered        : 0
LargeItemsEncountered      : 0
EstimatedTransferItemCount : 28


복원이 완료되면 StatusDetail이 "Completed"로 변경된다.

[PS] D:\>Get-MailboxRestoreRequest | Get-MailboxRestoreRequestStatistics

Name                                   StatusDetail              TargetAlias                           PercentComplete
----                                   ------------              -----------                           ---------------
MailboxRestore                         Completed                 Garen                                 100


완료된 항목은 다음 명령어로 목록에서 삭제할 수 있다.

Get-MailboxRestoreRequest -Status Completed | Remove-MailboxRestoreRequest


만약 복원에 실패한다면 아래 명령어를 입력한다.

Get-MailboxRestoreRequest | Get-MailboxRestoreRequestStatistics | fl

출력 내용을 살펴보면 오류 내용이 나타난다.
만약 오류 내용이 대용량 항목에 관련된 오류라면 아래 명령어로 메일 한 개 항목의 최대 크기를 늘려준다.

[대용량 항목 최대 크기 늘리기 - 이 명령 후에는 exchange 서비스 재시작해야 함]
Set-TransportConfig -MaxSendSize 최대크기 -MaxReceiveSize 최대크기
Get-ReceiveConnector | Set-ReceiveConnector -MaxMessageSize 최대크기
Get-SendConnector | Set-SendConnector -MaxMessageSize 최대크기

[PS] D:\>Set-TransportConfig -MaxSendSize 1024MB -MaxReceiveSize 1024MB
[PS] D:\>Get-ReceiveConnector | Set-ReceiveConnector -MaxMessageSize 1024MB
[PS] D:\>Get-SendConnector | Set-SendConnector -MaxMessageSize 1024MB


위 명령어를 입력한 다음에는 Exchange 서비스를 재시작하거나, 서버를 재부팅 한 다음, 아래 명령어를 다시 입력해 준다.

New-MailboxRestoreRequest -SourceDatabase 복구DB명 -SourceStoreMailbox "MailboxLocationIdParameter" -TargetMailbox "MailboxLocationIdParameter" -AllowLegacyDNMismatch


이제 사서함이 복구되었다면 해당 사서함의 내용을 PST 파일로 출력해 본다.

맨 처음 할 일은 사서함의 삽입/추출에 대한 Role을 설정해 줘야 한다.

New-ManagementRoleAssignment -Role "Role이름" -User "삽입/추출을 담당할 계정명"

[PS] D:\>New-ManagementRoleAssignment -Role "Mailbox Import Export" -User "administrator"

그리고 Exchange Management Command를 다시 불러오기 위해 Exchange Management Shell 창을 닫은 뒤 다시 열어준다.

PST 파일을 받을 폴더를 만들고 해당 폴더를 네트워크 공유를 설정해 준다. PST Export는 로컬 저장소를 지원하지 않기 때문이다.

이제 아래 명령어로 PST파일을 내보내기 한다.

new-mailboxexportrequest -mailbox MailboxLocationIdParameter -filepath \\공유폴더\원하는이름.pst

[PS] D:\>new-mailboxexportrequest -mailbox Garen -filepath \\NEWEXC\pst\Garen.pst


내보내기 완료 여부는 다음 명령어로 확인할 수 있다.

Get-MailboxExportRequest -Status Completed

[PS] D:\>Get-MailboxExportRequest -Status Completed

Name                                           Mailbox                                        Status
----                                           -------                                        ------
MailboxExport                                  lol.com/Users/Garen                            Completed


완료된 항목은 다음 명령어로 삭제할 수 있다.

Get-MailboxExportRequest -Status Completed | Remove-MailboxExportRequest