dba.configureInstance()必须用clusterAdmin参数指定账户,否则不会自动赋予元数据表权限,导致dba.createCluster()失败;账户名密码须全节点一致;SSL启用后必须同步配置ipAllowlist,且memberSslMode仅创建时可设;Router账户须用cluster.setupRouterAccount()创建并遵循最小权限原则。

dba.configureInstance() 必须用 clusterAdmin 参数指定账户
不手动创建配置账户,dba.configureInstance() 就不会自动赋予集群所需权限,后续 dba.createCluster() 会失败。常见报错是 Access denied for user 'root'@'%' to database 'mysql_innodb_cluster_metadata' —— 这说明账户没权限写入元数据表。
正确做法是显式传入 clusterAdmin 和 clusterAdminPassword(或交互输入):
mysqlsh> dba.configureInstance('root@localhost:3306', {clusterAdmin: 'icadmin', clusterAdminPassword: 'Secur3P@ss!'})
- 账户名密码必须在所有节点完全一致,包括大小写和特殊字符
- 不要复用 root 账户;如果用了,所有节点的 root 密码必须相同,否则添加实例时连接失败
-
clusterAdmin账户会被自动授予SELECT, INSERT, UPDATE, DELETE权限到mysql_innodb_cluster_metadata库,以及GROUP_REPLICATION_ADMIN、CLONE_ADMIN等动态权限
SSL 加密连接必须配合 ipAllowlist 使用
启用 SSL 后若没配 ipAllowlist,实例加入集群时会卡住或报 XCom communication error: connection refused。这是因为 XCOM 栈默认拒绝未显式授权的 IP。
创建集群时必须通过 memberSslMode 指定模式,并同步设置 ipAllowlist:
mysqlsh> cluster = dba.createCluster('mycluster', {memberSslMode: 'VERIFY_CA', ipAllowlist: '192.168.3.2,192.168.3.3,192.168.3.4'})
-
memberSslMode只能在createCluster()时设,之后无法修改;AUTO在生产环境不推荐,它可能退化为明文通信 -
ipAllowlist值必须是逗号分隔的 CIDR 或 IP 列表,不能含空格;写错格式会导致整个集群启动失败 - 如果用的是 MySQL 商业版,SSL 默认开启,漏配
ipAllowlist是最常被忽略的致命疏漏
MySQL Router 账户必须用 cluster.setupRouterAccount()
直接用 root 或配置账户连 Router 会暴露高权限凭证,且 Router 无法自动刷新凭据。错误做法是让 Router 用 icadmin 登录,这违反最小权限原则。
应在集群创建并添加完所有实例后,用集群对象创建专用 Router 账户:
mysqlsh> cluster.setupRouterAccount('routeruser', {password: 'R0ut3rP@ss!'})
- 该命令会把账号同步到所有节点,并只授
SELECT权限到元数据表 +SESSION_VARIABLES_ADMIN等必要动态权限 - Router 配置文件
mysqlrouter.conf中的user字段必须与此用户名一致,密码需 Base64 编码后填入password - 账户名不能含特殊字符(如
@、.),Router 解析会失败
远程访问需绕过 auth_socket 插件限制
Ubuntu/Debian 上 MySQL 8.0 默认用 auth_socket 认证本地 root,导致 mysqlsh 远程连接时提示 Plugin 'auth_socket' is not loaded 或直接拒绝。
必须先切换认证插件并设密码:
mysql> ALTER USER 'icadmin'@'%' IDENTIFIED WITH mysql_native_password BY 'Secur3P@ss!'; FLUSH PRIVILEGES;
- 仅对集群账户(如
icadmin、routeruser)执行此操作,不要动root@localhost - 确认
my.cnf中没有skip-networking,且bind_address设为0.0.0.0或具体监听 IP - 防火墙要放行 3306(SQL)、33060(X Protocol)、6446/6447(Router 端口)
cluster.status() 输出里的 "status": "UNREACHABLE" 节点日志,关键词搜 XCom 和 ssl。


















