mysqld_multi配置文件必须包含[mysqld_multi]段(定义mysqld、mysqladmin绝对路径及log)和至少一个形如[mysqld1]的实例段(编号为正整数、不跳号),每个[mysqldN]段须显式声明唯一port、datadir、socket、pid-file及server-id,且不可混入[client]等客户端段。

能用,但必须严格按规则写配置、初始化和启停命令,否则 90% 的失败都卡在这三步上。
mysqld_multi 配置文件必须满足哪些硬性结构
它不认 [mysqld],只扫描形如 [mysqld1]、[mysqld2] 这样的段名——编号 N 必须是正整数,且不能跳号(比如有 [mysqld1] 和 [mysqld3],但没 [mysqld2],mysqld_multi report 可能漏掉第 3 个)。
[mysqld_multi] 段里至少要定义:mysqld(指向 mysqld_safe 或 mysqld 绝对路径)、mysqladmin(同理)、log(建议显式指定,否则默认写 /tmp/mysqld_multi.log,容易被系统清理)。
每个 [mysqldN] 段中,以下参数必须唯一且显式声明:
-
port(端口可任意,不强制绑定编号) -
datadir(目录需提前创建并chown -R mysql:mysql) -
socket(Unix 套接字路径,不能重复) -
pid-file(进程 ID 文件路径) -
server-id(启用复制时必设,且全局唯一)
别在 [mysqldN] 里塞 [client] 或 [mysql] 段——mysqld_multi 会直接忽略它们。
初始化数据目录时最容易踩的三个坑
错误现象:InnoDB: Operating system error number 13(权限拒绝),或启动时报 Table 'mysql.plugin' doesn't exist。
根本原因:初始化没走对应实例的配置段,导致多个实例共用同一套系统表空间或权限错乱。
正确做法是用 --defaults-file 显式指定完整配置文件,并用 --mysqld=mysqldN 告诉初始化程序读哪个段:
bin/mysqld --initialize --user=mysql \ --basedir=/usr/local/mysql \ --datadir=/data/3307/data \ --defaults-file=/etc/my.cnf \ --mysqld=mysqld7
注意最后的 --mysqld=mysqld7 —— 它让初始化程序去读 [mysqld7] 段,而不是默认的 [mysqld]。
如果用旧版 mysql_install_db,同样必须加 --defaults-file,否则它只认 [mysqld] 段,初始化结果必然错乱。
初始化后务必检查:ls -l /data/3307/data 确保所有文件属主是 mysql:mysql;ls -l /data/3307/data/mysql 下要有 plugin.frm 等基础表文件。
启动/停止命令怎么写才不会静默失败
mysqld_multi start 1 启动的是 [mysqld1] 段,不是“端口 3306”——编号和端口完全解耦。误写成 mysqld_multi start 3306,它会去找 [mysqld3306],找不到就什么也不报、直接退出。
批量操作用空格分隔编号,不是逗号:
- ✅ 正确:
mysqld_multi start 1 2 3 - ❌ 错误:
mysqld_multi start 1,2,3(会被当做一个编号 1,2,3)
mysqld_multi report 只查进程是否存在,不验证服务是否真正可用。要确认实例跑起来了,得手动连:
mysql -S /var/run/mysqld/mysql1.sock -e "SELECT VERSION();"
或者用 TCP:
mysql -h 127.0.0.1 -P 3307 -e "SELECT @@port;"
停止命令同理:mysqld_multi stop 1 2,不能混用 mysqld_safe 和 mysqld 启动方式——[mysqld_multi] 里配的是哪个,就全程用哪个。
systemd 环境下 mysqld_multi 很可能根本不存在
如果你用的是较新版本的 MySQL(5.7+)且通过 RPM/Debian 包安装,mysqld_multi 工具很可能压根没装——因为官方改用 systemd 管理多实例了。
运行 which mysqld_multi,如果返回空,说明你得走 systemd 方式:为每个实例写独立的 .service 文件(如 mysqld@3307.service),用 systemctl start mysqld@3307 控制。
这种情况下硬凑 mysqld_multi 不仅徒劳,还可能因配置冲突引发启动失败。先确认你的 MySQL 安装来源和发行版管理机制,再决定走哪条路。


















