根本原因是OceanBase云实例的兼容模式(MySQL/Oracle)与Navicat连接类型不匹配,且白名单未放行本地公网IP;需先确认控制台中兼容模式,再选择对应连接类型、正确用户名格式、端口及IP白名单配置。
Navicat 连接 OceanBase 报错 Unknown database 或 Access denied
根本原因不是密码错了,而是 navicat 默认用 mysql 协议连,但 oceanbase(尤其云上租户)常以「oracle 模式」运行,或白名单未放行你的出口 ip。先确认实例模式:进 oceanbase 控制台 → 实例详情页 → 查看「兼容模式」是 mysql 还是 oracle。
实操建议:
- 如果是
ORACLE模式,Navicat 必须选「Oracle」连接类型,不能选「MySQL」——哪怕端口是 2883、账号带@tenant后缀也不行 - 白名单必须填你本地电脑的真实公网 IP(不是内网
192.168.x.x),可临时用0.0.0.0/0测试,但上线前务必收紧 - 用户名格式严格:MySQL 模式下是
admin@cluster:tenant,Oracle 模式下是admin(不带 @ 和冒号),密码单独填 - 端口别硬记:云厂商可能改默认端口,控制台「连接信息」里写的才是准的,常见有
2883、3306、1521
Navicat 新建连接时「测试连接」成功但无法展开数据库列表
这是典型权限或对象可见性问题。OceanBase 的 information_schema 在 Oracle 模式下不可用,MySQL 模式下也默认隐藏系统库,Navicat 自动执行的元数据查询会失败。
实操建议:
- 手动在 Navicat 查询窗口执行
SHOW DATABASES;(MySQL 模式)或SELECT * FROM ALL_USERS;(Oracle 模式),确认能否查到你的租户库 - 如果能查到但 Navicat 不显示,关掉「自动获取数据库列表」选项:连接编辑页 → 「高级」→ 取消勾选
Auto-select database和Retrieve all databases - 数据库名必须手输,且大小写敏感;MySQL 模式下租户库名通常是
test、mysql等,不是集群名或租户名
连接后执行 DDL 报错 ORA-00942: table or view does not exist(Oracle 模式)
OceanBase Oracle 模式下,表名默认大写,且必须指定 schema(即用户名)。Navicat 自动生成的语句常漏掉 schema 前缀,或用了小写表名。
实操建议:
- 建表时显式加 schema:比如
CREATE TABLE admin.t1 (id INT);,而不是CREATE TABLE t1 (...) - 查询时也带 schema:
SELECT * FROM admin.t1;,否则报ORA-00942 - Navicat 中右键建表,务必在「Owner」字段填你的用户名(如
ADMIN),不要留空 - 避免用双引号括表名——一旦用了,后续所有引用都得严格匹配大小写,极易出错
为什么 Navicat 导入 SQL 文件总卡在「正在执行」或提示 Packet too large
OceanBase 云实例对单包大小有限制(常为 4MB),而 Navicat 默认用大 buffer 发送,尤其含大量 INSERT 的文件,容易触发网络层截断。
实操建议:
- 导入选项里勾选
Split large queries,并设单次执行行数 ≤ 1000 - 提前把 SQL 文件里的
INSERT INTO ... VALUES (...),(...),(...);拆成单行单条(Navicat 不擅长解析多值 INSERT) - 禁用 Navicat 的「Use multi-statements」选项,防止一条语句里混多个分号
- 实在不行,改用命令行工具
obclient:它直通 OceanBase 协议,没这些封装包袱
白名单配置和实例模式匹配是硬门槛,其他都是细节。很多人反复试连接,却忘了去控制台翻一眼「兼容模式」和「白名单状态」——这两个地方不对,后面全白搭。










