MySQL 8.0+中mysqlx协议默认启用(非关闭),其可用性取决于mysqlx插件是否ACTIVE、mysqlx_bind_address配置是否允许访问,以及用户认证插件和SQL权限是否匹配,三者缺一不可。

MySQL 8.0+ 中 mysqlx 协议默认是关闭的,不是靠用户权限控制的
MySQL 的 X 协议(由 MySQL Shell、Connector/J 8.0+ 的 X DevAPI 使用)是否可用,取决于服务端是否启用了 mysqlx 插件,而不是用户有没有某项“mysqlx 权限”。它不走传统 SQL 权限模型,也不依赖 GRANT 语句里的某个关键字。
常见误解是:以为执行 GRANT SELECT ON *.* TO 'user'@'%' WITH GRANT OPTION 就能连 X 协议 —— 实际上,只要 mysqlx 插件没启用,用户再高权限也连不上 33060 端口。
- 检查插件状态:
SELECT PLUGIN_NAME, PLUGIN_STATUS FROM information_schema.PLUGINS WHERE PLUGIN_NAME = 'mysqlx';,返回ACTIVE才说明已启用 - 若为
DISABLED或无结果,需在配置文件中启用:mysqlx=ON(或loose-mysqlx=ON),然后重启 mysqld -
mysqlx默认监听127.0.0.1:33060,如需远程访问,还需配mysqlx_bind_address=0.0.0.0
用户要能用 X 协议连接,必须满足三个条件
缺一不可。只做其中一两项,连接会失败,报错类似 Authentication failed for user 或直接被拒绝连接。
-
插件已启用且监听地址可访问:确认
mysqlx插件 ACTIVE,且mysqlx_bind_address允许目标客户端 IP 连入(例如设为0.0.0.0或具体网段) -
用户账号支持密码认证方式:X 协议不支持
caching_sha2_password插件的某些旧客户端交互变体,建议显式指定认证插件:CREATE USER 'xuser'@'%' IDENTIFIED WITH caching_sha2_password BY 'pass123'; -
用户有对应数据库对象的 SQL 权限:X 协议操作(如
session.getSchema('db').getCollection('coll').find())最终仍要校验底层 SQL 权限。比如对db.tbl执行find(),用户至少要有SELECT权限
mysqlx 相关系统表不需要手动授权
MySQL 8.0+ 的 X 协议元数据(如 performance_schema 下的 mysqlx_connection_configuration、mysqlx_connection_status)属于只读监控视图,不参与权限判定,也不需要 GRANT SELECT ON performance_schema.* 之类操作 —— 只要用户能连上,就能查(前提是已有 SELECT 权限)。
真正要小心的是误操作:mysql 系统库下的 user、db 表绝不能直接 INSERT 或 UPDATE。所有用户管理必须用 CREATE USER、GRANT、DROP USER;否则会导致权限缓存不一致,甚至 mysqlx 插件拒绝认证。
- 错误做法:
UPDATE mysql.user SET authentication_string=... WHERE User='xuser'; FLUSH PRIVILEGES; - 正确做法:
ALTER USER 'xuser'@'%' IDENTIFIED WITH caching_sha2_password BY 'newpass'; - 验证方式:
mysqlsh --sql -u xuser -h 192.168.1.100 -P 33060 -p,看能否进入 SQL 模式
容易被忽略的兼容性坑:老客户端连不上新服务端
MySQL 8.0.29+ 默认禁用 sha256_password 认证,并强化了 caching_sha2_password 的握手流程。很多旧版 MySQL Shell(如 8.0.22 之前)或自定义 X DevAPI 客户端会因不支持新握手而卡在连接阶段,报错 Access denied for user,但实际是协议协商失败,和密码无关。
- 临时绕过:启动服务端时加参数
--default-authentication-plugin=mysql_native_password(仅测试用) - 长期方案:升级客户端到 MySQL Shell 8.0.33+ 或 Connector/J 8.0.33+,它们完整支持新版
caching_sha2_password流程 - 别信日志里 “Access denied” 就一定是密码错 —— 先抓包看 TCP 层是否完成三次握手、SSL 是否协商成功


















