如何在Navicat中连接OceanBase_基础连接与参数配置

7次阅读

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 refusedCan'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';,确保 statusACTIVE
  • 确认监听地址:用 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=InnoDBAUTO_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; 这种语句都会在词法解析阶段被拒绝,而不是等到执行。

text=ZqhQzanResources