【MYSQL】主从复制延迟,Waiting for dependent transaction to commit

文章描述了一次Mysql5.7数据库出现主从延迟的事件,由于大事务导致。通过查看同步状态、binlog文件和与应用负责人沟通,确认需等待从库自然同步。常规处理包括检查同步状态、联系应用负责人并准备应急恢复方案。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

收到监控报警,某套Mysql5.7数据库主从延迟过高,且持续增长。经分析确认,应用负责人在手工补跑数据,提交了大事务,这种情况下不能也无法人工干预,只能静静等从库跟上来。另,主库3小时内就已经全部跑完补跑的数据,但从库却花了一整天才追上主库,mysql性能问题是值得诟病的。

一、案发情况

1、收到邮件报警
在这里插入图片描述
2、查看同步状态,确认同步线程还在线以及当前处理的binlog文件和位置
在这里插入图片描述
3、使用mysqlbinlog 翻译binlog事务,并联系应用责任人了解当下发生了啥业务。mysqlbinlog命令及结果如下

#!/bin/ksh
#mysql用户执行
Master_Log_File=#Master_Log_File#
Master_Log_Pos=#Master_Log_Pos#
datadir=`mysql -usysdba -padmin123 -e "show variables like '%datadir%'"|grep datadir |awk '{print $2}'`
tmp=${datadir%data/}"log/bin_log/"
binlogfile=$tmp$Master_Log_File
echo "binlog文件路径:"$binlogfile
mysqlbinlog -vv --base64-output=decode-row $binlogfile --start-position=$Master_Log_Pos |head -n 100

在这里插入图片描述
4、电话沟通后,确认是应用责任人在补跑数据,目前等待就行了,从库会自动跟上主库。如果万一从库发生意外永远跟不上了,那就应急处理“用主库的备份文件恢复备库

二、发生主从延迟时,常规的处理步骤

1、查看同步状态,确认同步线程还在工作;
2、查看binlog文件,确认当前同步线程正在处理的过程;
3、电话/邮件/微信尽快联系应用负责人,确认当前时段是否有批量/程序在进行数据库操作;
4、等待从库跟上主库,通常要好几个小时,大部分情况下自动跟上;
5、如果主从同步断掉,需具体问题具体分析;

### 解决MySQL 8中GROUP BY子句功能依赖问题 在MySQL 8中,默认启用了`ONLY_FULL_GROUP_BY` SQL模式,这意味着任何出现在`SELECT`列表、`HAVING`子句或`ORDER BY`子句中的非聚合列都必须出现在`GROUP BY`子句中,除非这些列之间存在函数依赖关系[^1]。 当遇到不是函数依赖的列时,有几种方法来处理这个问题: #### 方法一:显式添加所有非聚合列为GROUP BY的一部分 最直接的方法是在`GROUP BY`子句中加入所有的非聚合列。这样做虽然简单粗暴,但是能有效避免违反`ONLY_FULL_GROUP_ANY`规则的情况发生。 ```sql SELECT department_id, employee_name, COUNT(*) AS num_employees FROM employees GROUP BY department_id, employee_name; ``` 这种方法确保了每一个非聚合字段都被包含进了分组条件里,从而满足了严格的分组要求[^4]。 #### 方法二:移除不必要的非聚合列或将它们转换成聚合表达式 如果某些非聚合列对于查询结果并不是必需的,则可以直接将其从`SELECT`语句中删除;或者通过应用合适的聚合函数(如`MAX()`、`MIN()`等)将这些列转化为聚合形式。 ```sql -- 去掉employee_name 或者 使用聚合函数替代它 SELECT department_id, MAX(employee_name), COUNT(*) FROM employees GROUP BY department_id; ``` 这种方式不仅解决了`ONLY_FULL_GROUP_BY`带来的约束问题,还可能使最终的结果更加简洁明了[^3]。 #### 方法三:调整SQL_MODE禁用ONLY_FULL_GROUP_BY 如果不希望受到如此严格的规定限制,在不影响数据库安全性和逻辑正确性的前提下,可以选择修改服务器配置文件(`my.cnf`)或是运行期间动态更改当前会话/全局级别的`sql_mode`设置,去掉其中的`ONLY_FULL_GROUP_BY`项。 ```bash SET GLOBAL sql_mode=(SELECT REPLACE(@@sql_mode,'ONLY_FULL_GROUP_BY','')); ``` 不过需要注意的是,这种做法可能会带来潜在的数据一致性风险,并且不一定适用于生产环境下的最佳实践。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值