oceanbase 4.x 连接 navicat 常见问题包括:information_schema 报错需启用 ob_mysql_compatibility_mode;字符集与时区不匹配需设 utf8mb4 和 +00:00;connection refused 需检查租户状态、监听地址及用 127.0.0.1;ddl 不支持 engine/auto_increment 等语法,须手工重写并关闭自动提交。
连接时提示 unknown database 'information_schema'
这是 oceanbase 4.x 默认关闭 mysql 兼容模式下最典型的报错,navicat 启动时会主动查询 information_schema 获取元数据,但 ob 4.x+ 的 mysql 租户默认不暴露该库(除非显式创建或开启兼容开关)。
解决方法不是改 Navicat,而是调整 OceanBase 连接参数:
- 在 Navicat 新建连接的「高级」页签中,勾选
Use SSL(即使不用 SSL,勾选后 Navicat 会跳过部分元数据探测) - 或在「连接」页签的「初始化命令」栏填入:
SET SESSION ob_mysql_compatibility_mode = ON; - 更稳妥的做法:连接成功后,在查询窗口手动执行
ALTER SYSTEM SET ob_mysql_compatibility_mode = ON;(需 SYS 租户权限)
用 MySQL 模式租户连接,但 Navicat 显示表为空或字段乱码
本质是字符集和时区未对齐。OceanBase 的 MySQL 租户默认使用 utf8mb4,但 Navicat 可能仍按 latin1 解析握手包;同时 OB 默认时区为 +00:00,而 Navicat 常读本地时区导致时间类型错位。
必须在连接参数里硬性指定:
- 「高级」→「初始化命令」添加两行:
SET NAMES utf8mb4;和SET time_zone = '+00:00'; - 「连接」→「字符集」下拉框选
utf8mb4(不能留空或选 auto) - 如果用的是 OB 4.2.7+,建议在租户级执行:
ALTER TENANT tenant_name CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci;
Connection refused 或 Can't connect to MySQL server
不是密码错,大概率是网络层或协议层没对上。OceanBase 的 MySQL 协议端口(默认 2881)和 Oracle 协议端口(2883)严格分离,且 OB 不监听 localhost 的 IPv6 地址(::1),只响应 IPv4 的 127.0.0.1 或真实 IP。
检查顺序如下:
- 确认 OB 租户状态:
SELECT * FROM oceanbase.__all_tenant WHERE tenant_name = 'your_tenant';,确保status是ACTIVE - 确认监听地址:用
netstat -tuln | grep 2881看是否绑定在0.0.0.0:2881或具体 IP,而非仅127.0.0.1:2881 - Navicat 连接「主机」填
127.0.0.1(不要填localhost),端口填2881,数据库名填租户名(如mysql001),不是test
执行 DDL 报错 Not supported statement type
Navicat 自动生成的某些 DDL(比如带 ENGINE=InnoDB、AUTO_INCREMENT 或分区语法)在 OceanBase 中不被识别——OB 不支持存储引擎声明,自增主键需用 IDENTITY 列,分区语法也完全不同。
绕过方式很直接:
- 关掉 Navicat 的「自动提交 DDL」选项(设置 → 首选项 → SQL 编辑器 → 取消勾选
Auto-commit DDL) - 所有建表语句手工重写:去掉
ENGINE、把AUTO_INCREMENT改成INT IDENTITY、分区用PARTITION BY KEY替代PARTITION BY HASH - 临时查兼容性:执行
SHOW VARIABLES LIKE 'ob_compatibility_mode';,返回MYSQL才代表当前租户走 MySQL 协议路径
OB 的 MySQL 模式不是 MySQL 的子集,它是另一套实现。很多“看起来一样”的语法,背后校验逻辑完全不同——连 CREATE TABLE t(a INT) ENGINE=InnoDB; 这种语句都会在词法解析阶段被拒绝,而不是等到执行。










