首批通过分布式安全可靠测评,为关键业务系统打造
一张表在 information_schema.tables 中查到有两条记录
更新时间:2026-05-25 01:56
问题现象
非分区表转分区表 DDL 后,一些视图(如 information_schema.tables/all_tables)对于同一张表会显示两条记录。
关键诊断信息
触发条件
表做过非分区表转分区表的 DDL 。
事前巡检
无 。
事后诊断
在 SYS 租户下查询所有统计信息记录异常的表。
select tenant_id, table_id from oceanbase.__all_virtual_table_stat where table_id = partition_id and (tenant_id,table_id) in (select tenant_id, table_id from __all_virtual_table where part_level != 0);
知道表 ID 后,可以通过 __all_tenant/__all_virtual_database/__all_virtual_table 找到对应的租户名/数据库名/表名。
问题原因
非分区表转分区表 DDL 同步统计信息的内部表(__all_table_stat/__all_column_stat)时,把非分区表的 table_id=partition_id=表 id 的记录同步过来了,导致统计信息多了一条记录,从而导致一些视图(如 information_schema.tables/all_tables)会多显示一条记录。
问题的风险及影响
一些视图(如 information_schema.tables/all_tables)对于同一张表会显示两条记录。
影响租户
影响 OceanBase 数据库中的 SYS 用户和 Oracle 租户以及 MySQL 租户。
影响版本
OceanBase 数据库企业版 V4.1.0 GA(oceanbase-4.1.0.0-100001122023040322)及之后版本、V4.2.0 GA(oceanbase-4.2.0.0-100010082023083014)及之后版本、V4.2.1 GA(oceanbase-4.2.1.0-100000182023092722)及之后版本、V4.2.2 GA(oceanbase-4.2.2.0-100000082024011317)及之后版本、V4.3.0 (oceanbase-4.3.0.0-100000072024020200)及之后版本。
解决方法及规避方式
解决方法:
升级至问题已修复版本。目前已修复的版本包括 OceanBase 数据库企业版 V4.2.1 BP5(oceanbase-4.2.1.5-105000072024041817)及之后版本、V4.2.5(oceanbase-4.2.5.0-100000082024102022)及之后版本。
应急方法:
手动删除
__all_table_stat/__all_column_stat中不符合预期的行(分区表不应该存在 table_id=partition_id=该表id 的记录)。登录到 sys 租户上。
切到用户租户:alter system change tenant 租户名;
删内部统计信息的行。
注意
删除内部统计信息的行存在一定的风险,操作之前请联系 OceanBase 技术支持团队咨询。
delete from __all_table_stat where table_id=partition_id and table_id=分区表 table_id;delete from __all_column_stat where table_id=partition_id and table_id=分区表table_id;
规避方式:
做非分区表转分区表 DDL 前,先手动清空非分区表的表和列的表级统计信息,例如如下命令。
call dbms_stats.delete_table_stats('TEST', 'T1');