Exchange Server’da Sorun Giderme: Yaygın Hatalar ve Çözümleri
Yıllar önce bir Cuma akşamı saat 18:30’da telefonum çaldı. Müşterinin Exchange ortamında tüm kullanıcılar mail gönderip alamaz hale gelmişti. Hafta sonu tatile çıkmak üzereydim. O gece yaşadıklarım Exchange sorun giderme konusunda bana onlarca saatlik eğitimden daha fazlasını öğretti. Bu yazıda o tür kriz anlarında işe yarayan, sahadan gelen gerçek çözümleri paylaşacağım.
Exchange Servislerini Hızlıca Kontrol Etme
İlk yapmanız gereken şey Exchange servislerinin durumunu kontrol etmek. Bunu GUI’dan yapmak zaman kaybı, PowerShell ile gidin:
Get-Service | Where-Object {$_.DisplayName -like "*Exchange*"} | Select-Object Name, Status, StartType
Çıktıda “Stopped” gören servisler varsa hemen not alın. Özellikle şu servislere dikkat edin:
- MSExchangeTransport: Bu durunca mail akışı tamamen kesilir
- MSExchangeIS: Information Store, bu olmadan posta kutuları erişilemez hale gelir
- MSExchangeFrontEndTransport: Client Access tarafı, OWA ve ActiveSync burada
- W3SVC: IIS servisi, bu olmadan hiçbir web tabanlı Exchange bileşeni çalışmaz
- MSExchangeADTopology: Active Directory bağlantısı için kritik
Servisleri toplu başlatmak için:
Get-Service | Where-Object {$_.DisplayName -like "*Exchange*" -and $_.Status -eq "Stopped"} | Start-Service
Ama dikkat edin, her durduğu görülen servisi körü körüne başlatmak sorunun üstünü örtmek olabilir. Neden durduğunu anlamak için Event Log’a bakın.
Mail Akışı Sorunlarını Tespit Etme
Mail gidip gelmiyor ama servisler ayakta görünüyor. Bu klasik bir senaryo. Önce mail queue durumuna bakın:
Get-Queue | Format-Table Identity, Status, MessageCount, NextHopDomain -AutoSize
Eğer burada binlerce mesaj birikmiş kuyruk görüyorsanız ve status “Retry” ise, downstream sunucuyla bağlantı problemi var demektir. “Suspended” görüyorsanız birileri kuyruğu manuel olarak durdurmuş olabilir.
Kuyruktaki mesajlara bakın:
Get-Message -Queue "SUNUCUADISubmission" | Select-Object FromAddress, Subject, Status, LastError | Format-List
LastError alanı genellikle sizi doğrudan sorunun kaynağına götürür. “451 4.4.0 DNS query failed” görüyorsanız DNS sorunu var. “421 4.2.1 Unable to connect” görüyorsanız hedef sunucuya erişim yok.
DNS testini şöyle yapabilirsiniz:
Resolve-DnsName -Name "mail.hedefalan.com" -Type MX
Test-NetConnection -ComputerName "hedefip" -Port 25
Database Bağlantı Sorunları ve Çözümleri
Kullanıcılar Outlook’u açıyor ama “Sunucuya bağlanılamıyor” diyor. Ya da OWA açılıyor ama giriş yapılamıyor. Bu durumda database mount durumuna bakın:
Get-MailboxDatabase -Status | Select-Object Name, Mounted, Server
“Mounted: False” gören database varsa bu ciddi bir durum. Önce neden unmount olduğunu anlayın:
Get-MailboxDatabase "DB_ADI" -Status | Select-Object *
Sonra mount etmeyi deneyin:
Mount-Database "DB_ADI"
Eğer hata verirse ve “dirty shutdown” durumundaysa, Exchange database’i tutarsız bir şekilde kapanmış demektir. Bu noktada ESEUtil devreye girer:
eseutil /mh "C:Program FilesMicrosoftExchange ServerV15MailboxDB_ADIDB_ADI.edb"
Çıktıda “State: Dirty Shutdown” yazıyorsa soft recovery deneyin:
eseutil /r E0n /l "C:Program FilesMicrosoftExchange ServerV15MailboxDB_ADI" /d "C:Program FilesMicrosoftExchange ServerV15MailboxDB_ADI"
Buradaki “E0n” log prefix’ini database özelliklerinden ya da ESEUtil /mh çıktısından öğrenebilirsiniz. E00, E01, E02 gibi değerler olabilir.
Eğer bu da çözümlemediyse hard recovery gerekebilir ki bu veri kaybı riski taşır, mutlaka backup kontrolü yapın.
OWA ve ActiveSync Erişim Sorunları
“OWA açılmıyor” şikayeti Exchange yöneticilerinin en sık duyduğu şeylerden. Çoğu zaman IIS ve sanal dizin konfigürasyonuyla ilgili.
Önce sanal dizinleri kontrol edin:
Get-OwaVirtualDirectory | Select-Object Name, Server, InternalUrl, ExternalUrl
Get-EcpVirtualDirectory | Select-Object Name, Server, InternalUrl, ExternalUrl
Get-ActiveSyncVirtualDirectory | Select-Object Name, Server, InternalUrl, ExternalUrl
URL’ler boş görünüyorsa ya da yanlış hostname içeriyorsa sorun buradan kaynaklanıyor olabilir. Düzeltmek için:
Set-OwaVirtualDirectory "OWA (Default Web Site)" -InternalUrl "https://mail.sirket.com/owa" -ExternalUrl "https://mail.sirket.com/owa"
Değişikliklerin etkin olması için IIS’i yeniden başlatın:
iisreset /noforce
SSL sertifika sorunları da OWA’yı çökertebilir. Sertifika durumunu kontrol edin:
Get-ExchangeCertificate | Select-Object Thumbprint, Subject, NotAfter, Services, Status
“Status: Invalid” ya da tarihi geçmiş sertifika görüyorsanız hemen yenilemeniz gerekiyor. Ayrıca sertifikanın Exchange servislerine atanıp atanmadığını kontrol edin:
Get-ExchangeCertificate | Where-Object {$_.Services -ne "None"} | Format-List Thumbprint, Subject, Services
Autodiscover Konfigürasyon Sorunları
Outlook otomatik yapılandırma yapamıyor, kullanıcılar sürekli şifre soruyor ya da profil bozuk görünüyorsa Autodiscover’a bakın. Bu servisi test etmek için:
Test-OutlookWebServices -Identity [email protected] -MailboxCredential (Get-Credential)
Ya da dışarıdan test etmek için şu komutu kullanın:
Test-OutlookConnectivity -ProbeIdentity OutlookSelfTestProbe
Autodiscover SCP (Service Connection Point) kayıtlarını kontrol edin:
Get-ClientAccessService | Select-Object Name, AutoDiscoverServiceInternalUri
Bu URI’nin doğru olduğundan ve DNS’te çözümlenebildiğinden emin olun. Dışarıdan erişim için ise DNS’te autodiscover.sirket.com’un doğru IP’ye işaret ettiğini doğrulayın.
Transport Kuralları ve Spam Filtresi Kaynaklı Sorunlar
Bazen mail akışı problemi transport kurallarından kaynaklanır. Özellikle güvenlik ekibinin eklediği kurallar farkında olmadan tüm mail akışını etkileyebilir.
Get-TransportRule | Select-Object Name, Priority, State, Description | Format-List
Şüpheli görünen ya da yakın zamanda değiştirilen kuralları devre dışı bırakarak test yapabilirsiniz:
Disable-TransportRule "Kural_ADI"
Content Filter ve Anti-spam ayarlarını kontrol edin:
Get-ContentFilterConfig | Select-Object Enabled, SCLDeleteThreshold, SCLRejectThreshold, SCLJunkThreshold
Get-SenderFilterConfig | Select-Object Enabled, BlockedSenders
Eğer SCLDeleteThreshold çok düşük ayarlanmışsa meşru mailler de silinebilir. Örneğin bu değer 1 olarak ayarlanmışsa neredeyse her mail silinecektir.
Message Tracking ile Sorun Kökünü Bulma
En güçlü araçlardan biri message tracking. “Mail göndermedim” ya da “Mail almadım” denildiğinde önce tracking log’a bakın:
Get-MessageTrackingLog -Sender "[email protected]" -Start (Get-Date).AddHours(-24) -EventId SEND | Select-Object Timestamp, EventId, Source, Sender, Recipients, MessageSubject
Alıcı tarafından aramak için:
Get-MessageTrackingLog -Recipients "[email protected]" -Start (Get-Date).AddHours(-24) | Select-Object Timestamp, EventId, Source, Sender, Recipients, MessageSubject | Sort-Object Timestamp
EventId değerlerini anlamak önemli:
- RECEIVE: Mesaj alındı
- SEND: Mesaj gönderildi
- DELIVER: Posta kutusuna teslim edildi
- FAIL: Gönderim başarısız
- REDIRECT: Başka hedefe yönlendirildi
- RESOLVE: Alıcı adresi çözümlendi
- EXPAND: Dağıtım listesi genişletildi
Eğer RECEIVE var ama DELIVER yoksa mesaj bir noktada takılmış demektir.
Disk Doluluğu ve Log Dosyası Yönetimi
Exchange’in en sinsi düşmanı dolan diskler. Transaction log dosyaları birikmeye başladığında hem performans düşer hem de database mount olmayabilir.
Disk kullanımına bakın:
Get-MailboxDatabase -Status | Select-Object Name, DatabaseSize, AvailableNewMailboxSpace
Transaction logların birikip birikmediğini kontrol edin:
$logpath = "C:Program FilesMicrosoftExchange ServerV15MailboxDB_ADILogs"
(Get-ChildItem $logpath -Filter "*.log" | Measure-Object -Property Length -Sum).Sum / 1GB
DAG (Database Availability Group) ortamında circular logging kapalıysa loglar backup yapılana kadar silinmez. Düzenli backup alındıktan sonra loglar temizlenir. Backup alınamıyorsa circular logging açabilirsiniz ama bu production ortamda önerilmez.
Eğer anlık müdahale gerekiyorsa ve disk kritik seviyeye geldiyse, Exchange Management Shell üzerinden şunu çalıştırın:
Get-MailboxDatabase | Select-Object Name, Server, LogFolderPath, EdbFilePath
Hangi path’lerin dolduğunu tespit edip ilgili volume’ü genişletin ya da eski arşiv logları temizleyin. Ama log silme işlemini yaparken son derece dikkatli olun, aktif log sırası üzerindeki logları silmek database’i bozar.
Permission ve Delegate Sorunları
Kullanıcılar başkasının posta kutusuna erişemiyor ya da delegate olarak mail gönderemiyorsa önce permission’ları kontrol edin:
Get-MailboxPermission -Identity "hedef_kullanici" | Where-Object {$_.User -notlike "NT AUTHORITY*" -and $_.User -notlike "S-1-*"} | Select-Object Identity, User, AccessRights
“Send As” yetkisi için:
Get-RecipientPermission -Identity "hedef_kullanici" | Select-Object Identity, Trustee, AccessRights
“Send on Behalf” yetkisi için:
Get-Mailbox "hedef_kullanici" | Select-Object -ExpandProperty GrantSendOnBehalfTo
Eksik yetki eklemek için:
Add-MailboxPermission -Identity "hedef_kullanici" -User "yetkili_kullanici" -AccessRights FullAccess -InheritanceType All
Add-RecipientPermission -Identity "hedef_kullanici" -Trustee "yetkili_kullanici" -AccessRights SendAs
Event Log Okumayı Alışkanlık Haline Getirin
Tüm bu komutlardan önce aslında yapmanız gereken en temel şey Event Log kontrolü. Application ve System log’larında Exchange ile ilgili hataları filtreleyin:
Get-EventLog -LogName Application -Source "*Exchange*" -EntryType Error,Warning -Newest 50 | Select-Object TimeGenerated, EventID, Source, Message | Format-List
MSExchange ile başlayan kaynak adlarına dikkat edin. Event ID’leri Microsoft’un Exchange ekibi çok iyi belgelemiştir, bir Event ID ile arama yapıldığında genellikle doğrudan çözüme ulaşılır.
Kritik Event ID’lerden bazıları:
- 1000-1002: Application crash, ciddi servis sorunları
- 9519, 9518: Mailbox database ile ilgili kritik hatalar
- 4999: Watson raporu, genellikle Exchange crash öncesinde görülür
- 2080: Back pressure mekanizması devrede, disk ya da bellek baskısı var
Back pressure durumunda Exchange mail kabul etmeyi durdurabilir. Bunu kontrol edin:
Get-ExchangeDiagnosticInfo -Server SUNUCUADI -Process EdgeTransport -Component ResourceThrottling | Select-Object -ExpandProperty Result
Yaygın Hata Mesajları ve Anlamları
Sahada en sık karşılaşılan hata mesajları ve ne yapmanız gerektiği:
“550 5.7.1 Unable to relay”: Relay izni yok. Gönderen IP’yi veya hesabı Receive Connector’da yetkilendirin. Internal sunuculardan gelen mesajlarda bu hata alınıyorsa Receive Connector authentication ayarlarına bakın.
“452 4.3.1 Insufficient system resources”: Disk doldu ya da back pressure devrede. Hemen disk durumuna bakın.
“500 5.3.3 Unrecognized command”: SSL/TLS zorunlu tutulmuş bir connector’a plain text bağlantı denenmiş. Telnet ile debug yapıyorsanız bu normaldir.
“421 4.3.2 Service not available”: Transport servisi yeni başladı ya da overload altında. Birkaç dakika bekleyip tekrar deneyin, düzelmezse servis loglarına bakın.
NDR kodu 5.2.2: Alıcının posta kutusu doldu. Quota’ya bakın:
Get-Mailbox "kullanici" | Select-Object DisplayName, IssueWarningQuota, ProhibitSendQuota, ProhibitSendReceiveQuota
Get-MailboxStatistics "kullanici" | Select-Object DisplayName, TotalItemSize, DatabaseName
Proaktif Sağlık Kontrolü
Sorun çıkmadan önce ortamın sağlığını düzenli kontrol etmek en iyi savunmadır. Bunun için Exchange’in yerleşik araçlarını kullanın:
Test-ServiceHealth
Bu komut tüm Exchange servislerinin beklenen şekilde çalışıp çalışmadığını özetler. Ayrıca mail akışını end-to-end test etmek için:
Test-Mailflow -TargetMailboxServer SUNUCUADI
Ortamın genel sağlık durumu için:
Get-HealthReport -Server SUNUCUADI | Where-Object {$_.AlertValue -ne "Healthy"} | Select-Object HealthSet, AlertValue, LastTransitionTime | Format-List
Bu komut sağlıklı olmayan bileşenleri listeler. Managed Availability’nin topladığı verileri görürsünüz.
Sonuç
Exchange sorun giderme, deneyimle geliştirilen bir sezgi işidir. Komutları ezberlemekten çok, sistemin nasıl çalıştığını anlamak önemli. Mail akışının SMTP seviyesinde nasıl ilerlediğini, database motorunun nasıl çalıştığını ve IIS’in Exchange ile nasıl entegre olduğunu kavrarsanız yeni bir hatayla karşılaştığınızda bile mantıklı bir yol izleyebilirsiniz.
O Cuma akşamı yaşadığım kriz, biriken transaction logların diski doldurmasından kaynaklanıyordu. Backup job aylardır hata veriyormuş ama kimse izlemiyormuş. Disk dolunca database unmount oldu, servisler peş peşe düştü. Çözüm teknik olarak basitti, asıl sorun monitoring eksikliğiydi.
Düzenli test backupları alın, disk kullanımını izleyin, servis sağlığını günlük kontrol edin. Exchange karmaşık bir sistemdir ama sizi nadiren beklenmedik şekilde yarı yolda bırakır. Çoğu zaman uyarılar zaten oradaydı, biz bakmamıştık.
