如何在容器内停止postgresql server?
我需要在运行的容器中升级postgresql数据库。为此,我需要停止旧服务器,以便启动新服务器。问题是,我没有找到如何停止运行postgres进程的方法,例如systemctl、pg_ctl或服务 pg_控制:如何在容器内停止postgresql server?,postgresql,docker,kubernetes,Postgresql,Docker,Kubernetes,我需要在运行的容器中升级postgresql数据库。为此,我需要停止旧服务器,以便启动新服务器。问题是,我没有找到如何停止运行postgres进程的方法,例如systemctl、pg_ctl或服务 pg_控制: root@postgres-7ffd788bc9-g2dkv:/# su postgres $ pg_ctl status sh: 1: pg_ctl: not found 系统控制: root@postgres-7ffd788bc9-g2dkv:/# systemctl status
root@postgres-7ffd788bc9-g2dkv:/# su postgres
$ pg_ctl status
sh: 1: pg_ctl: not found
系统控制:
root@postgres-7ffd788bc9-g2dkv:/# systemctl status postgresql
bash: systemctl: command not found
服务(不返回任何内容):
postgresql是使用以下kubernetes yaml创建的:
spec:
containers:
- name: postgres
image: postgres:10.4
服务器正在运行:
root@postgres-7ffd788bc9-g2dkv:/# psql postgresql://user:pass@127.0.0.1:5432/postgresdb
psql (12.5 (Debian 12.5-1.pgdg90+1), server 10.4 (Debian 10.4-2.pgdg90+1))
Type "help" for help.
postgresdb=# select VERSION();
version
----------------------------------------------------------------------------------------------------------------------------------
PostgreSQL 10.4 (Debian 10.4-2.pgdg90+1) on x86_64-pc-linux-gnu, compiled by gcc (Debian 6.3.0-18+deb9u1) 6.3.0 20170516, 64-bit
(1 row)
你建议怎么做?停止容器,在yaml中更改版本,然后重建如何?停止容器,在yaml中更改版本,然后重建如何?我最后做的是在Kubernetes中创建一个并行postgres pod,其中保存新版本。然后我从旧服务器转储数据库,将其复制到新服务器,并使用它初始化那里的数据库 以下是一个接一个的步骤:
最后,我在库伯内特斯创建了一个并行的postgres吊舱,其中包含了新版本。然后我从旧服务器转储数据库,将其复制到新服务器,并使用它初始化那里的数据库 以下是一个接一个的步骤:
更改yaml中的版本不起作用,因为数据目录是由PostgreSQL版本10初始化的,该版本与12.5版不兼容。如果您运行
brew PostgreSQL升级数据库
,如回答中所述:我认为来自Lajos的链接可能是解决方案。您需要在data dir上启动升级过程,然后用新版本重新构建容器。我正在尝试在postgres pod中安装brew,但安装脚本需要sudo,而且它在映像中不存在。@justadev您的容器中是否有高度特权的用户?在yaml中更改版本无效,因为数据目录是由PostgreSQL版本10初始化的,这与12.5版不兼容@justadev如果您运行brew postgresql升级数据库
,如回答中所述:我认为Lajos的链接可能是解决方案。您需要在data dir上启动升级过程,然后用新版本重新构建容器。我正在尝试在postgres pod中安装brew,但安装脚本需要sudo,而且它不存在于图像中。@justadev您的容器中是否有高度特权的用户?docker容器通常只执行一项任务。假设您从docker repo获取了默认的Postgres容器,这意味着停止容器等同于停止服务。事实上,如果您使用SSH登录到容器,您可能会发现停止服务会导致容器停止。就像@Marc Salvetti在回答中提到的那样,停止容器并重建。如果容器中有数据(这不是好的做法),则需要首先备份所述数据。docker容器通常只执行一项任务。假设您从docker repo获取了默认的Postgres容器,这意味着停止容器等同于停止服务。事实上,如果您使用SSH登录到容器,您可能会发现停止服务会导致容器停止。就像@Marc Salvetti在回答中提到的那样,停止容器并重建。如果容器中有数据(这不是好的做法),则需要首先备份所述数据。
root@postgres-7ffd788bc9-g2dkv:/# psql postgresql://user:pass@127.0.0.1:5432/postgresdb
psql (12.5 (Debian 12.5-1.pgdg90+1), server 10.4 (Debian 10.4-2.pgdg90+1))
Type "help" for help.
postgresdb=# select VERSION();
version
----------------------------------------------------------------------------------------------------------------------------------
PostgreSQL 10.4 (Debian 10.4-2.pgdg90+1) on x86_64-pc-linux-gnu, compiled by gcc (Debian 6.3.0-18+deb9u1) 6.3.0 20170516, 64-bit
(1 row)
pg_dumpall -U postgresadmin -h localhost -p 5432 > dumpall.sql
kubectl cp postgres-old-pod:/dumpall.sql dumpall.sql
kubectl cp dumpall.sql postgres2-new-pod:/dumpall.sql
psql postgresql://postgresadmin:pass1234@127.0.0.1:5432/postgresdb?sslmode=disable
postgresdb=# CREATE ROLE postgres LOGIN SUPERUSER PASSWORD 'somepassword123';
psql -U postgres -W -f dumpall.sql