如何在MySQL数据库中获取session/thread的启动/创建时间
已启用Performance Schema的MySQL社区版获取会话/线程创建时间的方法
- 方法1:直接查询
performance_schema.threads表的THREAD_START_TIME字段
该字段是MySQL 5.7及以上版本提供的线程启动绝对时间戳,精度为秒,不受线程当前运行状态影响,是最准确的查询方式,可通过过滤PROCESSLIST_ID非空的结果排除后台系统线程,仅保留用户创建的会话:
SELECT THREAD_ID, PROCESSLIST_ID AS session_id, PROCESSLIST_USER AS user, PROCESSLIST_HOST AS host, THREAD_START_TIME AS create_time FROM performance_schema.threads WHERE PROCESSLIST_ID IS NOT NULL ORDER BY create_time DESC;
- 方法2:通过线程状态持续时间反向推算
如果使用的是更早的不支持THREAD_START_TIME的版本,可以用PROCESSLIST_TIME字段结合当前时间计算创建时间,该字段记录了线程处于当前状态的秒数:
SELECT PROCESSLIST_ID AS session_id, PROCESSLIST_USER AS user, PROCESSLIST_HOST AS host, NOW() - INTERVAL PROCESSLIST_TIME SECOND AS estimated_create_time FROM performance_schema.threads WHERE PROCESSLIST_ID IS NOT NULL;
注意:该方式仅在线程全程处于空闲(Sleep)状态时计算结果准确,若线程正在执行查询等操作,得到的是当前操作的启动时间而非会话创建时间,仅作为兼容旧版本的备选方案。
- 方法3:查询
information_schema.processlist表推算
该表的TIME字段和performance_schema.threads的PROCESSLIST_TIME字段取值完全一致,适合需要兼容未开启Performance Schema场景的逻辑复用,推算逻辑和方法2相同:
SELECT ID AS session_id, USER, HOST, NOW() - INTERVAL TIME SECOND AS estimated_create_time FROM information_schema.processlist WHERE ID != CONNECTION_ID(); -- 可加该条件过滤当前查询会话本身
内容的提问来源于stack exchange,提问作者Stefan Pastrilov
相关产品推荐
相关产品推荐

