确认租户模式为MySQL,执行SHOW VARIABLES LIKE 'ob_compatibility_mode'返回mysql;用户名格式为user@tenant#cluster;端口强制指定2883;PDO需禁用预处理模拟;验证数据库存在且用户有权限;检查OBProxy网络连通性及白名单配置。

确认租户模式为MySQL
登录OceanBase集群,用系统租户(如root@sys#cluster_name)执行:SHOW VARIABLES LIKE 'ob_compatibility_mode'。返回值必须是mysql,不是oracle。若为oracle模式,PHP无法通过MySQL协议连接,会直接报Access denied或Unknown database。
这一步不可跳过。单机版或旧版本租户可能默认为oracle模式,需手动切换。
检查用户名格式是否合规
PHP连接时用户名必须严格写成user@tenant#cluster格式,例如app_user@test_tenant#obdemo。
常见错误:漏掉#cluster部分、用@分隔tenant和cluster、把@写成%40(URL编码后mysqli_connect不自动解码,会导致认证失败)。
立即学习“PHP免费学习笔记(深入)”;
【用户名中含@符号时,不要做URL编码】——mysqli_connect函数不解析URL编码,直接传原始@即可。
强制指定端口2883并禁用PDO预处理模拟
第一步:确保连接字符串中显式传入端口2883。OceanBase默认端口不是3306,不写端口参数将走mysqli默认3306,结果Connection refused。
第二步:若使用PDO,必须在连接后立即关闭预处理模拟:$pdo->setAttribute(PDO::ATTR_EMULATE_PREPARES, false)。否则执行SELECT @@session.sql_mode等语句时会报SQLSTATE[HY000]: General error: 1096 No tables used。
第三步:对mysqli连接建议加超时控制:mysqli_options($conn, MYSQLI_OPT_CONNECT_TIMEOUT, 10)。OBProxy在高负载下响应延迟明显,不设超时可能导致脚本卡死。
验证数据库名是否存在且用户有权限
方法一:连接时不传$dbname参数,先建立连接,再执行USE your_db_name。如果报Unknown database,说明该库不存在,或当前用户无访问权限。
方法二:用系统租户登录,运行SHOW DATABASES LIKE 'your_db_name'确认库存在;再查权限:SELECT * FROM oceanbase.__all_grantee WHERE user_name = 'app_user' AND tenant_name = 'test_tenant'。
注意:OceanBase要求业务库必须由系统租户创建并显式授权,不能靠PDO自动建库。
排查网络与OBProxy连通性
在PHP服务器上执行:telnet obproxy-host 2883。不通则检查防火墙、安全组、路由策略。
若telnet通但PHP仍报Connection refused,大概率是OBProxy未监听该IP或配置了ob_tcp_invited_nodes白名单限制。此时需用系统租户登录,执行:SHOW VARIABLES LIKE 'ob_tcp_invited_nodes',若值非%,则运行ALTER TENANT test_tenant SET VARIABLES ob_tcp_invited_nodes='%'放开。



















