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

  • 问题

  •    本人所在公司使用的是MS SQL SERVER 2008中的Database Mail 派信,近几天发现有邮件无法派送出去,准备来查派信的log,结果却发现了另外一个严重的问题.

     sysmail_log中有些资料行有的mailitem_id,却不存在与 sysmail_mailitems中.

    执行以下语句:

     

    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:之前有听到一种说法是说发送成功的邮件就会被删除,但是我发现很多发送成功依然存在与三个表中,实在不解了?)

     

     


    2011年11月24日 9:26

答案

  • 马勒戈壁的草泥马... ...

    我找到原因了,原来是之前离职的同仁有开发一个"异想天开","想当然"的JOB在杀微软 sysmail_mailitems里面sent_status=2的资料.

    真的是超级想当然啊... ...,你杀资料也杀干净点啊,别到处留尾巴... ...

    这个Job在生产环境有运行,我没权限看.而在测试环境Job压根没运行,这样就造成了测试环境死都测不出来,而生产环境却一堆的神秘消失的资料!

    作死啊... ...

    浪费我足足两天的时间,我都快要怀疑是微软的问题了... ...,不过我觉得微软不会犯这种超低级的错误啊.

    最后我整个数据库服务器搜索了一下sysmail_mailitems这个关键字,发现居然有某个DB下某个SP在使用它.. ... 终于被我逮着了.

    交接啊,交接啊,下次有人离职一定要强调让其交接好. 特别是这种连资料都没有的东西.
    • 已标记为答案 Chris Tung 2011年11月26日 6:57
    2011年11月26日 6:57

全部回复

  • 另外: 在 sysmail.log 中能看到此類 log

     

    Errors: System.Data.SqlClient.SqlErrorCollection  

    Class: 11  

    LineNumber: 0  

    Number: -2  

    Procedure:   

    Server: *******  

    State: 0  

    Source: .Net SqlClient Data Provider  

    ErrorCode: -2146232060  

    Message: 已超過連接逾時的設定。在作業完成之前超過逾時等待的時間,或者是伺服器未回應。  

    Data: System.Collections.ListDictionaryInternal  TargetSite: Void OnError(System.Data.SqlClient.SqlException, Boolean)  HelpLink: NULL   

     StackTrace Information 

     ===================     

    於 System.Data.SqlClient.SqlConnection.OnError(SqlException exception, Boolean breakConnection)    

    於 System.Data.SqlClient.TdsParser.ThrowExceptionAndWarning(TdsParserStateObject stateObj)    

    於 System.Data.SqlClient.TdsParser.Run(RunBehavior runBehavior, SqlCommand cmdHandler, SqlDataReader dataStream, BulkCopySimpleResultSet bulkCopyHandler, TdsParserStateObject stateObj)     

    於 System.Data.SqlClient.SqlCommand.FinishExecuteReader(SqlDataReader ds, RunBehavior runBehavior, String resetOptionsString)    

    於 System.Data.SqlClient.SqlCommand.RunExecuteReaderTds(CommandBehavior cmdBehavior, RunBehavior runBehavior, Boolean returnStream, Boolean async)     

    於 System.Data.SqlClient.SqlCommand.RunExecuteReader(CommandBehavior cmdBehavior, RunBehavior runBehavior, Boolean returnStream, String method, DbAsyncResult result)     

    於 System.Data.SqlClient.SqlCommand.InternalExecuteNonQuery(DbAsyncResult result, String methodName, Boolean sendToPipe)     

    於 System.Data.SqlClient.SqlCommand.ExecuteNonQuery()    

    於 Microsoft.SqlServer.Management.SqlIMail.Server.DataAccess.DataAccessAdapter.PostResponse(Response r, Guid convHandle)  

    於 Microsoft.SqlServer.Management.SqlIMail.IMailProcess.ThreadCallBack.PostResponseIfNeeded(MailInfo mi, Response r)    

    於 Microsoft.SqlServer.Management.SqlIMail.IMailProcess.ThreadCallBack.MailOperation(Object o)

    2011年11月26日 1:15
  • 马勒戈壁的草泥马... ...

    我找到原因了,原来是之前离职的同仁有开发一个"异想天开","想当然"的JOB在杀微软 sysmail_mailitems里面sent_status=2的资料.

    真的是超级想当然啊... ...,你杀资料也杀干净点啊,别到处留尾巴... ...

    这个Job在生产环境有运行,我没权限看.而在测试环境Job压根没运行,这样就造成了测试环境死都测不出来,而生产环境却一堆的神秘消失的资料!

    作死啊... ...

    浪费我足足两天的时间,我都快要怀疑是微软的问题了... ...,不过我觉得微软不会犯这种超低级的错误啊.

    最后我整个数据库服务器搜索了一下sysmail_mailitems这个关键字,发现居然有某个DB下某个SP在使用它.. ... 终于被我逮着了.

    交接啊,交接啊,下次有人离职一定要强调让其交接好. 特别是这种连资料都没有的东西.
    • 已标记为答案 Chris Tung 2011年11月26日 6:57
    2011年11月26日 6:57