错误记录

“pg_upgrade_internal.log”: Permission denied

  1. C:\WINDOWS\system32>pg_upgrade.exe -b D:\Master\pgsql_64\bin -B f:\DataBase\pgSQL\bin -d D:\Master\pgsql_64\data\agdata -D f:\DataBase\data -k -c
  2. could not open log file "pg_upgrade_internal.log": Permission denied
  3. 故障,退出

原因: pg_upgrade 没有在指定目录下执行,所以需要切换到 postgreSQL/bin 目录下执行

例如,我的目录是f:\DataBase\pgSQL

  1. C:\WINDOWS\system32> f:
  2. f: cd \DataBase\pgSQL\bin>
  3. F:\DataBase\pgSQL\bin>pg_upgrade.exe -b D:\AnalyzeMaster\pgsql_64\bin -B f:\DataBase\pgSQL\bin -d D:\AnalyzeMaster\pgsql_64\data\agdata -D f:\DataBase\data -k -c
  4. 正在执行一致性检查
  5. -----------------------------
  6. Checking cluster versions

fe_sendauth: no password supplied

这是一个最常见文问题。

  1. F:\DataBase\pgSQL\bin>pg_upgrade.exe -b D:\Master\pgsql_64\bin -B f:\DataBase\pgSQL\bin -d D:\Master\pgsql_64\data\agdata -D f:\DataBase\data -k -c
  2. 正在执行一致性检查
  3. -----------------------------
  4. Checking cluster versions ok
  5. 连接到数据库失败: fe_sendauth: no password supplied
  6. ... ...

问题原因:

解决办法:修改原数据库(9.6)中 pg_hba.config 文件配置,具体修改内容如下:

  • 文件路径: 原数据库数据目录
  • 如下图: 蓝色方框为原有设置,我们进行注释,后买你红色框为添加。

PostgreSQL从9.6到13.1 - 图1

lc_collate不匹配

  1. F:\DataBase\pgSQL\bin>pg_upgrade.exe -b D:\Master\pgsql_64\bin -B f:\DataBase\pgSQL\bin -d D:\Master\pgsql_64\data\agdata -D f:\DataBase\data -k -c
  2. 正在执行一致性检查
  3. -----------------------------
  4. Checking cluster versions ok
  5. Checking database user is the install user ok
  6. Checking database connection settings ok
  7. Checking for prepared transactions ok
  8. Checking for reg* data types in user tables ok
  9. Checking for contrib/isn with bigint-passing mismatch ok
  10. Checking for tables WITH OIDS ok
  11. Checking for invalid "sql_identifier" user columns ok
  12. Checking for invalid "unknown" user columns ok
  13. Checking for hash indexes ok
  14. 数据库"postgres"lc_collate不匹配: 旧的 "C", 新的 "en_US.UTF-8"
  15. 故障,退出

原因,这是旧数据的设置选项和新的数据库的 lc_collate不一致,这个是在 initdb 时设置的,旧的我们不能修改,新的我们重新设置。

这里,我们新的服务未启动,直接删除 f:\DataBase\data 下的所有数据,然后再次执行:

  1. F:\DataBase\pgSQL\bin>initdb -E UTF8 -D f:\DataBase\data -U postgres -W --locale=C
  2. 属于此数据库系统的文件宿主为用户 "postgres".
  3. 此用户也必须为服务器进程的宿主.
  4. 数据库簇将使用本地化语言 "C"进行初始化.
  5. 缺省的文本搜索配置将会被设置到"english"
  6. 禁止为数据页生成校验和.
  7. ... ...

新安装中缺少的可加载库

  1. ... ...
  2. Checking for invalid "sql_identifier" user columns ok
  3. Checking for invalid "unknown" user columns ok
  4. Checking for hash indexes ok
  5. Checking for presence of required libraries 致命的
  6. 您的安装引用了新安装中缺少的可加载库。
  7. 您可以将这些库添加到新安装中,或者从旧安装中删除使用它们的函数。
  8. 文件中有问题库列表:
  9. loadable_libraries.txt

我们打开新数据库 bin 目录,查看该文件内容:

PostgreSQL从9.6到13.1 - 图2

我的打开是如下内容:

  1. 无法加载库 "MyFileExtension": ERROR: could not access file "MyFileExtension": No such file or directory
  2. In database: fs6600

这是旧库中一些自定义共享对象文件(或者 DLL),需要拷贝到新库中,所以我需要把原数据库 lib 中的 MyFileExtension 拷贝到新目录下的 f:\DataBase\data\lib 中。

参考文章

Just a moment…

pg_upgrade