日期:2014-05-18  浏览次数:20691 次

MS SQL SERVER 2008 Database Mail , sysmail_mailitmes 资料莫名消失.
本人所在公司使用的是MS SQL SERVER 2008中的Database Mail 派信,近几天发现有邮件无法派送出去,准备来查派信的log,结果却发现了另外一个严重的问题.
 sysmail_log中有些资料行有的mailitem_id,却不存在与 sysmail_mailitems中.
执行以下语句:

SQL code
SELECT  l.mailitem_id ,  m.mailitem_id ,  send_request_date ,   m.sent_status ,  r.send_attempts 
FROM    dbo.sysmail_log l
LEFT JOIN dbo.sysmail_mailitems m ON m.mailitem_id = l.mailitem_id
LEFT JOIN dbo.sysmail_send_retries r ON l.mailitem_id = r.mailitem_id
WHERE   l.event_type = 3


发现,有些资料行: l.mailitem_id 有值,而 m.mailitem_id 为NULL.
  为了该问题,我监控过一段时间这个查询结果的变化,发现一开始运行上面的语句时,同一mailitem_id资料都是存在与三个表中的, l.mailitem_id , m.mailitem_id , r.mailitem_id 都有值,但是过了一段时间(大概几分钟~十多分钟后) l.mailitem_id 有值, m.mailitem_id , r.mailitem_id 却变成了null,
这些mailitem在表sysmail_mailitems 与sysmail_send_retries
被删除了. 而 sysmail_log中却存在.
这是为什么?是由于某个设定吗?
希望了解的人士提供帮助,非常感谢.
(PS:之前有听到一种说法是说发送成功的邮件就会被删除,但是我发现很多发送成功依然存在与三个表中,实在不解了?)

在MSDN发帖三天,无人理会.
http://social.msdn.microsoft.com/Forums/zh-CN/sqlserverzhchs/thread/e9ec83f7-33cd-4913-a935-7fcf180d47f8/#6219b3b4-4e4f-4895-a73e-aca2b8edad3e

在stackoverflow发帖半日,无人理会.
http://stackoverflow.com/questions/8275715/the-data-in-sysmail-mailitems-disappeared-with-no-reason-when-i-use-sql-server-2


------解决方案--------------------
sysmail_event_log 能看到什么
------解决方案--------------------
建議可以直接查詢mail server上的日誌,

應該有更詳細的信息, 無法派送也可能是mail server或網絡問題,

也可能是對方的郵件服務器把你方mail server設為黑名單之類的.
------解决方案--------------------
既然用系统表有点混乱,建议自建一个邮件发送记录表,

每次发送database mail前插入一条记录(根据先写日志的原则),

发送成功后update发送状态为"已发送".
------解决方案--------------------
若要查看 Database Mail 處理的所有訊息使用 sysmail_allitems (Transact-SQL)。
若只要查看失敗狀態的訊息,請使用 sysmail_faileditems (Transact-SQL)。
若只要查看已傳送的訊息,請使用 sysmail_sentitems (Transact-SQL)。

http://technet.microsoft.com/zh-cn/library/ms188023.aspx

所有記錄在msdb.dbo.sysmail_mailitems表
通過以上視圖查看試試
------解决方案--------------------
原来如此,