我们已将RDS数据库从MariaDB 10.2升级到10.6(LTS版本),从那时起,我们开始注意到查询被阻止的一些问题,这些查询将锁定表,这将导致更多的查询被阻止。
即使我更改了一些默认变量(如connect_timeout
),查询也不会停止运行。
在达到7200之后,查询将被数据库本身删除(状态更改为KILLED),但它们仍将显示为
show full processlist;
即使手动终止查询也不起作用,只有状态更改为KILLED,但连接仍将打开:
结果,连接数增加,我们唯一的选择是重新启动数据库,有时数据库本身会在达到800个打开的连接后停止响应...
重新启动数据库将需要15分钟,我们不能一直重新启动它来杀死打开的连接!
以下是show global status;
的输出
重新启动数据库之前的值(我们有很多阻塞的打开连接)https://pastebin.com/dz70FXBJ
重新启动后的值,一切都应稳定:https://pastebin.com/C061EAY3
1条答案
按热度按时间pjngdqdw1#
我最近完成了相同的MariaDB版本更新(从10.2到10.6),遇到了严重的性能问题。
在调查之后,我还注意到许多查询长时间(甚至无限期地)停留在“统计”状态,消耗了所有可用的CPU能力。
在我们的例子中,问题出在
optimizer_search_depth
变量上,它导致查询引擎花费指数级的时间来产生查询计划,这取决于查询所具有的连接的数量。变量的默认值在版本之间没有改变(它是62),但是查询优化逻辑可能已经改变,从而导致速度变慢。将变量值更改为0解决了该问题。
描述问题和解决方案的博客文章:https://conetix.com.au/support/slow-mariadb-sql-queries-in-statistics-state/
MariaDB文档中描述的
optimizer_search_depth
变量:https://mariadb.com/docs/reference/mdb/system-variables/optimizer_search_depth/