能连,但必须改端口——OceanBase 不支持自动 fallback 或端口探测,2883(OBServer)或 2881(OBProxy)被占即报 Connection refused;需通过 obd 修改配置并 reload,客户端连接参数也须同步更新。
OceanBase 默认端口 2883 被占用了,还能连上吗?
能连,但必须改端口——oceanbase 不会自动 fallback 到其他端口,也不支持“端口探测”式连接。只要 2883(直连 observer)或 2881(obproxy 默认端口)被占,mysql 或 obclient 就会直接报 connection refused,不会尝试下一个可用端口。
常见错误现象:
ERROR 2003 (HY000): Can't connect to MySQL server on '127.0.0.1' (111)mysqli_connect(): (HY000/2003): Can't connect to MySQL server on '192.168.1.100' (111)- DBeaver 提示 “Socket fail: Connection refused” 且日志里没更具体的 SQL 错误
根本原因不是权限或用户错,而是 TCP 层根本没通。别急着查账号密码,先看端口。
怎么改 OceanBase 的监听端口(OBServer / OBProxy)
改端口有三类场景,对应三种操作方式,不能混用:
- 用
obd demo快速体验:启动时直接指定,比如obd demo --oceanbase-ce.mysql_port=3881,这个mysql_port就是 OBServer 监听的 MySQL 兼容协议端口 - 已部署集群想改:运行
obd cluster edit-config <deploy_name></deploy_name>,找到oceanbase-ce段下的mysql_port(直连)或obproxy段下的listen_port(代理),改完保存,再执行obd cluster reload <deploy_name></deploy_name>(不是 restart) - 用 All-in-One 安装包:默认集群名是
myoceanbase,配置文件在~/oceanbase/etc/下,改observer.config.bin前需先用ob_admin解析、修改、重写,不建议手动硬改二进制配置
注意:obd cluster start 不会覆盖已有配置,必须 reload 或 restart 才生效;改完端口后,所有客户端连接命令里的 -P 参数也得同步更新。
PHP 连接时端口写错或漏写,为什么连得上却执行 USE 失败?
因为 OceanBase 的租户模型和 MySQL 不同:不传 $dbname 参数也能 mysqli_connect() 成功,但后续执行 USE test 会报 Unknown database 'test'——这不是数据库不存在,而是当前用户(如 root@sys#obcluster)没有该库的访问权限,或者该库根本没在对应租户下创建。
关键点:
-
mysqli_connect($host, $user, $password, $dbname, $port)中的$port必须显式传,不能依赖默认值(MySQL 是 3306,OB 是 2883/2881) - 如果连的是
sys租户,它默认只能看到系统库(oceanbase,information_schema),业务库得先CREATE DATABASE再GRANT - 连接字符串里的
$user格式必须是用户名@租户名#集群名,比如root@tenant1#myoceanbase,少一个符号就认证失败
示例正确写法:$conn = mysqli_connect('127.0.0.1', 'root@sys#myoceanbase', 'pwd', 'oceanbase', 3881);
PDO 连接 OceanBase 时 PDO::ATTR_EMULATE_PREPARES 必须关掉
开了会出奇怪的错误,比如执行 SELECT @@session.sql_mode 或带变量的预处理语句时,报 SQLSTATE[HY000]: General error: 1096 No tables used——这其实不是语法错,是 PDO 模拟预处理把 OceanBase 特有的系统变量查询当成了无效语句。
实操建议:
- 创建
PDO实例后立刻关闭模拟:$pdo->setAttribute(PDO::ATTR_EMULATE_PREPARES, false) - 不要依赖默认值;即使你不用预处理,某些 ORM(如 Laravel 的 Query Builder)内部也会触发
- 连接 DSN 中别加
;charset=utf8mb4,OceanBase v4.x 默认走 utf8mb4,加了反而可能触发字符集协商异常
完整最小连接示例:
$dsn = "mysql:host=127.0.0.1;port=3881;dbname=oceanbase";<br> $pdo = new PDO($dsn, 'root@sys#myoceanbase', 'pwd');<br> $pdo->setAttribute(PDO::ATTR_EMULATE_PREPARES, false);
端口这事看着小,但 OceanBase 的租户、集群、代理三层结构让端口含义特别敏感:直连 OBServer、连 OBProxy、连 ODP,端口号各不相同,且配置分散在不同组件里。改一个,忘了同步改另一个,连接就断在你看不见的地方。

















