
ArgoDB 5.2.0 之前的版本升级后(截止 5.1.x 升级至 5.2.0 的过往版本升级),若原系统中存在 PLSQL,则需要对 PLSQL 进行升级。
从 ArgoDB 5.2.0 升级至 ArgoDB 5.2.1 及更高的版本升级,PLSQL 将自动完成升级,即不需要再手动执行 PLUpgrader 脚本进行 PLSQL 升级。 |
ArgoDB 提供 PLSQL 升级工具 PLUpgrader,用以快速进行 PLSQL 的升级。针对升级工具 PLUpgrader,主要包含以下内容:
PLSQL 升级前准备
在对 PLSQL 进行升级前,请逐步进行如下操作:
-
停止 Quark server 角色,但是不要停止 Quark Metastore 服务。
图 63. 停止 Quark server 角色 -
备份 ArgoDB 元数据,具体请参考 KunDB 备份。
若需要进行 PLSQL 升级的集群使用 TxSQL 服务进行元数据管理,请参考 TxSQL 用户数据备份。
方法步骤
下面我们向您介绍使用 PLSQL 升级工具 PLUpgrader 进行 PLSQL 升级的详细步骤:
-
进入 Quark Metastore 对应的 Pod:
-
在集群的任一节点上运行如下命令,查看 Quark Metastore 的 <pod_id>:
kubectl get po | grep quark-metastore
复制返回示例如下:
quark-metastore-quark1-6d87859b44-86vzp 1/1 Running 0 6d14h quark-metastore-quark1-6d87859b44-n2r7j 1/1 Running 0 6d14h
复制 -
然后运行以下命令,进入对于 ID 的 Pod 中(上一步返回结果中的第一列为 <pod_id>):
kubectl exec -it <pod_id> bash
复制进入 pod 中后,默认 5 分钟不操作将会自动退出 pod ,此时不会停止运行中的 PLUpgrader 脚本。
-
-
执行 PLUpgrader 工具进行升级。
脚本位于 Pod 的
/bin/plsql-upgrader.sh
中,使用以下命令执行该脚本:bash /bin/plsql-upgrader.sh oracle
复制-
以上命令的 oracle 是指 PLSQL 使用的方言,也可以根据具体使用的方言替换为 DB2,TD。
-
-
查看升级日志。PLUpgrader 脚本运行的过程中,会自动打印日志目录,一般存放在
/var/log/quark1/update_plsql.log
中,其中会显示升级失败的 PLSQL 实体。如果需要升级的 PLSQL 较多,升级过程会持续较长时间,期间可以运行命令查看进度:
tail -f /var/log/quark1/update_plsql.log
复制 -
升级成功后,会在日志
update_plsql.log
中看到 “plsqlTool completed”字样,以及 “PLSQL UPGRADE FAILED CASES REPORT”。其中失败的 case 需要手工干预,可能是方言问题,可能是存储过程依赖的某些表或者函数不存在,导致无法自动编译。
-
重启 Quark 服务。
常见问题处理
-
问题:PLUpgrader 执行报错找不到数据库
该问题在 ArgoDB 3.1 和 ArgoDB 3.2 版本中可能发生。
解决方法:在运行 PLUpgrader 工具前,增加一项配置,具体操作步骤如下:
-
找到 Quark 的 hive-site.xml 配置文件,一般位于
/etc/service_name/conf/hive-site.xml
,在配置文件中增加ngmr.metacache.level = none
的配置,示例如下:... <configuration> ... <property> <name>ngmr.metacache.level</name> <value>none</value> </property> ... </configuration>
复制 -
然后按照上述 PLSQL 升级方法步骤,重新执行 PLUpgrader 脚本。
-
PLUpgrader 脚本执行成功后,删除第 1 步中增加的配置。
-
-
问题:PLUpgrader 执行不结束也不报错
一般是正在重新编译 PLSQL,可能 PLSQL 数量较多,可以查看
update_plsql.log
日志来确认 PLUpgrader 运行进度。 -
问题:PLUpgrader 执行过程中自动退出了pod
进入pod 后五分钟没操作自动退出,PLUpgrader进程会任然存在于pod中,可以jps确认,并且继续关注update_plsql.log 来确认进度,具体请参考查看升级日志
-
问题:PLUpgrader 执行成功后,PLSQL 还是报错
可能是没有重启 Quark Metastore 角色导致的,那么 PLUpgrader 用的是 metastore pod 里的老 jar 包来编译 PLSQL,导致打 patch 或者升级的 Quark 无法调用老版本 jar 编译的 PLSQL。
-
问题:重新编译报错 table not found,但是表是 PLSQL 里创建的
如果在 PLSQL 里 execute immediate 创建临时表,后面直接写 select 时用到这个表,在参数 plsql.compile.dml.check.semantic=true 的情况下,函数是创建不出来的,但是如果创建出来了,是能执行成功的。
但是对于 PLUpgrader 来说,需要重新编译。如果客户手动设置 plsql.compile.dml.check.semantic=false,然后创建了函数。后面调用的脚本里没有设置 plsql.compile.dml.check.semantic=false,业务上是没问题的,但是对于 PLUpgrader 就无法自动重新编译了,这个是一类 corner case,只要客户手动在创建 PLSQL 的时候设置了一些编译时期依赖的参数,没有持久化这些参数,我们 PLUpgrader 就会编译失败,目前只能手动介入。
-
问题:方言混用问题
有时可能会出现方言混用的场景,如 oracle 方言的 PLSQL A 会调用 db2 方言的 PLSQL B,而 PLUpgrader 需要在执行的时候指定方言,那么这个时候 A 和 B 都需要重新编译,这个时候无论 PLUpgrader 用 oracle 还是 db2 方言,都无法编译成果。
解决方案:为解决这种场景,ArgoDB 提供一个参数来做方言重试:
set plsql.compatible.retry = true;
复制-
目前只支持 oracle 和 db2 方言 retry。
-
本参数功能请尽量在研发人员的指导下使用。
-