执行 psql/mysql CLI 命令行后如何获取查询 ID?
Posted
技术标签:
【中文标题】执行 psql/mysql CLI 命令行后如何获取查询 ID?【英文标题】:How to get query ID after executing psql/mysql CLI command line? 【发布时间】:2017-10-26 22:08:35 【问题描述】:我正在使用 psql CLI 命令行对 Redshift 进行查询。 (问题也适用于mysql)。查询可能需要很长时间才能执行。发送命令后,是否有可能在它运行时获取该查询的查询 ID,而无需等待它完成。这可能吗?
例如,如果我需要在几小时/几天后中止该查询,我想针对该特定查询向 Redshift 后端发送 CANCEL/ABORT 命令。注意:同一个数据库会被其他人使用,所以我想知道我执行的具体查询的ID。
另外,假设 psql 命令在 shell 中运行。是否可以在应用程序中以编程方式(python)从该 psql CLI 进程中获取查询 ID?
【问题讨论】:
psql
用于 PostGreSQL,而不是 MySQL。
谢谢。我修改它以同时适用于 psql 和 mysql
这能让你找到方向吗? chrismiles.info/systemsadmin/databases/articles/…
谢谢 我猜情况是可能有很多用户在同一时间进行查询。我希望能够在“此”本地计算机上运行时唯一标识运行 psql CLI 查询的查询 ID 或查询进程 ID
【参考方案1】:
在 Amazon Redshift 中,有几种方法可以确定正在运行的查询 -
STV_INFLIGHT - 仅显示当前正在运行的查询 (http://docs.aws.amazon.com/redshift/latest/dg/r_STV_INFLIGHT.html)
select userid, usename, query, pid, starttime, "text",
suspended from stv_inflight s, pg_user u
where s.userid = u.usesysid
STV_RECENTS - 显示当前正在运行和最近完成的查询以及状态 (http://docs.aws.amazon.com/redshift/latest/dg/r_STV_RECENTS.html)
select * from stv_recents;
现在,要中止正在运行的查询,您需要当前正在运行的查询的 pid(进程 ID)。然后,您可以使用以下命令之一终止查询 -
select pg_cancel_backend(<pid>); OR
select pg_terminate_backend(<pid>) ; OR
cancel <pid>;
查询#2
select userid, usename, query, s.pid, c.remotehost, c.application_name,
starttime, "text",
suspended from stv_inflight s, stl_connection_log c, pg_user u
where s.userid = u.usesysid and s.pid = c.pid
【讨论】:
谢谢。你知道我如何获取通过 psql 命令行运行的查询的查询 ID 或查询进程 ID 吗? 谢谢 我猜情况是可能有很多用户在同一时间进行查询。我希望能够唯一标识在运行 psql CLI 查询时运行的查询 ID 或查询进程 ID 我认为没有直接的方法可以从连接中识别“application_name”。尽管“stl_connection_log”表中有一个名为 application_name 的列,但我在任何时候都没有看到该列中的任何值(可能它只是供内部使用)。但是,如果您知道应该运行 psql cli 的机器的 IP 地址,则可以使用 query#2(现在在上面添加)识别来自这些机器的会话【参考方案2】:在mysql中你可以运行select connection_id()
在运行查询之前获取当前连接的连接ID。然后,您可以在启动长时间运行的查询后从另一个连接运行 kill <id>
。
【讨论】:
谢谢,您知道如何通过 CLI 运行 psql 查询吗?取消长时间运行的 psql 查询会很有用【参考方案3】:对于 Redshift,它是 select * from stv_recents where status='Running'
,您可以从那里获得 pid
【讨论】:
谢谢 我猜情况是可能有很多用户在同一时间进行查询。我希望能够唯一标识在运行 psql CLI 查询时运行的查询 ID 或查询进程 ID 我认为客户端信息没有显示在那里,但如果你愿意并且如果 psql 是在特定用户下连接的,你可以通过用户 ID 过滤它以上是关于执行 psql/mysql CLI 命令行后如何获取查询 ID?的主要内容,如果未能解决你的问题,请参考以下文章