MySQL AWS 记录锁定超时未出现在慢查询日志中?

MySQL AWS Record Locking Timeout not appearing in Slow Query Log?

提问人:Floobinator 提问时间:11/7/2023 最后编辑:Floobinator 更新时间:11/9/2023 访问量:45

问:

更新于 11.09.2023

我们有一个庞大的数据库,其中包含大约 200,000 行代码,并带有托管在 AWS 上的只读副本。问题是我们偶尔会遇到我似乎无法追踪的死锁超时错误。此错误“呈现”为错误。我相信一个子过程导致了超时死锁,这就是为什么主过程丢失其保存点(旨在在发生错误时回滚到)的原因。显然,子过程的死锁超时会擦除保存点......SAVEPOINT does not exist

我们打开了慢速日志,日志中没有任何内容指示任何相关时间或其他任何内容的记录锁定。整个事情相当令人沮丧。

当然,这发生在我睡着的时候,所以我无法查询 or 表。然而,它是如此随机,当我们知道它正在发生时,我们几乎永远不会抓住它。data_locksdata_lock_waits

请注意,我们的后端系统确实会重用打开的连接,而不是在完成所有操作后关闭它们。我相信这个问题与连接的重用有关 - 但实际上这应该没问题,因为我们的系统旨在允许后端在任何时间使用任何连接进行“核心”过程调用。

下面是主数据库和等待的快照。我发现有趣的是,最大的等待是与 RR 同步的BIN_LOG。

Main Database

可悲的是,除此之外,我们没有什么可继续的。如前所述,慢速日志没有任何可用内容;最高锁定时间值为:00:00:00.000035

在许多方面,这是没有意义的。我知道我们的查询锁定时间比这更长。也许问题是锁定的那些不慢?有我需要调整的设置吗?

任何关于追踪此事的建议将不胜感激。


所以我尝试了慢速日志方法,没有开玩笑;我的锁定时间都没有超过 0.046564。即使慢日志设置为 0...是的,确实发生了超时......所以我正在尝试一种不同的技术;一个事件监控系统,可以监视sys.innodb_lock_waits,当有记录时,我会存储数据以供查看。我们今天正在测试它。我会让大家知道它是怎么回事。


死锁错误再次发生,但我的事件监视器每 5 秒运行一次以检查锁定等待,但未返回任何内容,这告诉我死锁立即返回而不是“超时”。这可能吗?我以为所有的僵局都会超时......

SQL 代码为:

SELECT
    JSON_ARRAYAGG(JSON_OBJECT
    (
      'waiting_trx_id',waiting_trx_id,
      'waiting_pid',waiting_pid,
      'waiting_query',waiting_query,
      'blocking_trx_id', blocking_trx_id,
      'blocking_pid', blocking_pid,
      'blocking_query', blocking_query
    ))
INTO
    json_results
FROM 
    sys.innodb_lock_waits;
mysql amazon-web-services 错误处理 amazon-rds mysql-slow-query-log

评论

0赞 Wilson Hauck 11/7/2023
请提供其他数据库信息请求。AWS 实例类型?MySQL主机服务器上是否有任何SSD或NVME设备?在 justpaste.it 上发布 TEXT 数据并分享链接。从您的 SSH 登录根目录中,文本结果如下: A) 从 information_schema.tables 中选择 COUNT(*);B) 显示全球状态;至少 24 小时后正常运行时间 C) 显示全局变量;D) 显示完整的流程列表;E) 状态;不是 SHOW STATUS,只是 STATUS;G) 显示发动机 INNODB 状态;用于服务器工作负载优化分析,为运行缓慢的查询日志提供建议。
2赞 Bill Karwin 11/7/2023
MySQL不会记录长时间锁定的查询。它仅记录较长执行时间的查询,该时间与锁定时间分开计算。若要获取所有查询,必须临时设置(确保在获取所需信息后将该值还原为非零值,否则日志将变得太大)。long_query_time=0
0赞 Wilson Hauck 11/8/2023
@Floobinator 我们不会将您的 LOCKOUT 查询放入慢速查询日志中,但我们可以查看设置,以确保您有一个 = 或超过 Long_Query_Time 的慢速查询日志。
0赞 Floobinator 11/8/2023
感谢大家的评论;我更新了上面的问题。威尔逊,如果我的方法失败了,我会提供详细信息。奇怪的是,死锁的查询似乎根本没有显示在慢日志中......
1赞 Wilson Hauck 11/13/2023
@Floobinator 对于所有死锁的记录,参数组设置,A) innodb_deadlock_detect=1(或 ON),)B innodb_print_all_deadlocks=1(或 ON)记录在您的“错误日志”中。选择@@log_output;通常是 FILE。选择@@log_error;作为您将在其中找到错误日志的文件名。您可能需要刷新日志;以确保对日志的写入已完成。SHOW ENGINE INNODB STATUS 仅记录“最新的死锁”——我们已经看到这份报告有几个或数百个死锁——具体取决于最近的活动和系统工作负载。

答: 暂无答案