Database Mail etiketine sahip kayıtlar gösteriliyor. Tüm kayıtları göster
Database Mail etiketine sahip kayıtlar gösteriliyor. Tüm kayıtları göster

15 Şubat 2017 Çarşamba

SQL Server 2016'da Database Mail ve .Net 3.5

Firma ziyaretlerimde sık karşılaştığım sorulardan biri şu:

"Ekrem, sen birçok firmaya girip çıkıyorsun, birçok ortam görüyorsun, şu anda sektörde en çok kullanılan SQL Server versiyonu nedir?"

Bu sorunun cevabı an itibariyle şu: "SQL Server 2012".

Sektör Microsoft'un hızına yetişemiyor. Bu sadece Türkiye'de değil, tüm dünyada böyle.

Efendim bu yazımın konusuna dönelim. Böyle bir giriş yapmamın nedeni, SQL Server 2016 ile fazla karşılaşmadığımızdan, SQL Server 2016'da Database Mail ile ilginç bir sorun yaşama olasılığınıza dikkat çekmekti. 

Belki bazılarınızın bildiği gibi SQL Server 2016 kurarken .Net 3.5 kurulumu zorunlu değil. SQL Server 2016 medyanızla doğrudan SQL Server 2016 Instance'ınızı kurabiliyorsunuz. Böyle kurulmuş bir ortamda Database Mail'i yapılandırdım ve test amaçlı bir eposta gönderdim ve beklemeye başladım. İlk dikkatimi çeken şey, Database Mail işleminin bir türlü başlamayışıydı. Task Manager'a baktım, DatabaseMail.exe yok. "sysmail_start_sp" isimli, Database Mail'i başlatmak için kullanılan sistem Stored Procedure'ünü çalıştırdım, ama gene tık yok.

DatabaseMail.exe'nin bulunduğu yola "C:\Program Files\Microsoft SQL Server\MSSQL13.MSSQLSERVER\MSSQL\Binn" gittim ve elle çalıştırmayı denedim ve bir sürpriz ile karşılaştım:

Genişletmek için resmin üstüne tıklayın
Bu ekranı görünce, önceden bu konuda bir yazı okuduğum geldi aklıma. SQL Server 2016 kurulumu için .Net 3.5 gerekmese de, SQL Server 2016'da Database Mail kullanmak için .Net 3.5 kurulumu gerekiyordu.

Genişletmek için resmin üstüne tıklayın
Ben de kurulumu gerçekleştirdim ve Database Mail'i tetiklemek için aşağıdaki Stored Procedure'ü çalıştırdım:

EXEC sysmail_start_sp;

Akabinde Task Manager'ı kontrol ettim ve aşağıdaki gibi DatabaseMail.exe'nin çalıştığını gördüm.


Genişletmek için resmin üstüne tıklayın

SQL Server 2016 kurulumlarınızda Database Mail'in bu durumuna dikkat etmeyi unutmayın. İşin kötüsü, herhangi bir yerde bu konuda bir hata veya kayıt da yok. Eğer ben de sorunu çözmek için izlediğim bu yöntemi izlemesem veya çook önceden okuduğum o yazı aklıma gelmese, bu sorun kim bilir ne saç baş yoldururdu.

Güncelleme: Bu sorun SQL Server 2016 Cumulative Update 2 ile çözülmüş ve Service Pack 1'e de yansıtılmış. Henüz kendim test etmedim, ama bu Connect'e göre Microsoft böyle diyor.

Ekrem Önsoy


14 Kasım 2016 Pazartesi

Database Mail ile başka bir sorun daha

Merhaba millet!

Bu aralar biraz yoğunum, o nedenle bir süre bir şeyler yazamadım. Geçen hafta yurtdışındaydım, Hollanda'nın Den Haag şehrinde. Orada, önceden Antalya Havalimanında çalışan ve şimdi de Amsterdam'da çalışıyor olan veritabanı yöneticisi Hayri Özler ile de tanışmış olduk, pek de hoş oldu, ona da selam olsun!

Cumartesi gecesi yurtdışından gelir gelmez bir de AlwaysOn Availability Group geçişi yaptık. Yoğunluk hala devam etmesine rağmen araya hemen bir yazı sıkıştırayım dedim.

Bugün ortamlardan birinden bir süredir eposta almadığımı fark ettim. Sorunu incelediğimde Database Mail'in yine çeşitli sebeplerden biri yüzünden çalışmadığını gördüm. Arkadaşlar, yine sonra söyleyeceğimi baştan söyleyeyim, eğer DatabaseMail sizin için kritik bir özellik ise ve ortamınızda bir izleme uygulamanız varsa o zaman muhakkak gönderilirken hata alan veya Queue'da çok bekleyen e-postalarınızı kontrol ettirin.

Sorunu incelemek için ilk önce [msdb] sistem veritabanında bulunan Database Mail ile ilgili tabloları sorguladım. Mesela:

SELECT TOP (10) * FROM msdb.dbo.sysmail_event_log ORDER BY log_date DESC

ve

SELECT TOP (10) * FROM msdb.dbo.sysmail_allitems a ORDER BY a.send_request_date DESC

Bu ortamda hem e-posta'ların gönderilemediğine dair hatalar vardı, hem de öylece gönderilmeyi bekleyen birçok e-posta vardı.

Önce Database Mail yapılandırmamın doğruluğunu kontrol ettim. Database Mail Account'umun kullanıcı bilgilerini kontrol ettim. Doğruluğundan emin olduktan sonra ve Database Mail'in hala çalışmadığını gördükten sonra Database Mail'i tekrar başlatmayı düşündüm. Database Mail, SQL Server kurulumu ile birlikte gelir, ama SQL Server Database Engine servisine gömülü bir özellik değildir. Misal Task Manager'dan bakarsanız DatabaseMail.exe diye harici bir uygulamanın çalıştığını görürsünüz. Bu, SQL Server ile birlikte gelen Database Mail özelliği için kullanılan uygulamanın ta kendisidir. Eğer bu uygulama çalışmıyorsa, Database Mail özelliği de çalışmaz.

Database Mail'i tekrar başlattıktan sonra sorunun yine devam ettiğini gördüm. Bunun üzerine Database Mail'in Queue'larını incelemeye karar verdim. "O da nesi?" diye soran arkadaşlarım, Database Mail özelliği Service Broker'ı kullanır, e-postalarınızı bu sayede asenkron olarak gönderilir. Service Broker yapısında da birçok eleman gibi Queue'lar da vardır. Gönderilmek istenen mesajlar önce Queue'lara kaydedilir, sonra da sırasıyla işlenirler. İşte Database Mail'in yine [msdb] veritabanındaki External Queue'sunu ([msdb].[dbo].[ExternalMailQueue]) incelediğimde 20 binden fazla mesaj biriktiğini gördüm. Bunların çoğu zaten artık vakti geçmiş, gereksiz mesajlardı. Bu Queue'yu temizleyince Database Mail ile bir test e-postası gönderdi ve Voila! Artık Database Mail'im çalışıyordu.

Yine vurgulamakta fayda görüyorum. Eğer Database Mail özelliği sizin için kritikse, yani mesela bazı kritik e-postalarınızı Database Mail ile gönderiyorsanız veya 3. parti izleme uygulamalarına bütçe ayıramıyor ve kendi çözümlerinizi kullanıyor ve yine bu kapsamda alarmları Database Mail ile gönderiyorsanız, aynı SQL Server Database Engine servisini izlettiğiniz gibi (izletiyorsunuz, değil mi?) Database Mail'in sağlıklı çalışırlığını da kontrol ettirmelisiniz.

Sevgiler!
Ekrem Önsoy

22 Eylül 2010 Çarşamba

Msg 515, Level 16, State 2, Procedure sp_validate_user, Line 19 Cannot insert the value NULL into column 'permission path', table '@temp'; column does

HATA:
Msg 515, Level 16, State 2, Procedure sp_validate_user, Line 19
Cannot insert the value NULL into column 'permission path', table '@temp'; column does not allow nulls. INSERT fails.
The statement has been terminated.
Msg 14607, Level 16, State 1, Procedure sp_send_dbmail, Line 136
profile name is not valid

AÇIKLAMA:
Ben bu hata ile, ilgili sunucudan aşağıdaki koda benzer bir kod ile Database Mail vasıtasıyla eposta göndermeye çalışırken karşılaştım:

Örnek Kod:
EXECUTE msdb.dbo.sp_send_dbmail
@profile_name = 'SMTP'
,@recipients = 'ekrem.onsoy@test.com'
,@body = 'test_mesaj'
,@subject = 'test_konu'


Bahsi geçen SQL Server Instance'ında iki tane Database Mail Profile ve Account'u mevcuttu.

ÇÖZÜM:
Sorun, iki Database Mail Profile'ının da Public olmamasıydı. Yukarıdaki örnekte de kullanılan "SMTP" isimli Database Mail Profile'ı da Public değildi.

Ya ilgili Database Mail Profile'ını Public olarak ayarlayın ya da ilgili Login'i Private Database Mail Profile'ını kullanabilecek şekilde ayarlayın.

Bu ayarları da ister T-SQL ile isterseniz de SQL Server Management Studio aracılığıyla yapabilirsiniz. Değişikliği SSMS'ten yapmak için: Object Explorer->Management->Database Mail->Manage Profile Security->Public Profiles\Private Profiles.

2 Aralık 2007 Pazar

SQL Server 2005: Otomatik E-Posta Gönderme

Son güncelleme tarihi: 02 Aralık 2007


Merhaba arkadaşlar,

Bu sefer size, oluşturduğunuz bir işte (Job) bir hata meydana geldiğinde veya iş başarıyla tamamlandığında, işlemin sonucunu bildiren bir e-postanın otomatik olarak nasıl SQL Server tarafından göndertileceğini anlatacağım.

Bu işlem için değişik yerlerden değişik ayarlar yapıp, bunları tümleşik bir sistem halinde çalıştıracağız. Meselâ bu ayarlar aşağıdaki konularda olacak:

- Database Mail
- Operator
- SQL Server Agent Job

Size öncelikle özetle Database Mail' den bahsetmek isterim. Database Mail, SQL Server 2005 ile birlikte geldi. Microsoft artık SQLMail özelliğinin yerine Database Mail' in kullanılmasını öneriyor. SQLMail eskide kaldı anlayacağınız. Database Mail, SQLMail' in halefi ve tamamen yeniden tasarlanmış hâli. Ayrıca SQLMail' deki gibi Outlook gibi bir harici programa da ihtiyaç duymadan Database Mail ile SQL Server' ınızdan eposta gönderebilirsiniz.

SQL Server 2005 ilk kurulduğunda neredeyse her şeyin varsayılan olarak yasak olduğunu görürsünüz. Bu, güvenlik amacıyla yapılmıştır. Database Mail de varsayılan olarak kullanılamaz durumdadır. Öncelikle aşağıdaki adımları uygulayarak Database Mail' i kullanılabilir hale getirin.

- Başlat\Programlar\Microsoft SQL Server 2005' dan "SQL Server Surface Area Configuration" aracını açın *

- "Select a component, and then configure its features:" etiketinin altındaki listeden ayar yapmak istediğiniz ilgili Instance' ı seçin.

- "Database Engine" düğümü altındaki Database Mail' e tıklayın ve daha sonra "Enable Database Mail stored procedures" seçeneğinin işaretli olduğuna emin olun ve penceredeki "OK" düğmesine tıklayarak pencereyi kapatın.

* SQL Server Surface Area Configuration ile Resim-1' de de gördüğünüz gibi SQL Server' da dair bazı özelliklerin kullanılabilir veya kullanılamaz olacağını ayarlarız. SQL Server Surface Area Configuration aracı SQL Server 2005 ile birlikte çıktı ve SQL Server 2008' de kaldırıldı.


Resim-1


Database Mail' i kullanılabilir hale getirdikten sonra, bir Profil ve Hesap tanımlamanız gerekecek. Bunun için de aşağıdaki adımları izleyin.

- SQL Server Management Studio' yu çalıştırın. "Management" düğümünü genişletin ve "Database Mail" in üzerinde farenin sağ tuşuna tıklayıp, açılan menüden "Configure Database Mail" e tıklayın.

- Açılan "Database Mail Configuration Wizard" penceresindeki "Manage Database Mail accounts and profiles" seçeneğini işaretleyerek "Next" düğmeyine tıklayın.


Resim-2


- "Manage Profiles and Accounts" penceresi açılacaktır. Bu penceredeki "Create a new profile" seçeneğini işaretleyip "Next" düğmesine tıklayın.

- "New Profile" penceresi açılacaktır. Bu pencerede hem yeni bir Profil tanımlayacağız, hem de yeni bir Hesap oluşturacağız. Bunun için Resim-3' ten kopya çekebilirsiniz =)


Resim-3


- "New Database Mail Account" penceresindeki "OK" düğmesine tıklatıkdan sonra "Database Mail Configuration Wizard" penceresindeki "Next" düğmesine, ardından da "Finish" düğmesine tıklayarak E-Posta için Profil ve Hesabı oluşturmuş oluyoruz.

- Bu noktada ayarların doğruluğundan emin olmak için oluşturduğunuz e-posta hesabına bir deneme postası gönderebilirsiniz. Bunun için "Database Mail" üzerinde farenin sağ tuşuna tıklayarak açılan menüden "Send Test E-Mail..." öğesine tıklayabilirsiniz.

Bu bölümde "Database Mail" i etkin hale geitirip, otomatik olarak e-posta göndermek için yeni bir Hesap ve bu hesap için yeni bir Profil oluşturduk.

Bir sonraki bölümde ise yeni bir Operator oluşturup, SQL Server Agent ayarımızı yapıp, bize sonucu hakkında bilgi verilmesini istediğimiz işi (Job) ayarlayacağız.


------------------------ 2. Bölüm -----------------------------


Bu bölümde yeni bir Operator oluşturup, SQL Server Agent ayarımızı yapıp, bize sonucu hakkında bilgi verilmesini istediğimiz işi (Job) ayarlayacağız.

İşe ilk önce SQL Server Agent' ında, Database Mail' i kullanabilmemiz için gerekli ayarı yapalım. Bunun için aşağıdaki adımları izleyin:

- SQL Server Management Studio' yu çalıştırın.

- SQL Server Agent servisinin çalıştığından emin olun. Daha sonra SQL Server Agent düğümünün üzerinde farenin sağ tuşuna basın ve "Properties" e tıklayın. "SQL Server Agent Properties" penceresi açılacaktır.

- Bu pencerenin sol tarafındaki "Select a page" bölümünden "Alert System" a tıklayın. Sağ taraftaki bölümde "Mail Session" kısmındaki "Enable mail profile" seçeneğini göreceksiniz. Bu seçeneğin işaretli olduğundan emin olun. Bu seçenekle beraber "SQL Server Agent Mail" i etkin hale getirmiş oluyoruz. Amma güvenlik var değil mi =)


Resim-4


Bu ayarı da yaptıktan sonra bir Operator oluşturmaya geçebiliriz. Peki neden Operator oluşturuyoruz, neden bir Operator' e ihtiyacımız var? Operator ne işe yarar kuzum Allah aşkına? gibi soruları havada bırakmamak için hemen Operator kavramına da bir ışık tutayım.

Operator' ü epostayı alıcak olan kişinin isim ve adres bilgilerini kaydetmek için kullanıyoruz arkadaşlar. Gerek e-posta alıcısı olsun, gerek Net Send ve gerekse Pager.

Şimdi Operator tanımlamaya geçebiliriz sanırım. Bunun için eğer SQL Server Management Studio açık değilse açın ve aşağıdaki adımları uygulayın:

- SQL Server Agent düğümünü genişletin.

- Operators' ın üzerinde farenin sağ tuşuna tıklayın ve açılan menüden "New Operator..." seçeneğini seçin.

- Açılan "New Operator" penceresindeki "Name" kısmına operatörün adını yazın.

- "Enabled" seçim kutusunun işaretli olduğundan emin olun, aksi takdirde operatöre eposta vs. gönderilmeyecektir.

- "E-mail name" metin kutusuna alıcının e-posta adresini yazın. "OK" düğmesine tıklayın ve Operator' ümüz de hazır işte!


Resim-5


Şimdi sadece bir iş kaldı, o da istediğimiz bir işi, oluşturduğumuz Operator' ü kullanarak ayarlamak.

Bunun için ayarlamayı yapmak istediğiniz bir işin özelliklerini açın ve aşağıdaki adımları izleyin:

- Açılan "Jop Properties" penceresinde, sol tarafta bulunan "Select a page" listesinden "Notifications" seçeneğini seçin.

- Sağ taraftaki "Actions to perform when the job completes" seçeneklerinden "E-mail" in yanındaki seçim kutusunu işaretleyin ve aşağı açılır listeden de oluşturduğumuz "Nesrin Yiğit" Operator' ünü seçin.

- Hemen Operator seçim kutusunun sağ tarafında üç tane seçenek bulunmaktadır. Eğer bu seçenekler "When the job fails" i seçerseniz, eposta size iş başarıyla tamamlanamadığı zaman gönderilecektir. Eğer "When the job succeeds" i seçerneseniz, iş başarıyla tamamlandığında gönderilecektir. Eğer "When the job completes" i seçerseniz, o zaman da iş başarıyla da olsa başarısızlıkla da olsa tamamlandığında size sonuç hakkında posta gönderilecektir.


Resim-6


İş ayarımızı da yapıp konumuzu bitirmiş olduk.

Özetle, bu makalede sizlere Database Mail' i nasıl etkinleştirip yapılandırabileceğinizi, SQL Server Agent' ın Database Mail için nasıl yapılandırabileceğinizi, nasıl bir Operator oluşturabileceğinizi ve SQL Server Agent Job' ınızı nasıl ayarlayabileceğinizi anlatmaya çalıştım, öğrendiğinizi umarım.



Ekrem Önsoy