PostgreSQL9.6.2升级至PostgreSQL10.4

系统版本:CentOS 6.9 x64 

PostgreSQL9.6.2 安装位置:/data/pgsql/ 

PostgreSQL10.4 安装位置:/data/pgsql10/ 

下载PostgreSQL10.4,编译安装,使用的参数和老的一样,如果不确定当时的参数,可以执行/data/pgsql/bin/pg_config --configure 进行查看。 

编译安装好PG10之后,看下 老的 /data/pgsql/share/extension/都安装了什么插件,PG10也要对应安装下。

PG10进行初始化数据库:

/data/pgsql10/bin/initdb -D /data/pgsql10/data/

新库、老库都关闭。

先执行

/data/pgsql10/bin/pg_upgrade -c -b /data/pgsql/bin/ -B /data/pgsql10/bin/ -d /data/pgsql/data/ -D /data/pgsql10/data/

#会出现一堆检测信息,如果有错误就按照错误进行修复,一切ok之后执行下面的命令
/data/pgsql10/bin/pg_upgrade -k -b /data/pgsql/bin/ -B /data/pgsql10/bin/ -d /data/pgsql/data/ -D /data/pgsql10/data/

只是把 -c 换成了 -k,-c是只检测不升级,-k是采取硬链接模式升级而不是直接复制老文件,这个速度快,375G的数据库升级下25s

 就算加上下面的执行 analyze_new_cluster.sh 命令也就15分钟。 检查完没有问题之后可以执行 delete_old_cluster.sh,删除老的库,由于是做的硬链接,删除老的对新的没有影响。


升级中遇到的一些问题:

  1. hash索引的问题,这个数据库升级后需要重建索引,否则插入数据时会提示 ERROR: index "idx_xxxx_aaaa" has wrong hash version 建议:Please REINDEX it. 我升级前直接把所有的hash索引先删掉,然后升级完再创建。

  2. image.png检测的时候出现这种未知的字段类型,这点PG早就想到了,它自动生成了一个tables_using_unknown.txt的文件,找到对应库.表.字段进行修复即可,我一看都是临时表,果断drop。

  3. 升级后需要回退到老版本的话,只需要把/data/pgsql/data/global/pg_control.old,改成/data/pgsql/data/global/pg_control,然后启动老的数据库即可。

  4. 有条件的话业务程序先测试下对新数据库的支持情况,避免出现因为jdbc等驱动过老不支持新库等问题。

搜索