联 系 我 们
售前咨询
售后咨询
微信关注:星环科技服务号
更多联系方式 >
8.5.5 PLSQL 升级
更新时间:9/27/2024, 3:16:58 AM

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 进行升级前,请逐步进行如下操作:

  1. 停止 Quark server 角色,但是不要停止 Quark Metastore 服务。

    quark stop server role
    图 63. 停止 Quark server 角色
  2. 备份 ArgoDB 元数据,具体请参考 KunDB 备份

    若需要进行 PLSQL 升级的集群使用 TxSQL 服务进行元数据管理,请参考 TxSQL 用户数据备份

方法步骤

下面我们向您介绍使用 PLSQL 升级工具 PLUpgrader 进行 PLSQL 升级的详细步骤:

  1. 进入 Quark Metastore 对应的 Pod:

    1. 在集群的任一节点上运行如下命令,查看 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
      复制
    2. 然后运行以下命令,进入对于 ID 的 Pod 中(上一步返回结果中的第一列为 <pod_id>):

      kubectl exec -it <pod_id> bash
      复制

      进入 pod 中后,默认 5 分钟不操作将会自动退出 pod ,此时不会停止运行中的 PLUpgrader 脚本。

  2. 执行 PLUpgrader 工具进行升级。

    脚本位于 Pod 的 /bin/plsql-upgrader.sh 中,使用以下命令执行该脚本:

    bash /bin/plsql-upgrader.sh oracle
    复制
    • 以上命令的 oracle 是指 PLSQL 使用的方言,也可以根据具体使用的方言替换为 DB2,TD。

  3. 查看升级日志。PLUpgrader 脚本运行的过程中,会自动打印日志目录,一般存放在 /var/log/quark1/update_plsql.log 中,其中会显示升级失败的 PLSQL 实体。

    如果需要升级的 PLSQL 较多,升级过程会持续较长时间,期间可以运行命令查看进度:

    tail -f /var/log/quark1/update_plsql.log
    复制
  4. 升级成功后,会在日志 update_plsql.log 中看到 “plsqlTool completed”字样,以及 “PLSQL UPGRADE FAILED CASES REPORT”。

    其中失败的 case 需要手工干预,可能是方言问题,可能是存储过程依赖的某些表或者函数不存在,导致无法自动编译。

  5. 重启 Quark 服务。

常见问题处理
  1. 问题:PLUpgrader 执行报错找不到数据库

    该问题在 ArgoDB 3.1 和 ArgoDB 3.2 版本中可能发生。

    解决方法:在运行 PLUpgrader 工具前,增加一项配置,具体操作步骤如下:

    1. 找到 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>
      复制
    2. 然后按照上述 PLSQL 升级方法步骤,重新执行 PLUpgrader 脚本。

    3. PLUpgrader 脚本执行成功后,删除第 1 步中增加的配置。

  2. 问题:PLUpgrader 执行不结束也不报错

    一般是正在重新编译 PLSQL,可能 PLSQL 数量较多,可以查看 update_plsql.log 日志来确认 PLUpgrader 运行进度。

  3. 问题:PLUpgrader 执行过程中自动退出了pod

    进入pod 后五分钟没操作自动退出,PLUpgrader进程会任然存在于pod中,可以jps确认,并且继续关注update_plsql.log 来确认进度,具体请参考查看升级日志

  4. 问题:PLUpgrader 执行成功后,PLSQL 还是报错

    可能是没有重启 Quark Metastore 角色导致的,那么 PLUpgrader 用的是 metastore pod 里的老 jar 包来编译 PLSQL,导致打 patch 或者升级的 Quark 无法调用老版本 jar 编译的 PLSQL。

  5. 问题:重新编译报错 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 就会编译失败,目前只能手动介入。

  6. 问题:方言混用问题

    有时可能会出现方言混用的场景,如 oracle 方言的 PLSQL A 会调用 db2 方言的 PLSQL B,而 PLUpgrader 需要在执行的时候指定方言,那么这个时候 A 和 B 都需要重新编译,这个时候无论 PLUpgrader 用 oracle 还是 db2 方言,都无法编译成果。

    解决方案:为解决这种场景,ArgoDB 提供一个参数来做方言重试:

    set plsql.compatible.retry = true;
    复制
    • 目前只支持 oracle 和 db2 方言 retry。

    • 本参数功能请尽量在研发人员的指导下使用。