先交代清楚:我们在做一个 MIT 协议的开源数据库客户端,OceanBase 是我们连真实实例测过的数据库之一。下面全是我们自己踩出来的记录,包括一个我们自己写错的地方。不是评测 OceanBase,是把一个外部工具接进来的时候会遇到什么。
测试环境
| 项 | 值 |
|---|---|
| 镜像 |
4.4.2-lts,MODE=mini
|
version() |
5.7.25-OceanBase_CE-v4.4.2.1 |
| 走的驱动 | MySQL 协议 |
| 对照 | 同一轮里还测了 MySQL 26.7.0 |
15 个功能面,14 个能返回不报错,但只有 12 个真正给出有用的东西。差的那两个不是崩,是答了等于没答。
一、健康检查是唯一的硬失败
租户里根本没有 performance_schema 这个库:
ERROR 1049 (42000): Unknown database 'performance_schema'
同一轮测试里 MySQL 26.7.0 的健康检查是过的,所以这一条是 OceanBase 这边的差异,不是我们的连接问题。
这件事有个副作用,在你点开任何面板之前就能看见:顶部状态徽章显示「Slow」而不是「Online」。这里容易误会——那个徽章不是延迟指标,它只看健康请求成功没成功。而健康检查恰好是这个引擎拒绝的那一个。所以徽章写着 Slow,实际查询快得很。
二、所有体积读数都是 0 B
表、索引、库、存储,四个地方的体积全是 0 B。原因在 information_schema.TABLES:
DATA_LENGTH = 0
INDEX_LENGTH = 0
不是我们没读,是读回来就是 0。
存储统计那一栏还有个更有意思的东西:会列出一行 InnoDB,内容是 ibdata1:12M:autoextend,而它的大小读数是 N/A。OceanBase 为了兼容性伪造了 innodb_data_file_path 这个变量,但后面并没有这么一个文件。第一次看到的时候我们以为自己解析错了。
三、行数是对的,但要先 ANALYZE,而且写法有讲究
行数没问题——跑过 ANALYZE TABLE 之后,2000 行的表读出来就是 2000。
但必须用 MySQL 模式的写法。Oracle 模式那句会被直接拒绝:
ANALYZE TABLE t COMPUTE STATISTICS;
→ ERROR 1235
如果你的工具里写死了 Oracle 模式的语句,这里会静默地拿不到统计信息,然后你看到的行数就是 0,很容易归到「工具不支持」上去。
四、外键会被强制执行,但不建索引
外键是真的生效的——插一条孤儿记录会被拒:
ERROR 1452
但是不会自动建配套索引。所以同一份表结构,在 MySQL 和在 OceanBase 上,索引数量对不上。做结构对比或者迁移校验的时候这一条会咬人。
五、对象浏览器很干净,这一点比预想的好
2 张用户表,对象浏览器里就是 2 个对象。
我们原本担心会被系统对象淹掉——OceanBase 自己有 860 + 70 + 18 个目录对象。结果它们全被标成 SYSTEM TABLE 或 SYSTEM VIEW,我们按 TABLE_SCHEMA 和 TABLE_TYPE = 'BASE TABLE' 过滤,两个条件都不放它们进来。这块不用额外处理。
取消查询是真取消。Explain 是真的只描述不执行,返回一个 11 行的 ASCII 计划,带 EST.ROWS 列。
六、登录要连业务租户,不是 sys
MODE=mini 会建一个叫 test 的用户租户,登录名是 root@test。
用 sys 租户连进去会看到九个库,里面混着 Oracle 模式的产物:LBACSYS、ORAAUDITOR、SYS、ocs、sys_external_tbs。业务租户里没有这些。如果你是拿 sys 测的,看到的东西跟你应用实际看到的不是一回事。
七、我们自己写错的一处
慢查询面板一开始读出来是 0 行。看上去像「这个库没有慢查询」,其实是源根本读不了——租户没有 performance_schema,那句查询报的就是上面那个 ERROR 1049。
我们的代码把这个错误吞掉了,然后给面板填了个 0。这是个编出来的数字,比空白更糟:空白你知道自己没拿到,0 会让你以为拿到了。
已经改掉了,现在直接把租户返回的 ERROR 1049 原样显示出来。写工具的时候这类地方值得回头查一遍——读不到和读到 0,在界面上必须长得不一样。
想请教社区两件事
- 租户里没有
performance_schema是 4.4 的设计,还是我们MODE=mini这个起法的问题?正式部署的用户租户里有吗? - 体积统计有没有别的读法?
information_schema.TABLES这条路是 0,但 OceanBase 自己肯定知道真实占用,有没有推荐查的视图?
如果你们也把第三方工具接过 OceanBase,很想知道你们在哪些地方卡住过。上面每一条都是在 4.4.2-lts 上跑出来的,版本不同结论可能不一样。