我正在使用此命令在 PostgreSQL 13 中创建索引:
CREATE INDEX dict_word_idx ON dict (word);
但现在 sql 运行超过 12 小时,我不确定 sql 是否仍在工作。我使用这个命令来显示当前正在运行的 sql:
SELECT
procpid,
start,
now() - start AS lap,
current_query
FROM
(SELECT
backendid,
pg_stat_get_backend_pid(S.backendid) AS procpid,
pg_stat_get_backend_activity_start(S.backendid) AS start,
pg_stat_get_backend_activity(S.backendid) AS current_query
FROM
(SELECT pg_stat_get_backend_idset() AS backendid) AS S
) AS S
WHERE
current_query <> '<IDLE>'
ORDER BY
lap DESC;
显示创建索引的结果,如下所示:
1303 2021-10-04 09:24:27 13:12:49.940239 CREATE INDEX dict_word_idx ON dict (word);
但pg_stat_progress_create_index
什么也没显示:
select *
from pg_stat_progress_create_index;
然后我尝试使用这个 sql 来终止创建索引任务:
SELECT pg_cancel_backend(1303);
好像不行,create index命令还站在那里。我应该怎么做才能弄清楚现在发生了什么。SQL 仍然忙于运行,我应该等待吗?不应该像这样杀死 craeted index 命令吗?我应该怎么做才能正确处理这种情况,并且以后不要使数据库失败。
您对当前活动的查询非常过时。自 9.2 起,已完成查询的文本不会更改为“<IDLE>”,它们会继续显示为其原始查询文本。它在那里
state
被更改为“空闲”。因此,您所看到的很可能是索引构建已经完成。