Navicat 连不上 OceanBase 主因是端口错误、权限配置不当、网络未通或协议不匹配;需确认使用2881/2883端口、租户级授权、防火墙开放及Navicat驱动与模式一致。
Navicat 连不上 OceanBase:先确认是不是连错了端口
oceanbase 默认不监听 mysql 兼容协议的 3306 端口,而是用 2881(observer 的 mysql 协议端口)或 2883(oracle 兼容协议端口)。很多人填了 3306 就连不上,其实服务根本没在听这个端口。
实操建议:
- 查
obproxy配置:如果用了 OBProxy,它默认暴露2883(MySQL 模式)和2881(Oracle 模式),但实际端口以obproxy.conf中的listen_port为准 - 查
observer进程:执行ps -ef | grep observer,再看启动参数里的-P(MySQL 协议端口)和-o(Oracle 协议端口) - 用
telnet 192.168.x.x 2881测试端口是否通——不通就不是 Navicat 配置问题,是网络或服务没起来
连接时提示 “Access denied for user”:用户权限没开对
OceanBase 的用户体系和 MySQL 不完全一样。即使创建了用户,也必须显式授权到具体租户(tenant)和数据库(database),且默认不支持 % 通配符远程登录(尤其在非 Oracle 模式下)。
常见错误现象:
- 用
root@sys能连,但自建用户连不上 - Navicat 报错
ORA-01017(Oracle 模式)或ERROR 1045(MySQL 模式) - 用户密码没错,但提示“no matching row in mysql.user”
实操建议:
- MySQL 模式下,用户需在
mysql租户中创建,并用GRANT ... ON *.* TO 'u'@'%' IDENTIFIED BY 'p';授权(注意:必须指定@'%'或具体 IP,不能省略) - Oracle 模式下,用户需在
ORACLE租户中创建,且必须用CREATE USER u IDENTIFIED BY 'p'; GRANT CONNECT, RESOURCE TO u; - 检查租户状态:
SELECT * FROM oceanbase.__all_tenant WHERE tenant_name = 'xxx';,确保status = 'ACTIVE'
局域网能 ping 通但 Navicat 连接超时:防火墙或 network_mode 拦住了
Docker 部署的 OceanBase(尤其是单机体验版)默认用 bridge 网络,容器内端口不会自动映射到宿主机;或者宿主机防火墙(如 ufw、firewalld)拦了 2881/2883。
实操建议:
- 查 Docker 映射:
docker ps看PORTS列有没有0.0.0.0:2881->2881/tcp,没有就重跑容器加-p 2881:2881 - 查宿主机防火墙:
sudo ufw status或sudo firewall-cmd --list-ports,开放对应端口 - 如果是 Mac/Windows 上的 Docker Desktop,确认是否启用了 “Use the WSL2 based engine”(Win)或 “Virtual Machine”(Mac),这些虚拟层可能额外拦截端口
Navicat 连上后执行 SQL 报错 “Unsupported command” 或卡住
OceanBase 对部分 MySQL 语法兼容有限,比如不支持 SHOW VARIABLES、SHOW PROCESSLIST、存储过程调试、某些 hint 写法;Navicat 默认会发一堆元数据探测语句,容易触发报错或阻塞。
实操建议:
- 在 Navicat 连接设置里关掉「自动检测数据库版本」和「自动获取表结构」(高级 → 初始化)
- 避免用 Navicat 的「设计表」功能改结构,优先用
ALTER TABLE手写 - 遇到
ERROR 1235(not supported yet)或ERROR 5051(feature not supported),直接查 官方兼容性文档,别硬试 - Oracle 模式下,Navicat 默认走 MySQL 协议,必须手动选「Oracle」驱动,并用
user/password@host:port/service_name格式填连接串(service_name 是租户名,如ORACLE)
真正卡点往往不在 Navicat 设置本身,而在租户隔离、协议模式、网络映射这三层叠加时漏掉其中一环——比如开了 MySQL 模式租户,却用 Oracle 驱动连,或者防火墙放行了 2881,但 obproxy 实际监听的是 2883。

















