我尝试在 Debian 系统上将 PostgreSQL 从 11 升级到 13,但失败了。我有一个需要升级的集群:
\n$ sudo -u postgres pg_lsclusters\nVer Cluster Port Status Owner Data directory Log file\n11 main 5432 online postgres /var/lib/postgresql/11/main /var/log/postgresql/postgresql-11-main.log\nRun Code Online (Sandbox Code Playgroud)\n这是我尝试升级的方法:
\n$ sudo -u postgres pg_upgradecluster 11 main\nStopping old cluster...\nWarning: stopping the cluster using pg_ctlcluster will mark the systemd unit as failed. Consider using systemctl:\n sudo systemctl stop postgresql@11-main\nRestarting old cluster with restricted connections...\nNotice: extra pg_ctl/postgres options given, bypassing systemctl for start operation\nError: cluster configuration already exists\nError: Could not create target cluster\nRun Code Online (Sandbox Code Playgroud)\n此后,系统将处于不可用状态:
\n$ sudo systemctl status postgresql@11-main.service \n\xe2\x97\x8f postgresql@11-main.service - PostgreSQL Cluster 11-main\n Loaded: loaded (/lib/systemd/system/postgresql@.service; enabled-runtime; vendor preset: enabled)\n Active: failed (Result: exit-code) since Tue 2022-06-14 06:48:20 CEST; 19s ago\n Process: 597 ExecStart=/usr/bin/pg_ctlcluster --skip-systemctl-redirect 11-main start (code=exited, status=0/SUCCE>\n Process: 4508 ExecStop=/usr/bin/pg_ctlcluster --skip-systemctl-redirect -m fast 11-main stop (code=exited, status=>\n Main PID: 684 (code=exited, status=0/SUCCESS)\n CPU: 1.862s\n\nJun 14 06:47:23 argos systemd[1]: Starting PostgreSQL Cluster 11-main...\nJun 14 06:47:27 argos systemd[1]: Started PostgreSQL Cluster 11-main.\nJun 14 06:48:20 argos postgresql@11-main[4508]: Cluster is not running.\nJun 14 06:48:20 argos systemd[1]: postgresql@11-main.service: Control process exited, code=exited, status=2/INVALIDARG>\nJun 14 06:48:20 argos systemd[1]: postgresql@11-main.service: Failed with result 'exit-code'.\nJun 14 06:48:20 argos systemd[1]: postgresql@11-main.service: Consumed 1.862s CPU time.\n\n$ sudo systemctl start postgresql@11-main.service \nJob for postgresql@11-main.service failed because the service did not take the steps required by its unit configuration.\nSee "systemctl status postgresql@11-main.service" and "journalctl -xe" for details.\nRun Code Online (Sandbox Code Playgroud)\n幸运的是,重新启动系统使旧集群重新上线,但没有任何升级。为什么升级失败?“其单元配置所需的步骤”是什么?如何以最短的停机时间升级 PostgreSQL?
\nhed*_*gie 21
我找到了问题的根源:错误的用户(root而不是postgres)拥有的配置文件无法通过pg_dropcluster命令删除,因为我以用户身份运行它postgres。
为了供将来参考,以下是将 PostgreSQL 集群从 11 升级到 13 的正确步骤:
验证当前集群是否仍然是旧版本:
$ pg_lsclusters
Ver Cluster Port Status Owner Data directory Log file
11 main 5432 online postgres /var/lib/postgresql/11/main /var/log/postgresql/postgresql-11-main.log
13 main 5434 down postgres /var/lib/postgresql/13/main /var/log/postgresql/postgresql-13-main.log
Run Code Online (Sandbox Code Playgroud)
pg_dropcluster 13 main以用户身份运行postgres:
$ sudo -u postgres pg_dropcluster 13 main
Warning: systemd was not informed about the removed cluster yet.
Operations like "service postgresql start" might fail. To fix, run:
sudo systemctl daemon-reload
Run Code Online (Sandbox Code Playgroud)
pg_upgradecluster以用户身份运行命令postgres:
$ sudo -u postgres pg_upgradecluster 11 main
Run Code Online (Sandbox Code Playgroud)
验证一切正常,并且唯一的在线集群现在是 13:
$ pg_lsclusters
Ver Cluster Port Status Owner Data directory Log file
11 main 5434 down postgres /var/lib/postgresql/11/main /var/log/postgresql/postgresql-11-main.log
13 main 5432 online postgres /var/lib/postgresql/13/main /var/log/postgresql/postgresql-13-main.log
Run Code Online (Sandbox Code Playgroud)
删除旧集群:
$ sudo -u postgres pg_dropcluster 11 main
Run Code Online (Sandbox Code Playgroud)
卸载以前版本的 PostgreSQL:
$ sudo apt remove 'postgresql*11'
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
9042 次 |
| 最近记录: |