一、升级脚本编写
openGauss开发中涉及新增或修改系统函数、系统表等系统对象时需要新增或修改升级回滚脚本,以确保新增特性功能在升级场景中同样支持。
openGauss升级脚本位于src/include/catalog/upgrade_sql/目录下,一共有八类脚本:
rollback_catalog_maindb
rollback-post_catalog_maindb
rollback_catalog_otherdb
rollback-post_catalog_otherdb
upgrade_catalog_maindb
upgrade-post_catalog_maindb
upgrade_catalog_otherdb
upgrade-post_catalog_otherdb
其中rollback代表回滚脚本,upgrade代表升级脚本,回滚和升级脚本成对出现。maindb代表主数据库,即postgres,otherdb代表主数据库以外的其他数据库,maindb脚本和otherdb脚本也成对出现。-post脚本代表后置脚本,在升级后的数据库上执行,不带-post的脚本为前置脚本,前置脚本在升级前的数据库实例上执行,由于数据是同一份,前置脚本和后置脚本只需要写一种,升级后的数据库有更新的代码,通常推荐写后置脚本。
脚本后面带的数字是版本号,如果是修改升级脚本,且当时的版本还没有发布到外部,则可以直接修改当时的升级脚本而不用新增版本号。如果当时的版本已经发布或者是需要新增升级脚本,则需要在globals.cpp中对主版本号GRAND_VERSION_NUM加1,以此作为新增升级脚本的后缀。
升级脚本中的SQL语句创建的对象的元数据须跟直装时的元数据一致。例如新建函数,各项元数据需要跟builtin_funcs.ini中直装的系统函数的属性一致,比如oid、prostrict、provolatile、函数描述等属性。
二、升级验证
验证升级,需要先使用企业版安装的方式安装低版本数据库,企业版安装步骤可参考官方文档https://docs.opengauss.org/zh/docs/latest/docs/InstallationGuide/%E4%BC%81%E4%B8%9A%E7%89%88%E5%AE%89%E8%A3%85.html 。
开发的升级包需要自己打包,打包命令:
sh build.sh -m debug -3rd $BINARYLIBS -pkg
但server仓打包没有OM等工具,所以还需要去OM仓打包,或者使用社区官网上同版本已发布的OM包。一个简便的方法是下载官网的企业版完整包,解压后将自己打包好的开发包拷贝到解压目录,覆盖server包。
注意需要拷贝全部打包好的文件,升级回滚脚本在upgrade_sql压缩包中,sha256文件同样需要用于校验对应包的完整性。
升级步骤参考官网文档:https://docs.opengauss.org/zh/docs/latest/docs/DatabaseOMGuide/%E5%8D%87%E7%BA%A7%E6%B5%81%E7%A8%8B.html 。强烈建议安装和升级时均分离环境文件,避免环境变量混乱。分离环境预安装后需要source分离出来的环境文件。升级时使用与安装时相同的xml配置文件和envfile环境分离文件。
验证升级前,建议先在安装好的数据库中创建一个B兼容性数据库,以验证otherdb脚本和B兼容性。
注意升级时系统会将upgrade_mode设置为1 或2,写进postgresql.conf文件,在提交升级或回滚后才会设为0。upgrade_mode为非0时,创建b库时dolphin插件不会自动创建。
三、问题定位
升级或回滚时如遇sql脚本执行错误,根据报错的脚本是maindb还是otherdb,进入对应数据库,执行
alter system set upgrade_mode to 2;
set isinplaceupgrade to on;
可以绕过正常情况下无法操作系统对象的限制,再执行报错的sql语句进行复现、分析、debug等操作。也可以通过这种方式在开发环境数据库中测试升级sql。
四、常见问题:
1. 从报错信息看是无法获取guc参数,原因通常是:
升级前需要先登录数据库修改密码,openGauss 1.X.X版本在企业版安装后会要求先改密码,2.0及以后的版本不需要。
数据库未启动。升级时要保证数据库处于正常运行状态。
2.
可能原因:
环境变量未分离,GAUSSHOME指向了其他数据库实例
重装时未清理文件目录
点击阅读原文跳转作者文章
本文分享自微信公众号 - openGauss(openGauss)。
如有侵权,请联系 support@oschina.cn 删除。
本文参与“OSC源创计划”,欢迎正在阅读的你也加入,一起分享。