mysql 8.0.11+默认内置mysqlx插件但未必启用,须确认show plugins中mysqlx状态为active且33060端口监听正常,否则x devapi操作全部失败。

mysqlx 插件,但不等于它已启用——必须确认插件处于 ACTIVE 状态,且 X Protocol 监听端口(默认 33060)可访问,否则所有 NoSQL 操作都会失败。
检查 mysqlx 插件是否已激活
最直接的方式是登录 MySQL 服务端执行:
SHOW PLUGINS;然后在结果中查找
mysqlx 行,确保其 Status 列为 ACTIVE,Type 为 DAEMON。如果看到 DISABLED 或根本没这行,说明插件未加载。
常见错误现象:
– 连接 mysqlx://localhost:33060 时提示 Connection refused
– mysqlsh 启动后报错 Unable to connect to MySQL Server at localhost:33060
- 若使用 MySQL Installer(Windows),重配置 MySQL Server 时需勾选
Enable X Protocol/MySQL as a Document Store - 若手动安装,可用 SQL 命令加载:
INSTALL PLUGIN mysqlx SONAME 'mysqlx.so';(Linux)或mysqlx.dll(Windows) - 注意:执行该命令的账号必须有
INSERT权限对mysql.plugin表
验证 X Protocol 是否监听正确端口
插件激活 ≠ 端口就绪。X Plugin 默认监听 33060,但该端口可能被防火墙拦截,或配置中被显式禁用。
检查方式:
– Linux/macOS:运行 netstat -tuln | grep :33060 或 ss -tuln | grep :33060
– Windows:运行 netstat -ano | findstr :33060
- 若无输出,说明 X Plugin 没有成功绑定端口,需检查 MySQL 错误日志(通常在
data/hostname.err)中是否有mysqlx相关的加载失败信息 - 确认配置文件(如
my.cnf或my.ini)中没有mysqlx=OFF或mysqlx_port=0 - MySQL 9.0 起
mysqlx默认启用,但旧版本(如 8.0.11–8.0.28)仍需确保配置含[mysqld]下的mysqlx=ON
Spring Boot 中连接文档存储需用 mysqlx URL,不是 jdbc:mysql://
很多人误以为加个 JSON 字段 + mysql-connector-java 就能用 NoSQL 功能,其实不行——X DevAPI 的集合(Collection)、文档(Document)操作必须走 X Protocol,也就是 mysqlx:// 协议。
典型错误:
– 在 Spring Boot 中只配了 spring.datasource.url=jdbc:mysql://...,却试图调用 session.getSchema(...).getCollection(...)
– 报错类似:java.lang.NoClassDefFoundError: com/mysql/cj/x/protocol/XProtocol
- 必须引入支持 X DevAPI 的驱动:Maven 用
mysql-mysql-connector-j(8.0.23+)或独立的mysql-connector-java8.0.x,Gradle 写法:implementation 'mysql:mysql-connector-java:8.0.33' - 连接 URL 格式严格为:
mysqlx://localhost:33060/mydb?user=root&password=xxx(注意是&不是&) - Spring Boot 本身不原生支持
mysqlx://,需手写XSession初始化逻辑,不能依赖DataSource自动装配
创建 Collection 前必须先有 Schema,且不能用 CREATE DATABASE 语句直接建
MySQL 文档存储不是“开箱即用”的集合容器。你得先创建一个 Schema(相当于 MongoDB 的 database),再在这个 Schema 下创建 Collection(相当于 MongoDB 的 collection)。这个 Schema 必须通过 X DevAPI 创建,而非传统 SQL。
示例(在 mysqlsh 中):
mysql-js> var session = mysqlx.getSession('root@localhost:33060');<br>mysql-js> var db = session.createSchema('testdb');<br>mysql-js> var coll = db.createCollection('products');
- 如果跳过
createSchema()直接getSchema('xxx').createCollection(...),会抛出Schema not found - 用
CREATE SCHEMA testdb;SQL 语句建的库,在 X DevAPI 中不可见——X Plugin 管理的是独立的元数据视图 - Collection 名称区分大小写,且不能含特殊字符或空格;建议全小写 + 下划线
bind-address 配置逻辑,也不受 skip-networking 影响——但会受 mysqlx_bind_address 单独控制。











