我的情况有点复杂。
我在一台较旧的 Centos Stream 8 机器上安装了较旧版本的 PostgreSQL 12.9。在系统下创建了大约五个自定义数据库,例如 database1、ozssc、database5,它们由不同的角色拥有,用于处理不同的业务应用程序。
由于我们的业务应用程序最近进行了更新,我们也计划更新数据库。
另外有一台较新的机器,设置了CentOS Stream 9,并在较新的机器上安装了PostgreSQL 15.2。
首先,我们尝试使用较新的机器上的较新版本(15.2)命令 pg_dump 转储所有数据库模式和数据:
pg_dump -h 10.0.1.105 -p 5433 -U postgres -v -n '*' -N 'pg_toast' -N 'information_schema' -N 'pg_catalog' $DB -Ft -f ${bkp_path}/${DB}_schema_bkp_${date}.tar
这将转储 5 个 XXX.tar 文件
然后我尝试将其恢复(使用相同版本(15.2)的 pg_restore)到我的新机器(Centos Stream 9)
pg_restore -h 10.0.1.103 -p 5433 -U postgres -w -d $db_name $db_tar_file
运行这些命令,系统响应错误为:
pg_restore: error: could not execute query: ERROR: unacceptable schema name "pg_temp_1"
DETAIL: The prefix "pg_" is reserved for system schemas.
Command was: CREATE SCHEMA pg_temp_1;
结果,很多数据库设置也是不正确的:
pg_restore 无法从转储的 SQL 语句中设置正确的数据库所有者。例如,数据库 ozssc 中的 SQL 语句为:
CREATE DATABASE ozssc WITH TEMPLATE = template0 ENCODING = 'UTF8' LOCALE_PROVIDER = libc LOCALE = 'en_AU.UTF-8';
ALTER DATABASE ozssc OWNER TO tomcat;
这些语句将把数据库 ozssc 所有者更改为 tomcat。
恢复后,我检查数据库 ozssc 的所有者;它仍然是 PostgreSQL,而不是 tomcat。
另一个重大错误是 pg_dump 似乎没有转储任何扩展。例如,原始数据库 ozssc 中还有大约三个其他扩展,例如 cutest、cube 和 earth distance,但我在转储的 sql 语句中找不到任何内容。
由于这个操作(pg_dump/restore)失败了,我尝试寻找 pg_upgrade,但很不幸。我发现 pg_upgrade 只支持通过不同的安装目录对某些主机进行升级。
有人可以建议:我们如何使用 pg_upgrade 通过网络而不是在同一主机上将 PostgreSQL 12 迁移到 15?