如何完美地停止所有 postgres 进程

如何完美地停止所有 postgres 进程

pg_ctl当您不记得数据库目录是什么,也没有定义 PGDATA 环境变量时,如何使用(或以其他方式)很好地停止所有 postgres 进程?

答案1

可以安全地执行以下操作:

sudo pkill -u postgres

这将终止以用户身份运行的所有进程postgres。或者:

pkill postgres

这将终止所有名为“postgres”的进程。

不是使用kill -9( kill -KILL)。只需kill(不带选项)执行SIGTERM,这就是您想要的。

或者,如果您可以连接到 PostgreSQL,则可以检查 pgdata 位置。例如:

sudo -u postgres psql -c "SHOW data_directory";

...或者通过检查 中的环境变量,在其中使用 来标识 postmaster 。查找其他进程的父进程。例如:/proc/[postmaster pid]/environps -fHC postgrespostgres

postgres   794     1  0 Nov06 ?        00:00:03 /usr/pgsql-9.3/bin/postgres -D /var/lib/pgsql/9.3/data -p 5432
postgres   857   794  0 Nov06 ?        00:00:00   postgres: logger process   
postgres   871   794  0 Nov06 ?        00:00:00   postgres: checkpointer process   
postgres   872   794  0 Nov06 ?        00:00:00   postgres: writer process   
postgres   873   794  0 Nov06 ?        00:00:00   postgres: wal writer process   
postgres   874   794  0 Nov06 ?        00:00:03   postgres: autovacuum launcher process   
postgres   875   794  0 Nov06 ?        00:00:07   postgres: stats collector process   

其数据目录通常会显示在其命令行上。

答案2

看到 kill 和 postgres 出现在同一个命令中,我感到很紧张。如果只使用 来回答这个问题pg_ctl,那么答案将是:

pg_ctl -D $(psql -Xtc 'show data_directory') stop

-X 参数表示忽略该.psqlrc文件。如果您已将 psql 配置为发出查询所用的时间(通过 \timing 命令),则此功能很有用。

-t 参数表示删除输出顶部的列名和生成的总行数。

-c 参数包含要执行的 SQL 代码。

运行裸机psql -c 'show data_directory'可能会产生以下输出:

      data_directory
--------------------------
 /path/to/postgresql/data
(1 row)

因此,通过反引号$( ... )将此传递/path/to/postgresql/data给 pg_ctl 的 -D 参数,然后以有序的方式停止数据库。

答案3

这对我有用。https://stackoverflow.com/a/5408501/248616

SELECT pg_terminate_backend(pid) FROM pg_stat_activity WHERE datname = 'YOUR_NAME';

答案4

你可以简单地运行命令

systemctl stop postgresql

当你想重新启动它时运行

systemctl start postgresql
  • 这些命令可能需要你附加sudo

相关内容