问题现象
在尝试将 OceanBase 集群升级至最新版本的过程中,在执行 upgrade_post.py 的时候失败。在进行 grep run_upgrade_all rootservice.log.xxxx 过滤日志发现报错 -4002,并且报错位置为 table not inner table 处。

发现它认为这个 table 不属于内部视图,但是发现这个 table 的名字确实内部视图的名字。(当 table_id 大于 200000,这表示该表不是系统预定义的内部表或视图)
关键信息
用户创建的视图
DBA_SYNONYMS的 table_id 为大于 200000,远高于系统视图的标准范围。升级脚本 upgrade_post.py 在执行 upgrade virtual schema 时,会检查并尝试删除与系统预定义不同的视图。
错误发生在尝试删除用户创建的同名视图阶段,因为该视图的 table_id 表明它不是内部表。
问题原因
前置知识:
跑升级脚本 upgrade_post.py 执行 upgrade virtual schema 时,会比较现有虚拟表/视图与硬编码的虚拟表/视图是否相同,不相同的会删除已有视图并重建。这里删除视图会根据视图名字查找 table_id。
创建系统视图的时候,会先检查系统视图是否有同名冲突,此环境创建出来了和系统视图重名但是 table id 不同的用户视图,触发防御报错,进而导致升级失败 问题的根本原因是用户使用了
create or replace view命令创建了一个与系统视图同名的自定义视图。这导致了在升级过程中,系统试图删除并重建该视图时,由于其 table_id 不符合系统视图的标准而报错。此行为属于产品设计的一部分,即在升级过程中,系统会验证现有的虚拟表/视图与内部硬编码的虚拟表/视图是否一致,如果不一致则会尝试删除并重建,但这一过程对于非系统视图的处理会导致错误。
问题的风险及影响
升级不成功,可能导致数据库无法享受新版本的功能改进和性能优化。
影响后续的维护和管理操作,特别是依赖于特定版本特性的操作。
适用版本
OceanBase 数据库 V4.2.1 BP7(oceanbase-4.2.1.7-107000112024052920)之前版本。
说明
OceanBase 数据库 V4.2.1 BP7 之后禁止使用 create or replace view 来修改内部视图。
解决方法
删除或重命名与系统视图同名的用户自定义视图。
重试升级操作,OceanBase 将在升级过程中重建正确的系统视图。
规避方式
避免使用
create or replace view命令创建与系统视图同名的自定义视图。在进行任何涉及系统表或视图的操作前,先备份相关数据,并确保了解这些操作可能对系统产生的影响。