执行 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 &lt;id&gt;

【讨论】:

谢谢,您知道如何通过 CLI 运行 psql 查询吗?取消长时间运行的 psql 查询会很有用【参考方案3】:

对于 Redshift,它是 select * from stv_recents where status='Running',您可以从那里获得 pid

【讨论】:

谢谢 我猜情况是可能有很多用户在同一时间进行查询。我希望能够唯一标识在运行 psql CLI 查询时运行的查询 ID 或查询进程 ID 我认为客户端信息没有显示在那里,但如果你愿意并且如果 psql 是在特定用户下连接的,你可以通过用户 ID 过滤它

以上是关于执行 psql/mysql CLI 命令行后如何获取查询 ID?的主要内容,如果未能解决你的问题,请参考以下文章

进入sqlplus命令行后无法暂停关闭bash文件

从 Angular 9 升级到 Angular 10 时遇到问题

使用红移插入行后获取主键

如何进入cisco路由器配置模式

Redis停止的命令

如何使用命令重命名@Angular/cli 创建的服务