MySQL Error number: MY-012674; Symbol: ER_IB_MSG_849; SQLSTATE: HY000 报错 故障修复 远程处理
文档解释
Error number: MY-012674; Symbol: ER_IB_MSG_849; SQLSTATE: HY000
Message: %s
错误说明
MySQL错误ER_IB_MSG_849 代号为MY-012674,SQLSTATE为HY000。这个错误主要是由于在InnoDB表的锁定阶段出现问题,被InnoDB引擎发现而导致的。在SELECT语句上使用FOR UPDATE这个MySQL语句,需要创建表锁,如果出现上述的错误,表示在获取锁的时候出现了问题,由于系统不能满足SELECT FOR UPDATE获取锁的请求,被抛出此异常。
常见案例
常见的案例是,由于数据库服务器出现繁忙,导致数据库忙碌,而且查询请求在尝试锁定表时失败,最后会抛出ER_IB_MSG_849错误。此外,还可能是因为用于持有表锁的活动事务中存在死锁,从而导致ER_IB_MSG_849错误发生。例如:
请求1: BEGIN;SELECT * FROM tbl FOR UPDATE
请求2: BEGIN;SELECT * FROM tbl FOR UPDATE
因为数据库繁忙,请求2先执行,查询tbl后获得表锁,这时如果请求1再次想要获得表锁tbl就会失败,最终会抛出 ER_IB_MSG_849 错误。
解决方法
1. 调整等待超时时间。当发生ER_IB_MSG_849错误时,可以提高系统的等待超时时间,以便执行SELECT FOR UPDATE等待获取表锁更长的时间,解决堵塞的问题。在系统配置中,将参数innodb_lock_wait_timeout的值更改为比默认值更大的值。
2. 显式释放锁定。关于ER_IB_MSG_849错误,原因是SELECT FOR UPDATE的请求未能获得表锁,系统被堵住。所以,如果需要避免这种情况,可以主动释放已经获得的表锁,能够有效地提高数据库服务器的效率。
3. 移除死锁。如果活动事务中存在死锁,会影响系统的整体性能,在发生ER_IB_MSG_849错误时,可以考虑移除可能出现的死锁,解决此类性能问题。