服务器和数据库情况:服务器ABCD,出错数据库Archive1位于C,一个数据库仅有一个归档账号
情况说明:本文章仅记录解决过程,各种问题的原因不一样,解决方法也不一样,本记录仅供参考,涉及数据的行为请谨慎操作!!!!!
该数据库的情况一开始让我摸不着头脑,大概的现象有:
使用Search-Mailbox搜索邮件时无法打开邮箱、
网页版Outlook登录归档邮箱账号提示被隔离(Quarantined)
ECP查看数据库已装入,但索引显示失败,使用Get-MailboxStatistic提示未装入或不可用。
删除隔离注册表项,过一段时间该项又重新出现
事件查看器有一些542报错,提示"RepairedPage”的逻辑损坏。
解决过程记录:
1.尝试Search-Mailbox取邮件
在服务器D尝试取邮件报错
在服务器C(数据库位于的服务器)尝试取邮件也报错
[PS] E:\Mailbox DataBase\Archive1>search-mailbox -Identity “数据库Archive1”……
警告: 如果指定搜索查询,……
无法打开邮箱 /o=First Organization/ou=Exchange Administrative Group (FYDIBOHF23SPDLT)/cn=Configuration/cn=Servers/cn=服务器C/cn=Microsoft System Attendant。
+ CategoryInfo : ReadError: (0:Int32) [Search-Mailbox], StorageTransientException
+ FullyQualifiedErrorId :[Server=服务器C,RequestId=824d*****,TimeStamp=2024/8/30 8:15:18] [FailureCategory=Cmdlet-StorageTransientException] 66D722EF,Microsoft.Exchange.Management.Tasks.SearchMailbox
+ PSComputerName : 服务器C
2.初步检查数据库状态
(1)Get-Mailbox、Get-MailBoxDatabase、Get-MailboxDatabaseCopyStatus查询状态正常
(2)Get-MailboxStatistics Archive1
服务器“C”上的被访问数据库“Archive1”未装入或不可用。
+ CategoryInfo : ResourceUnavailable: (Archive1:MailboxDatabase) [Get-MailboxStatistics], DatabaseUnavailableException
+ FullyQualifiedErrorId : [Server=服务器C,RequestId=8dc4……,TimeStamp=2024/8/30 8:21:08] [FailureCategory=Cmdlet-DatabaseUnavailableException] FBE0DFB1,Microsoft.Exchange.Management.MapiTasks.GetMailboxStatistics
+ PSComputerName : 服务器C
提示的是未装入或不可用。
(3)进入Exchange的网页版,登录该数据库中唯一一个归档邮箱账号,报错:
X-ClientId: C745……
request-id 3f32……
X-OWA-Error Microsoft.Exchange.Data.Storage.StorageTransientException
X-OWA-Version 15.1.……
X-FEServer 服务器B
X-BEServer 服务器C
Date:2024/8/30 8:23:28
InnerException: Microsoft.Mapi.MapiExceptionMailboxQuarantined
可以看到报的是隔离错误
(4)Test-MAPIConnectivity Archive1
MailboxServer Database Result Error
------------- -------- ------ -----
服务器C Archive1 *故障* 数据库已卸除。
[PS] E:\Mailbox DataBase\Archive1>Mount-Database Archive1
[PS] E:\Mailbox DataBase\Archive1>Test-MAPIConnectivity Archive1
MailboxServer Database Result Error
------------- -------- ------ -----
服务器C Archive1*故障* 数据库已卸除。
挂载不上,但是在ECP查看,数据库是已挂载的,但是索引为失败状态
(5)先取消挂载,然后进入到数据库目录里,使用eseutil查看数据文件状态
[PS] E:\Mailbox DataBase\Archive1>Dismount-Database Archive1
确认
是否确实要执行此操作?
正在卸除数据库"Archive1"。这可能会降低数据库中邮箱的可用性。
[Y] 是(Y) [A] 全是(A) [N] 否(N) [L] 全否(L) [?] 帮助 (默认值为“Y”): A
[PS] E:\Mailbox DataBase\Archive1>eseutil /mh .\Archive1.edb
Extensible Storage Engine Utilities for Microsoft(R) Exchange Server
……
State: Clean Shutdown
……
无脏数据,如果这里显示为Dirty,那么就是有数据尚未写入。
(6#)如果为Dirty的情况,需要进行软修复,注意,不建议非技术人员进行该操作:
- Dismount-database,取消挂载该数据库
- Win+R运行Services.msc,暂时停止Microsoft Exchange Information Store服务,改自动启动为手动启动。
- Cd进入到数据库目录,dir查看文件夹内容,一般会存在E0开头的log类型文件,假设为E04开头
- 执行eseutil /r E04 /l “E:\Mailbox DataBase\Archive1” /d “E:\Mailbox DataBase\Archive1”
参数详细解释:
/r E00:指定恢复操作,并且 E00 是数据库的日志文件前缀(根据数据库的实际日志文件前缀调整,例如 E01,E02 等)。
/l:这里的 /l 是小写的字母 "L",表示 事务日志文件的路径,例如 D:\ExchangeLogs 是存放 Exchange 数据库日志文件的目录。
/d:表示数据库文件的路径,例如 D:\ExchangeDatabases 是存放.edb 数据库文件的目录。
等待软修复完成,然后重新挂载,启动服务,此时查询状态应为Clean Shutdown
3.主要排查方向是数据库隔离
(1)检查是否是被隔离了
Get-MailboxStatistics -Database Archive1(数据库名) | Where-Object {$_IsQuarantined -eq $true}
可以查到确实被隔离了
查询数据库的GUID,找到出问题的数据库:
Get-MailboxDatabase | Select-Object Name, Guid
查询这个数据库的归档邮箱的GUID:
Get-Mailbox -Identity “Archive1@test.local” | Select-Object Guid
(2)进入到数据库所在的服务器C,regedit进入注册表路径:
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\MSExchangeIS\服务器C\Private-数据库Archive1的GUID\QuarantinedMailboxes
在QuarantinedMailboxes下,如果有一个注册表项名称是归档邮箱的GUID,那么说明确实被隔离了
Services.msc停止Microsoft Exchange Information Store服务
(3)删除注册表
删除”HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\MSExchangeIS\服务器C\Private-数据库Archive1的GUID\QuarantinedMailboxes\隔离邮箱GUID”这个注册表项
(4)查询Exchange的安装目录
进入HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\ExchangeServer\v15\Setup,各版本可能不一样,以此类推。查看MsiInstallPath的值,我的是C:\Program Files\Microsoft\Exchange Server\V15
那么就需要进入到C:\Program Files\Microsoft\Exchange Server\V15\Mailbox\Archive1\MailboxQuarantine,如果有隔离邮箱GUID的相关文件,进行备份后删除。如果没有,则忽略该步。
(5)Services.msc启动Microsoft Exchange Information Store服务
(6)此时再对该数据库的状态进行查询,测试访问等。一般情况下,这个时候是能够挂在并访问了的,但是我的数据库仍未恢复正常,只要重启了MSIS服务之后,过一段时间,注册表中隔离邮件的GUID项还是会出现,访问也不成功
4.考虑是数据库有损坏,进行修复
我先是使用了eseutil /r进行了软修复,但是仍然无效,因此计划进行硬修复。
注意,硬修复有可能会导致数据库损坏,因此一定要先备份再进行修复
(1)停止服务
我本次的经验,是需要先停止下列服务
存储
复制
搜索
邮箱助理
search host controller
具体各服务器情况不一样,建议先进入任务管理器 - 资源监视器 - CPU - 关联的句柄,通过停止进程的相关服务来确保已经对数据库没有进行任何读写操作了。
比如我遇到的就还有一个备份软件正在读写,因此还要暂停该备份服务。
(2)修改文件夹名称,确保无读写
进入到数据库所在盘符,进入MailBox Database,然后尝试将Archive1文件夹修改名称为Archive1.bak,如果能修改成功,说明可以进行下一步备份操作了。
(3)准备另一新盘
复制粘贴整个Mailbox Database文件夹过去,接下来我称这个复制得到的数据库为新数据库。
(4)验证数据库文件完整性
对数据库目录里的数据文件完整性进行校验,一般是类型为edb并且文件最大的那个文件
分别对源数据库和新数据库的这个文件进行哈希校验。
可以通过powershell命令的Get-FileHash ./Archive1.edb来获取文件的哈希值,我这里获取到的哈希值是SHA256类型的,确保两边的哈希值一致即可进行修复操作。
(5)修改盘符
先将源数据库的盘符修改为X,然后再把新数据库盘符修改成E(源数据库原来的盘符),然后就可以对新数据库进行修复操作了(不对源数据库操作,相当于只是把它移动到了一边,放起来)
(6)硬修复,此操作可能会导致数据丢失或损坏
如果之前已经执行过软修复了不起效果,可以先将文件夹内的下列文件移动走:
.single结尾的文件夹,一般为索引文件
IgnoredLogs文件夹、incseedInspect文件夹、inspector文件夹
.chk类型的文件
.log类型的文件
.jrs类型的文件
移动走之后,先Exchange Management Shell里cd进入到新数据库Archive1文件夹中,再使用eseutil /p ./Archive1.edb,就会开始硬修复
(7)修复完成
我在此步完成了修复,重启服务、Mount-Database后,查询数据库状态已正常,已经能登录网页版的邮箱账号,也能使用Search-Mailbox等命令。不过由于之前为了排除影响因素,把.single文件夹移动走了,因此索引要等系统重新创建。
使用Get-MailboxDatabaseCopyStatus命令可以查询数据库状态,如果Status是Crawling的话,说明仍在索引中,这个时候如果进行邮件搜索,那么搜索的结果可能会是不全的,要等待状态变为Healthy
5.从数据库中恢复邮件
(1)直接登录网页控制台
由于我的数据库Archive1只有一个归档邮箱账号Archive1@test.local,那么直接登这个账号就可以看到数据库中的所有归档邮件,但是那个数据库是1TB左右,得用命令查。
(2)Search-Mailbox
Exchange Management Shell里,使用这条命令:
search-mailbox -Identity "Archive1(数据库名)" -SearchQuery 'From:"发件人地址a" AND To:"收件人地址b" AND HasAttachment:True' -TargetMailbox "archiverestore01@test.local" -TargetFolder "Archive1恢复"
其中SearchQuery是查询邮件的条件,这里是搜索发件人地址为a,收件人地址为b,并且邮件中带有附件的邮件。TargetMailbox是恢复的目标邮箱地址,如果搜索到了邮件,就会恢复到archiverestore01@test.local邮箱的“Archive1恢复”文件夹(若无会自动创建)。
推荐这个archiverestore01账号是新创建的,方便后面导出邮件。
(3)New-MailboxSearch
Search-Mailbox有结果数量限制,使用New-MailboxSearch可以返回一万个以上的结果,用法类似于Search-Mailbox,可以百度查查看。
(4)New-MailboxExportRequest
这条命令可以导出邮箱PST文件,举例如下
New-MailboxExportRequest -Mailbox "archiverestore01@test.local" -FilePath "\\服务器C\\SearchResults\ResearchResults.pst"
导出的FilePath路径,需要是一个共享文件夹路径,不能是本地路径,这条命令会把archiverestore01的邮箱导出成一个PST文件,方便在别处导入。
6. 后记
在事件查看器中,仍然可以看到40025报错,大意是数据库出现了问题,需要尽快逃离。这个找一个时间,新建一个数据库,然后把那个数据库内的邮箱迁移走就可以了,在ECP有图形化界面可以直接操作,也可以使用命令行来操作。