在 PostgreSQL 12 上使用单个 CLI 命令终止所有打开的连接

Terminate all open connections using single CLI command on PostgreSQL 12

我有这样的 CLI 命令:

$ psql -U postgres < <(psql -U postgres -Atc "select 'SELECT pg_terminate_backend(pid) 
    FROM pg_stat_activity WHERE datname = \''||datname||'\'; /* I WILL ADD MORE QUERIES HERE LATER. */
    'from pg_database where 
    datistemplate=false AND datname != 'postgres';")

实际结果:

ERROR:  syntax error at or near "\"
LINE 2: FROM pg_stat_activity WHERE datname = \''||datname||'\';
                                                             ^

预期结果:

WHERE datname = 'database_name'
-- instead of
WHERE datname = \''||datname||'\'

这将为每个找到的数据库实例打印并回显到 psql。但是,datname 未正确填充。是因为'(转义?)。如何在此 CLI 命令中 终止与 postgres 以外的数据库的打开连接 修复此命令?为什么我不能在此处填充 ||datname||

目标:

我的目标是断开与 postgres 数据库以外的所有数据库的所有连接(如果有的话)。但是在 CLI/Bash 中执行此操作。不是通过登录 sudo -u postgres。我想仅通过 CLI 断开所有连接。我将在 CI/CD 系统中使用它,因此无法进行用户交互。

您的单引号不需要受到 shell 的保护,因为它们已经在双引号内。为了保护它们免受 psql 的影响,您将它们加倍,而不是 back-whack 它们。所以

psql -U postgres < <(psql -U postgres -Atc "select 'SELECT pg_terminate_backend(pid) 
    FROM pg_stat_activity WHERE datname = '''||datname||'''; /* I WILL ADD MORE QUERIES HERE LATER. */
    'from pg_database where 
    datistemplate=false AND datname != 'postgres';")

但是您可以使用 \gexec 来改善这一点,只需要一个 psql 调用而不是两个。