+ -
当前位置:首页 → 问答吧 → MS SQL SERVER 2008 Database Mail , sysmail_mailitmes 资料莫名消失.

MS SQL SERVER 2008 Database Mail , sysmail_mailitmes 资料莫名消失.

时间:2011-11-26

来源:互联网

本人所在公司使用的是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

作者: Lost_Painting   发布时间: 2011-11-26

我先占个sf,理会一下

作者: Beirut   发布时间: 2011-11-26

sysmail_event_log 能看到什么

作者: ssp2009   发布时间: 2011-11-26

建議可以直接查詢mail server上的日誌,

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

也可能是對方的郵件服務器把你方mail server設為黑名單之類的.

作者: ap0405140   发布时间: 2011-11-26

这个是 视图
sysmail_event_log
的源代码:

SQL code

SET QUOTED_IDENTIFIER OFF
SET ANSI_NULLS ON
GO

CREATE VIEW sysmail_event_log
AS
SELECT log_id,
       CASE event_type 
          WHEN 0 THEN 'success' 
          WHEN 1 THEN 'information' 
          WHEN 2 THEN 'warning' 
          ELSE 'error' 
       END as event_type,
       log_date,
       description,
       process_id,
       sl.mailitem_id,
       account_id,
       sl.last_mod_date,
       sl.last_mod_user
FROM [dbo].[sysmail_log]  sl
WHERE (ISNULL(IS_SRVROLEMEMBER(N'sysadmin'), 0) = 1) OR 
      (EXISTS ( SELECT mailitem_id FROM [dbo].[sysmail_allitems] ai WHERE sl.mailitem_id = ai.mailitem_id ))
GO



它其实是来源于sysmail_log的.其加了权限限制... 或者资料存在性检查.
 sysmail_log看不到的,它也看不到.sysmail_log能看到的,它也不一定能看到...

作者: Lost_Painting   发布时间: 2011-11-26

"建議可以直接查詢mail server上的日誌"
sysmail_log这个就是mail server的日志.

"無法派送也可能是mail server或網絡問題,"
一些邮件发送失败,我确定是网络问题,造成邮件无法发送.
但是即使邮件无法发送,也不应该删除掉sysmail_mailitems表中的资料,这不符合逻辑.
既然log表中有,而又无法确定是否发送失败的,还删除?这样的话,如何追踪问题..?

引用 3 楼 ap0405140 的回复:

建議可以直接查詢mail server上的日誌,

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

也可能是對方的郵件服務器把你方mail server設為黑名單之類的.

作者: Lost_Painting   发布时间: 2011-11-26