我有一个小开发盒,已升级到 Debian 8.5(以拥有当前的 apache 和 postgres,更好地匹配生产服务器)。现在我有 Postgres 9.1(旧)和 9.4(我想使用):
$ systemctl | grep postgres
postgresql.service loaded active exited PostgreSQL RDBMS
[email protected] loaded failed failed PostgreSQL Cluster 9.1-main
[email protected] loaded active running PostgreSQL Cluster 9.4-main
system-postgresql.slice loaded active active system-postgresql.slice
PostgreSQL 9.4 服务自动设置为在非标准端口 5433 上提供服务,我对此进行了更改;现在当然不可能同时运行两者。我不想运行两个版本;我希望 PostgreSQL 9.4 为我现有的数据库提供服务。
我可以恢复以使我的数据库再次可用,如下所示:
$ systemctl stop [email protected]
$ systemctl start [email protected]
这让我恢复了我的数据库,但当然是使用过时的数据库引擎。
我该如何清理这个烂摊子?我可以卸载版本 9.1 而不会丢失数据吗?或者我应该导出数据库并重新创建它们?系统数据库(postgres
等等)怎么样template1
?
答案1
经过一番挣扎,我发现这是这样的:
- 用于
pg_dumpall
从旧服务中导出数据并将psql
其导入到新服务中; - 使用
pg_upgrade
。
我的建议是:除非您有令人信服的理由不这样做,否则请使用以下pg_dumpall
方法:
- 从旧数据库服务中导出所有内容(如果已安装新版本,则使用新的
pg_dumpall
二进制文件); - 导入新数据库服务中的所有内容。
- 停止旧的数据库服务。
- 确保您对新版本的配置
postgresql.conf
进行了所有更改;pg_hba.conf
如有必要,重新启动新服务。 - 测试您的应用程序是否仍然有效。
- 卸载旧版本。
就我而言(-p <Port>
酌情使用):
sudo -s -u postgres
cd /tmp/
pg_dumpall -p 5433 > all.sql
psql -f all.sql
并作为root
:
systemctl stop [email protected]
vimdiff /etc/postgresql/9.{1,4}/main/postgresql.conf
vimdiff /etc/postgresql/9.{1,4}/main/pg_hba.conf
systemctl restart [email protected]
apt-get remove postgresql-client-9.1 postgresql-9.1
该pg_upgrade
方法要求您找出并指定:
- 新旧数据目录(例如
grep data_directory /etc/postgresql/9.{1,4}/main/postgresql.conf
) - 新旧二进制文件的目录(例如
dpkg --listfiles postgresql-9.1 | grep '/bin$'
) - 您需要从用户
postgres
可以写入的目录开始
...然后它仍然不一定有效(例如参见pg_upgrade 失败并出现未指定的错误)。