mysql 常用语句 Lock wait timeout exceeded;

SHOW PROCESSLIST;
SHOW FULL PROCESSLIST;
-- 查看线程创建的情况


`
SHOW STATUS LIKE 'Threads%';

-- 查看哪些事务耗时
SELECT 
    trx_id,
    trx_state,
    trx_started,
    TIMESTAMPDIFF(SECOND, trx_started, NOW()) AS duration_sec,
    trx_rows_modified,
    trx_query
FROM information_schema.INNODB_TRX
WHERE TIMESTAMPDIFF(SECOND, trx_started, NOW()) > 30; -- 查询超过60秒的事务


SELECT 
    trx_id,
    trx_state,
    trx_started,
    trx_mysql_thread_id AS thread_id,
    trx_query AS query
FROM information_schema.INNODB_TRX;

查看指定终端的连接数

SELECT *
FROM INFORMATION_SCHEMA.PROCESSLIST where DB='zx_wms'

一、查询缓存(Query Cache)使用情况
查询缓存会存储 SELECT 语句的结果,当相同查询再次执行时直接返回缓存结果,无需重新执行。

  1. 检查查询缓存是否启用
    sql
    SHOW VARIABLES LIKE 'have_query_cache'; -- 应显示 YES
    SHOW VARIABLES LIKE 'query_cache_type'; -- ON 表示启用,DEMAND 表示按需启用
    SHOW VARIABLES LIKE 'query_cache_size'; -- 缓存总大小(字节)
  2. 查看缓存状态指标
    sql
    SHOW STATUS LIKE 'Qcache%';

关键指标:
Qcache_hits:缓存命中次数(直接使用缓存结果的查询数)。
Qcache_inserts:缓存插入次数(新查询结果被加入缓存的次数)。
Qcache_not_cached:未被缓存的查询数(如包含不确定函数、子查询的查询)。
Qcache_queries_in_cache:当前缓存中存储的查询数量。
Qcache_free_memory:缓存剩余空闲内存(字节)。
3. 计算缓存命中率
sql
SELECT
(Qcache_hits / (Qcache_hits + Qcache_inserts)) * 100 AS hit_rate_percentage
FROM information_schema.GLOBAL_STATUS;

理想命中率:通常建议达到 80% 以上,若过低可能需要优化查询或调整缓存配置。

  1. 错误:"MySQL server has gone away"
    当应用程序长时间空闲后,再次执行 SQL 时可能报错。这是因为连接已被 MySQL 关闭,但应用程序仍在使用它。
    解决方法:
    缩短 wait_timeout(如 1800 秒),并在应用程序中实现连接池的健康检查。
    使用连接池的 testOnBorrow 或 keepAlive 功能,定期验证连接有效性。

  2. 高并发场景下的连接资源浪费
    过长的 wait_timeout 会导致大量空闲连接占用内存,影响性能。
    优化建议:
    将 wait_timeout 设置为合理值(如 300-1800 秒),平衡资源利用和应用稳定性。
    监控 Threads_connected 状态变量,确保连接数在合理范围:
    sql
    SHOW GLOBAL STATUS LIKE 'Threads_connected';

  3. 与应用程序的连接池配合
    应用程序(如 Java 的 HikariCP、Python 的 SQLAlchemy)通常有自己的连接池配置,需与 wait_timeout 协调:
    连接池的 maxIdleTime 应小于 wait_timeout,避免连接被 MySQL 提前关闭。
    开启连接池的 connectionTestQuery(如 SELECT 1),定期检查连接有效性。
    七、监控与验证

  4. 查看当前空闲连接数
    sql
    SHOW PROCESSLIST;
    检查状态为 Sleep 的连接数量,过多可能表示 wait_timeout 过长。

  5. 统计连接超时关闭次数
    sql
    SHOW GLOBAL STATUS LIKE 'Aborted_connects';
    SHOW GLOBAL STATUS LIKE 'Aborted_clients';
    Aborted_clients 增加可能表示 wait_timeout 过短或应用程序未正确关闭连接。

https://www.jb51.net/database/2851699l5.htm

https://blog.csdn.net/zcm036200/article/details/121495273

posted @ 2023-11-18 23:54  方东信  阅读(35)  评论(0)    收藏  举报