[Warning] Aborted connection 11203 to db: 'ide' user: 'nuc' host: 'prd01.mb.com' (Got an error writi

本文记录了一次MySQL故障排查过程,包括连接错误、资源消耗分析、内存与配置调整,最终通过参数优化解决了高负载下连接数激增的问题。

PS:一台物理机扯分了3个虚拟机,一个主db,一个主备,一个从备。

 

切换到0301的时候

Sep  6 09:16:16 prddb0301 mysqld: 130906  9:16:16 [Warning] Aborted connection 11203 to db: 'ide' user: 'nuc' host: 'prd01.mb.com' (Got an error writing communication packets)
Sep  6 09:16:16 prddb0301 mysqld: 130906  9:16:16 [Warning] Aborted connection 12498 to db: 'ide' user: 'nuc' host: 'prd02.mb.com' (Got an error writing communication packets)
Sep  6 09:16:16 prddb0301 mysqld: 130906  9:16:16 [Warning] Aborted connection 13503 to db: 'ide' user: 'nuc' host: 'prd03.mb.com' (Got an error writing communication packets)
Sep  6 09:16:17 prddb0301 mysqld: 130906  9:16:17 [Warning] Aborted connection 6681 to db: 'ide' user: 'nuc' host: 'prd11.mb.com' (Got an error writing communication packets)
Sep  6 09:16:18 prddb0301 mysqld: 130906  9:16:18 [Warning] Aborted connection 15070 to db: 'ide' user: 'nuc' host: 'prd12.mb.com' (Got an error writing communication packets)

刚才切换到0301的时候,connection 1800的时候,后台error报错。

大概原因:shard卡住会让app server都卡住,最差情况下,所以即使一个shard可能影响也挺大,比较担心。

 

1  check 用show engine innodb status\G;进行分析

看到:所有的thread都在d estimating records in index range;有很多类似的很多的SQL等待:

select ENTITLEMENT_ID, USER_ID, PRODUCT_ID, GRANT_DATE, EXPIRATION_DATE, DATE_CREATED, STATUS, CREATED_BY, MODIFIED_BY, DATE_MODIFIED, STATUS_REASON_CODE, ENTITLEMENT_TAG, VERSION, PRODUCT_CA
TALOG, USE_COUNT, GROUP_ID, ENTITLEMENT_SOURCE, ENTITLEMENT_TYPE, PROJECT_ID, DEVICE_ID, MANAGED_LIFECYCLE, CONSUMABLE, ORIGIN_PERMISSIONS, EXTERNAL_TYPE, EXTERNAL_ID from ide.entil
T as ent where 1 = 1 and STATUS = 1 and USER_ID = 2331523206069 and DATE_MODIFIED >= '2013-09-06 01:39:00' order by ENTITLEMENT_ID DESC limit 0, 5000

我觉得还是内存问题,把hugepage 拿掉,现在的行为就是机器不繁忙但所有的资源都消耗在iowait上,导致卡死,刚才我们改动过的就是内存。

http://www.51testing.com/?uid-225738-action-viewspace-itemid-235472

 

2 check memory

[ed@prdkvm35 ~]$ free -g
             total       used       free     shared    buffers     cached
Mem:           125        124          1          0          1          0
-/+ buffers/cache:        122          3

看到物理机器上面一共3G内存,把物理机器上面的vm内存再弄小点,给物理机器的内存设置大一些。修改完后,重启动vm,然后启动Mysql,并且failover writer 从0302到0301上面。

 

3 failover之后,connection过多

failover过后,看到0301的db上面的conntion client猛增到2000多个,超过正常范围值500多4倍了,而且client还在不停的增长,马上failover writer 0301db到0302db,connection恢复正常了。

 

4 check,检查0301的my.cnf配置文件

将login audit去掉,然后改小innodb_buffer_pool_size,从60G改称48G。再进行failover writer 从0302到0301上面。

 

5 check again

failover还是暴增到2000多个,超过正常范围值500多4倍了,而且client还在不停的增长,马上failover writer 0301db到0302db,connection恢复正常了。

 

6 内存再设置小一些,

把主备vm和从备vm的内存再设置小一些,每个去掉4G,修改完后,再次重启vm以及vm上面的MySQL服务。再failover writer 从0302到0301上面。check之后发现conntions还是t猛增到2000多个,超过正常范围值500多4倍了。而且IO wait好高啊!然后failover回去到db0302 ,failover writer 从0302到0301上面。

 

7 每次IO好高,那么去看看my.cnf里面的innodb_flush_log_at_trx_commit之类innodb writer的参数是否合理。

发现my.cnf里面innodb_flush_log_at_trx_commit = 1; God,貌似找到问题所在了,马上修改my.cnf 将innodb_flush_log_at_trx_commit = 0;

ok,然后再failover writer 从0302到0301上面,check conntion clients,猛增到800多后稳定下来1分钟后,connection clients稳定在500左右。OK,成了!

 

PS:这个prod上面的my.cnf是原来的DBA设置的,在每次failover的时候,都需要保持  Seconds_Behind_Master=0;

追得太慢NOC又call我了,看到sync_binlog=1 了,我改成0了,这样很快Seconds_Behind_Master=0了。



 

 

<think>嗯,用户这次提交的是MySQL数据库连接异常问题,具体报错是"Aborted connection"。从引用[1][2]和用户描述看,这是典型的通信包读取失败错误,且集中在特定用户&#39;canal&#39;和&#39;mha&#39;上。这类错误通常发生在中间件场景,比如阿里云的Canal或MHA高可用工具。 用户可能正在搭建MySQL数据同步或高可用架构,但网络或权限配置出了问题。注意到报错中&#39;db: unconnected&#39;很关键——说明连接在完成数据库鉴权前就被中断了,排除了SQL语句问题,更可能是TCP层或权限问题。 先从最可能的三个方向切入:首先是网络稳定性,尤其跨物理机通信时MTU设置不当会导致大包传输失败;其次是连接复用设置,Canal这类工具会维持长连接,wait_timeout超时可能触发服务端主动断开;最后是身份认证问题,MySQL 8.0的caching_sha2_password插件与旧版客户端不兼容。 考虑到用户IP段是192.168.x,应该是内网环境。建议优先检查:1) Canal服务端与MySQL的防火墙规则;2) 用tcpdump抓包确认是否有RST异常终止;3) 验证canal用户的host限制是否包含客户端IP。如果用户近期升级过MySQL,要特别关注认证插件变更的影响。 值得补充的是"Canal"这个线索——它默认使用模拟从库的机制,需要REPLICATION权限而非普通SELECT。用户可能只授予了库表权限但漏了全局权限,导致连接初始化阶段就被拒绝。这正好解释为什么状态停留在&#39;unconnected&#39;。 </think>根据MySQL连接中断错误`Aborted connection to db: &#39;unconnected&#39;`的排查经验,结合Canal等中间件的特性,建议分层排查以下解决方案: --- ### 一、核心原因分析(基于错误日志) 1. **通信层面中断** - 网络波动导致TCP连接异常(常见于跨机房/云环境) - 防火墙或安全组拦截数据包传输 - **关键特征**:错误明确提示 `Got an error reading communication packets` 2. **服务端主动断开** - `wait_timeout` 或 `interactive_timeout` 超时 - 连接池配置不匹配(客户端保活时间 < 服务端超时时间) - 用户权限认证失败(如密码错误或权限变更) 3. **Canal中间件特殊性** - Canal模拟MySQL从库需`REPLICATION`权限 - Binlog读取期间网络闪断会触发此错误 --- ### 二、针对性解决方案 #### (1) 网络层排查 ```bash # 1. 测试网络稳定性(从MySQL服务器执行) $ ping -c 100 192.168.232.148 # 观察丢包率 # 2. 检查防火墙规则 $ iptables -L -n | grep 192.168.232.148 # 3. 抓包分析(需临时开启) $ tcpdump -i eth0 host 192.168.232.148 and port 3306 -w packet.pcap ``` > **注意**:若丢包率 >0.1% 或检测到RST复位包,需联系网络运维 #### (2) MySQL服务端配置优化 ```sql -- 增大超时阈值(单位:秒) SET GLOBAL wait_timeout = 28800; SET GLOBAL interactive_timeout = 28800; -- 检查连接中断计数器 SHOW GLOBAL STATUS LIKE &#39;Aborted_connects&#39;; -- 验证用户权限(Canal需要REPLICATION权限) SHOW GRANTS FOR &#39;canal&#39;@&#39;192.168.232.148&#39;; ``` > **配置建议**:在`my.cnf`中永久生效 > 修改后需重启:`systemctl restart mysqld` #### (3) Canal客户端配置调整 ```properties # canal.properties 关键参数 canal.instance.network.receiveBufferSize = 16384 # 增大缓冲区 canal.instance.connectionCharset = UTF-8 # 字符集匹配 # 启用心跳机制(防止超时断开) canal.instance.detecting.enable = true canal.instance.detecting.sql = SELECT 1 ``` > 重启Canal服务:`bin/stop.sh && bin/start.sh` --- ### 三、进阶排查手段 1. **启用MySQL完整错误日志** ```ini # my.cnf 追加配置 log_error_verbosity=3 log_warnings=2 ``` 2. **WireShark解码MySQL协议** 分析抓包文件中的`Login Request`阶段数据,重点观察: - `Client Authentication Packet`是否完整 - 服务端是否返回`ERR_Packet` 3. **连接复用验证** 使用连接池工具测试持续连接: ```bash mysql -u canal -p -h 192.168.232.148 -e "SELECT SLEEP(300)" & ``` --- ### 四、预防措施 | 措施 | 操作示例 | 效果 | |-----------------------|------------------------------|--------------------------| | **TCP Keepalive** | `sysctl -w net.ipv4.tcp_keepalive_time=300` | 防止网络层断连 | | **中间件心跳** | Canal配置`detecting.interval=20` | 维持应用层连接 | | **防火墙白名单** | `iptables -A INPUT -s 192.168.232.148 -p tcp --dport 3306 -j ACCEPT` | 避免误拦截 | > 通过上述组合策略,可解决90%以上的通信中断问题[^1][^2]。若问题持续,需结合MySQL的`general_log`和Canal的`logs/canal/canal.log`进行联合诊断。 --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值