sestdiena, 2011. gada 26. februāris

DB Mail problēmu risināšana

Lai arī vienkārši uzstādāms un samērā vienkārši nokonfigurējams lietošanai, tomēr ne vienmēr viss notiek tik gludi kā gribētos. DB Mail nokonfigurēju uz diviem datoriem. Vienai instancei viss bija lieliski, savukārt ar otru sanāca noņemties. Šeit drīzāk nevis risinājumi, bet vietas, kur meklēt risinājumus.

Tas priekšstats, kas man radās ir tāds, ka ja DatabaseMail90.exe sanāk veiksmīga komunikācija ar SMTP serveri, tad visdrīzāk problēmu nebūs. Tomēr ja kaut kas nav kārtībā, tad var sanākt pamatīga ņemšanās.

Kā noteikt problēmu?

Nomālā gadījumā ieteiktu iet uz MSDN lapu un skatīties tad individuāli kur problēma. Starta punkts:
Troubleshooting Database Mail.

Varētu noderēt arī skati. 

1. Pārliecinaties, ka SQL Server instance ir nokonfigurēta, lai varētu izmantot DB Mail
sp_configure 'Database Mail XPs'
atgrieztajos rezultātos "run_value" jābūt ar vērtību "1". Gadījumā, ja šis skripts atgriež kļūdu (kas nav ar tiesībām saistīta), tad pirms komandas izpildes jāizpilda šāds skripts:
sp_configure 'show advanced', 1
reconfigure
Ja vērtība tomēr nav "1", tad skatīt rakstu Kā atļaut DB Mail uz SQL Server instances

2. Pārliecinaties, ka Service Broker ir ieslēgts msdb datu bāzei
SELECT is_broker_enabled FROM sys.databases WHERE name = 'msdb';
Vērtībai jābūt "1", ja nav, skatīt rakstu (pēc noklusējuma Service Broker ir atļauts datu bāzēs).

3. Kāds ir e-pastu statuss un kas ir reģistrēts logā?
SELECT * FROM msdb.dbo.sysmail_allitems
SELECT * FROM msdb.dbo.sysmail_event_log
Logā varētu būt reģistrēts kļūdas ziņojums. Var nomainīt DB Mail konfigurāciju, lai tiktu reģistrēti arī veiksmīgi notikumi (skatīt rakstu Konta un profila izveide e-pastu sūtīšanai (DB Mail), kur notiek DB Mail konfigurācija).

4. Kas notiek ar lietotāju tiesībām? (šo gan parasti ļoti ātri sanāk atklāt)
EXEC msdb.sys.sp_helprolemember 'DatabaseMailUserRole';
EXEC msdb.dbo.sysmail_help_principalprofile_sp;
5. Cik e-pasti gaida rindā un kāds ir servisa stāvoklis?
EXEC msdb.dbo.sysmail_help_queue_sp
EXEC msdb.dbo.sysmail_help_status_sp
Varbūt servisa pārstartēšana atrisinās problēmu (un pat ja atrisina, tās ir tikai sekas, nevis cēlonis):
EXEC msdb.dbo.sysmail_stop_sp
EXEC msdb.dbo.sysmail_start_sp
6. Kas notiek ar Service Broker rindām?
select count(*) from msdb.dbo.InternalMailQueue
select count(*) from msdb.dbo.ExternalMailQueue
select count(*) from msdb.sys.transmission_queue
select distinct transmission_status from msdb.sys.transmission_queue

select sq.name,qm.* from sys.dm_broker_queue_monitors qm
join msdb.sys.service_queues sq on qm.queue_id = sq.object_id
where database_id = db_id('msdb')
7. Vai piekļuve SMTP serverim nav bloķēta dēļ uguns sienas?
raksts par tēmu šeit.

8. Vai jūs dzēšat laiku pa laikam laukā vecos e-pastus?
Nezinu vai šī ir pareizā vieta, kur to ielikt. Bet nu pieminēt ir svarīgi- visi nosūtītie e-pasti un to pielikumi nekur nepazūd- tie visi tiek uzglabāti msdb datu bāzē! Tādēļ to būtu jāņem vērā un droši vien pavisam laba doma ir laiku pa laikam izmest vecos e-pastus un notikumu reģistru. Šeit skripts kā to paveikt:
-- UZMANĪBU!!! Dzēš visus e-pastus! Izpildīt tikai tad, ja tas tiešām vajadzīgs
EXECUTE msdb.dbo.sysmail_delete_mailitems_sp @sent_before = '2011-02-26'
EXECUTE msdb.dbo.sysmail_delete_log_sp @logged_before = '2011-02-26'
un protams- MSDN raksts par tēmu.

Kas vēl?
Manā gadījumā neviens no iepriekšējajiem punktiem īsti nedeva priekšstatu par to, kur tad ir problēma.. Situācija bija tāda, ka e-pasti tiek salikti rindā. Pēc visa spriežot ārējajam failam tos vajadzētu no rindas nolasīt un nosūtīt. Tomēr process ieilga bezgalīgi un pilnīgi nekādas ziņas par iemesliem, kāpēc tas ir apstājies..
Varētu uzskatīt, ka norāde uz risinājumu bija atrodama šajā rakstā: "The external program runs in the security context of the service account for SQL Server". Mans secinājums ir tāds, ka DatabaseMail90.exe trūka kādu tiesību, lai sazinātos ar SMTP serveri.

Tas, kā atrisināju problemu-SQL Server Configuration Manager, SQL Server (attiecīgās instances) servisam nomainīju lietotāja kontekstu, kādā serviss strādā. Bija "Network Service", uzliku "Local System" un pārstartēju servisu.
Pēc šīm izmaiņām e-pasti sāka sūtīties vienkārši lieliski.
Par šo tēmu plašāk var palasīt:
Setting Up Windows Service Accounts
Service Account

Nav komentāru:

Ierakstīt komentāru