xml地图|网站地图|网站标签 [设为首页] [加入收藏]
heartbeat不断重试会导致内存缓慢增长,Mail重复发
分类:数据库

今天用到了MySql里的isnull才发现他和MSSQL里的还是有点区别,现在简单总结一下:

在一数据库服务器(Microsoft SQL Server 2014 (SP2) (KB3171021) - 12.0.5000.0 (X64))发现有个作业调用Database Mail发送邮件时,有时候出现同样的邮件发送两封的情况,经过详细检查,排除了该作业里面业务逻辑有问题的情况,确实存在重复发送邮件的情况, 检查Database Mail日志,发现在0:00~0.03报“The mail could not be sent to the recipients because of the mail server failure. (Sending Mail using Account 1 (2016-10-27T00:03:21). Exception Message: Cannot send mails to mail server”这类的错误,具体信息如下所示

最近同事反映,在使用pt-heartbeat监控主从复制延迟的过程中,如果master down掉了,则pt-heartbeat则会连接失败,但会不断重试。

mysql中isnull,ifnull,nullif的用法如下:

图片 1

重试本无可厚非,毕竟从使用者的角度来说,希望pt-heartbeat能不断重试,直到重新连接上数据库。但是,他们发现,不断的重试会带来内存的缓慢增长。

isnull(expr) 的用法:
如expr 为null,那么isnull() 的返回值为 1,否则返回值为 0。 
mysql> select isnull(1+1);
-> 0
mysql> select isnull(1/0);
-> 1
使用= 的null 值对比通常是错误的。 

Date 2016/10/27 0:03:21

 

isnull() 函数同 is null比较操作符具有一些相同的特性。请参见有关is null 的说明。

Log Database Mail (Database Mail Log)

重现

IFNULL(expr1,expr2)的用法:

Log ID 29022

环境:           

假如expr1   不为   NULL,则   IFNULL()   的返回值为   expr1; 
否则其返回值为   expr2。IFNULL()的返回值是数字或是字符串,具体情况取决于其所使用的语境。

Process ID 11300

pt-heartbeat v2.2.19,MySQL社区版 v5.6.31,Perl  v5.10.1,RHEL 6.7,内存500M

mysql>   SELECT   IFNULL(1,0);   
                  ->   1   
mysql>   SELECT   IFNULL(NULL,10);   
   ->   10   
 mysql>   SELECT   IFNULL(1/0,10);   
           ->   10   
mysql>   SELECT   
IFNULL(1/0,'yes');   

Mail Item ID 747326

为了避免数据库启停对pt-heartbeat内存使用率的影响,故MySQL和pt-heartbeat分别运行在不同的主机上。

            ->   'yes'  

Last Modified 2016/10/27 0:03:21

 

IFNULL(expr1,expr2)的默认结果值为两个表达式中更加“通用”的一个,顺序为STRING、   REAL或   
INTEGER。假设一个基于表达式的表的情况,     或MySQL必须在内存储器中储存一个临时表中IFNULL()的返回值:   
CREATE   TABLE   tmp   SELECT   IFNULL(1,'test')   AS   test;   
在这个例子中,测试列的类型为   CHAR(4)。      
NULLIF(expr1,expr2)  的用法:  
如果expr1 
=   expr2     成立,那么返回值为NULL,否则返回值为   expr1。这和CASE   WHEN   expr1   =   expr2   
THEN   NULL   ELSE   expr1   END相同。     
mysql>   SELECT   
NULLIF(1,1);   

Last Modified By sa

运行pt-heartbeat

           ->   NULL   
mysql>   SELECT   NULLIF(1,2);   
            ->   1  
如果参数不相等,则   MySQL   两次求得的值为     expr1   。

Message

# pt-heartbeat --update -h 192.168.244.10 -u monitor -p monitor123 -D test --create-table 

The mail could not be sent to the recipients because of the mail server failure. (Sending Mail using Account 1 (2016-10-27T00:03:21). Exception Message: Cannot send mails to mail server. (Mailbox unavailable. The server response was: 5.7.1 Unable to relay for zhouxxxx@xxxx.mail.onmicrosoft.com).

 

)

监控pt-heartbeat的内存使用率

 

获取pid

从上面日志可以看到是SMTP反馈zhouxxxx@xxxx.mail.onmicrosoft.com这个邮箱无法送达。Mail Item ID就可以查到相关,然后和开发人员一排查,就找到了发送邮件的存储过程,检查发现还是因为其中一个邮箱地址弄错了,导致这些错误出现在Database Mail日志中,当然如果遇到这类错误,必须查看Exception Message: Cannot send mails to mail server后面括号里面详细的报错信息,然后检查、分析确认(Mailbox unavailable. The server response was: 5.7.1 Unable to relay for zhouxxxx@xxxx.mail.onmicrosoft.com). 不同的日志信息,往往反馈不同的问题。也正是这种情况的邮件,都出现了重复发送情况。

# ps -ef |grep pt-heartbeat

 

root       1505   1471  0 19:13 pts/0    00:00:08 perl /usr/local/bin/pt-heartbeat --update -h 192.168.244.10 -u monitor -p monitor123 -D test --create-table
root       1563   1545  2 19:50 pts/3    00:00:00 grep pt-heartbeat

手工测试这样的情形(发送给多个收件人,其中一个邮件名称故意写错),发现邮箱确实会收到两封这样的邮件。

查看该进程的内存使用率

EXEC msdb.dbo.sp_send_dbmail @subject='邮件重复发生问题测试——1',@recipients='xxxx@xxxx.microsoft.com;konglb@xxxx.com',@body='test the email send twice problem';

# top -p 1505

 

运行了0:15.00(TIME+列),MEM一直稳定在3.3%

 

图片 2

然后我想定位到底是SQL Server版本问题,还是SMTP设置问题,结果测试过程让我更迷惑了

 

 

现关闭数据库

本文由澳门新葡亰手机版发布于数据库,转载请注明出处:heartbeat不断重试会导致内存缓慢增长,Mail重复发

上一篇:没有了 下一篇:没有了
猜你喜欢
热门排行
精彩图文