项目数据库要从 MySQL 切换到 Greenplum 问题最多的就是 SQL 语法不同,MySQL有on duplicate key update
实现冲突更新,Greenplum却没有。
PostgreSQL 9.5 引入了 UPSET 功能,其语法insert on conflict do
非常强大,支持合并写入(当违反某唯一约束时,冲突则更新,不冲突则写入),同时支持流式计算。
当前使用的 Greenplum 数据库版本为6.13.0其 PostgreSQL 版本为 9.4.24无法使用 UPSERT 语法:
# select version();
PostgreSQL 9.4.24
(Greenplum Database 6.13.0 build commit:4f1adf8e247a9685c19ea02bcaddfdc200937ecd Open Source)
on x86_64-unknown-linux-gnu, compiled by gcc (GCC) 6.4.0, 64-bit compiled on Dec 18 2020 22:31:16
遗憾的是20220408发布的最新版本6.20.3依然是9.4
PostgreSQL 9.4.26
(Greenplum Database 6.20.3 build commit:24b949d2585cdbe8a157062fb756013e7c2874ab Open Source)
on x86_64-unknown-linux-gnu, compiled by gcc (GCC) 6.4.0, 64-bit compiled on Apr 6 2022 19:59:57
最终通过代码实现了replace insert或insert on conflict类似on duplicate key update批量入库数据(合并插入无则新增有则更新)的操作,代码可查看《Greenplum 代码 01》。
PostgreSQL 9.5 的合并似乎要等到 Greenplum7.0,20220714发布了最新版本6.21.0,这里进行一次数据库升级操作,同时也验证一下内核版本。
# 0.首先要停掉当前数据库
gpstop -M fast
# 1.安装(默认安装到/usr/local)目录下
yum install -y ./open-source-greenplum-db-6.21.0-rhel7-x86_64.rpm
报错与之前的版本冲突了:
No package matched to upgrade: open-source-greenplum-db-6
--> Finished Dependency Resolution
Error: open-source-greenplum-db-6 conflicts with greenplum-db-6-6.13.0-1.el7.x86_64
You could try using --skip-broken to work around the problem
You could try running: rpm -Va --nofiles --nodigest
# 使用 rpm 安装 添加 --nodeps 表示不含依赖
rpm -ivh open-source-greenplum-db-6.21.0-rhel7-x86_64.rpm --nodeps
# 安装过程
Preparing... ################################# [100%]
Updating / installing...
1:open-source-greenplum-db-6-6.21.0################################# [100%]
# 2.赋权给 gpadmim
chown -R gpadmin:gpadmin /usr/local/greenplum*
# 重建软连接
rm -rf /usr/local/greenplum-db
ln -s /usr/local/greenplum-db-6.21.0 /usr/local/greenplum-db
# 修改软连接
ln –snf /usr/local/greenplum-db-6.21.0 /usr/local/greenplum-db
# 启动
gpstart -a
# select version();
PostgreSQL 9.4.26
(Greenplum Database 6.21.0 build commit:d0087e3b24c54d203ca8bb315559205f13cd6393 Open Source)
on x86_64-unknown-linux-gnu, compiled by gcc (GCC) 6.4.0, 64-bit compiled on Jun 10 2022 01:57:17
数据库启动成功,版本也升级到了6.21.0
当然内核版本依然是9.4.26
。这个是小版本的升级,大版本的升级有可能要重新初始化数据库。