【问题现象】
系统中部分查询语句运行时间过长。
【可能原因】
查询语句较为复杂,需要长时间运行。
查询语句阻塞。
【解决办法】
查询语句较为复杂,需要长时间运行。
查询语句阻塞。
gsql -d postgres -p 8000postgres为需要连接的数据库名称,8000为端口号。
查看系统中长时间运行的查询语句。
SELECT timestampdiff(minutes, query_start, current_timestamp) AS runtime, datname, usename, query FROM pg_stat_activity WHERE state != 'idle' ORDER BY 1 desc;查询会返回按执行时间长短从大到小排列的查询语句列表。第一条结果就是当前系统中执行时间长的查询语句。
如果当前系统较为繁忙,可以使用TIMESTAMPDIFF函数通过限制current_timestamp和query_start大于某一阈值查看执行时间超过此阈值的查询语句。timestampdiff的第一个参数为时间差单位。例如,执行超过2分钟的查询语句可以通过如下语句查询。
SELECT query FROM pg_stat_activity WHERE timestampdiff(minutes, query_start, current_timestamp) > 2;分析长时间运行的查询语句状态。
- 如果查询语句处于正常状态,则等待其执行完毕。
- 如果查询语句阻塞,请执行步骤5-步骤8。
- 以操作系统用户omm登录主机。
- 使用如下命令连接数据库。
gsql -d postgres -p 8000postgres为需要连接的数据库名称,8000为端口号。
从当前活动会话视图查找问题会话的线程ID。
SELECT w.query AS waiting_query, w.pid AS w_pid, w.usename AS w_user, l.query AS locking_query, l.pid AS l_pid, l.usename AS l_user, t.schemaname || '.' || t.relname AS tablename FROM pg_stat_activity w JOIN pg_locks l1 ON w.pid = l1.pid AND NOT l1.granted JOIN pg_locks l2 ON l1.relation = l2.relation AND l2.granted JOIN pg_stat_activity l ON l2.pid = l.pid JOIN pg_stat_user_tables t ON l1.relation = t.relid WHERE w.waiting = true;根据线程ID结束会话。
SELECT pg_terminate_backend(139834762094352);显示类似如下信息,表示结束会话成功。
pg_terminate_backend --------------------- t (1 row)显示类似如下信息,表示用户正在尝试结束当前会话,此时仅会重连会话,而不是结束会话。
FATAL: terminating connection due to administrator command FATAL: terminating connection due to administrator command The connection to the server was lost. Attempting reset: Succeeded.
「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。




