MySQL多实例启动失败主因是端口或socket冲突,须为每个实例独立配置port、socket、pid-file、datadir;初始化用mysqld --initialize;systemd需用mysqld@.service模板;连接时-S与-P不可混用。

MySQL 多实例启动失败:端口被占或配置冲突
直接起多个 mysqld 进程时,最常见报错是 Can't start server: Bind on TCP/IP port. Got error: 98: Address already in use,本质是 port 或 socket 文件路径重复。必须为每个实例单独指定 port、socket、pid-file、datadir,四者缺一不可。
实操建议:
-
port必须不同(如3306、3307、3308),别用0或留空 -
socket路径不能共用(如/tmp/mysql.sock是默认值,第二个实例必须改成/tmp/mysql_3307.sock) -
datadir必须指向独立目录,且目录需已存在、权限正确(chown -R mysql:mysql /var/lib/mysql_3307) - 避免复用同一个配置文件;每个实例应有独立的
my.cnf(如/etc/my_3307.cnf),启动时显式指定:mysqld --defaults-file=/etc/my_3307.cnf
初始化新实例的 datadir:mysql_install_db 已废弃
MySQL 5.7.6+ 不再支持 mysql_install_db,强行调用会报 command not found 或提示 deprecated。必须改用 mysqld --initialize,它会生成 root 密码并写入错误日志。
实操建议:
- 执行前确认
datadir为空目录(非空会报错A mysqld process already exists) - 命令必须带
--defaults-file指向该实例专用配置:mysqld --defaults-file=/etc/my_3307.cnf --initialize - 初始化后立刻查看错误日志(
log-error配置项所指路径),找类似A temporary password is generated for root@localhost: xxxxxx的行 - 若不想用临时密码,可加
--initialize-insecure(仅限测试环境),但 MySQL 8.0+ 默认禁用该选项
systemd 管理多实例:不能共用 mysqld.service
直接 systemctl start mysqld 只能启一个实例,因为默认 unit 文件只读取全局 /etc/my.cnf。要让 systemd 认出多个实例,得为每个端口建独立 service 文件。
实操建议:
- 复制模板:
cp /usr/lib/systemd/system/mysqld.service /usr/lib/systemd/system/mysqld@.service(注意末尾@) - 在
mysqld@.service中修改ExecStart行,强制指定配置文件:ExecStart=/usr/sbin/mysqld --defaults-file=/etc/my_%i.cnf - 启用实例时用实例名(即配置文件名不含
.cnf的部分):systemctl enable mysqld@3307、systemctl start mysqld@3307 - 检查状态:
systemctl status mysqld@3307,别漏掉@3307,否则查的是默认实例
连接指定实例:-S 和 -P 别混用
连错实例往往不是权限问题,而是客户端没走对通道。Unix socket(-S)和 TCP 端口(-P)是两条路,-S 优先级高于 -P,哪怕你写了 -P 3307,如果同时有 -S /tmp/mysql.sock,它仍会连默认实例。
实操建议:
- 明确目标:本地调试优先用
-S(快、免网络栈),跨机器或脚本统一用-h 127.0.0.1 -P 3307(强制走 TCP) - 验证连接路径:
mysqladmin -S /tmp/mysql_3307.sock ping或mysqladmin -h 127.0.0.1 -P 3307 ping - PHP/Python 连接时,DSN 中的
host写127.0.0.1才走 TCP;写localhost会触发 socket 回退逻辑,可能连偏 - 别依赖
mysql命令的默认行为——它不看你开了几个mysqld,只认当前 shell 环境里MYSQL_UNIX_PORT或配置文件里的socket
端口、socket、datadir、配置文件、systemd 实例名,这五处只要有一处复用或拼写差一个字符,实例就起不来或连错。人眼比对容易漏,建议写个简单 shell 脚本校验每个实例的 port 和 socket 是否唯一。










