在 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
调用而不是两个。
我有这样的 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
调用而不是两个。