MySQL多实例必须修改port、socket、pid-file、datadir、log-error五项配置;需确保目录存在且权限正确,用mysqld --initialize初始化,启动时指定配置文件,连接时注意socket优先级,systemd需用模板服务管理。

MySQL多实例必须改哪些配置项
一台服务器跑多个 MySQL 实例,核心就两条:端口不能重复,socket 文件路径不能冲突。否则启动时直接报错 Can't start server: Bind on TCP/IP port 或 Address already in use,连进程都起不来。
关键配置在 my.cnf(或 mysqld.cnf)的 [mysqld] 段里,必须显式指定:
-
port:每个实例用不同端口,比如3306、3307、3308 -
socket:绝对路径,不能共用/tmp/mysql.sock,建议按端口命名,如/var/run/mysqld/mysqld-3307.sock -
pid-file:避免多个实例写同一个 pid 文件,例如/var/run/mysqld/mysqld-3307.pid -
datadir:每个实例必须独立数据目录,不能共享 -
log-error:错误日志也要分开,不然混在一起根本没法排查
启动多实例时为什么总卡在“Starting MySQL”
常见原因是 socket 路径的父目录不存在,或权限不对——MySQL 启动时会尝试创建 socket 文件,但不会自动创建上层目录,也不会帮你 chown。
典型报错:Can't start server: can't create PID file: Permission denied 或静默失败。
- 手动创建 socket 和 pid 目录:
mkdir -p /var/run/mysqld - 设对属主:
chown mysql:mysql /var/run/mysqld(假设运行用户是mysql) - 确认
datadir下有正确的mysql系统库,且权限为mysql:mysql;新实例要用mysqld --initialize --user=mysql --datadir=/path/to/data3307初始化 - 别用
service mysql start启动多实例——它只认默认配置;改用mysqld --defaults-file=/etc/my-3307.cnf
连接多实例时 mysql 命令连错端口或 socket 怎么办
默认 mysql 客户端优先走 socket 连接(快且免网络),但如果你没指定,它永远连第一个实例的 socket(通常是 /var/run/mysqld/mysqld.sock),哪怕你加了 -P3307 也没用——因为 socket 优先级高于 port。
- 强制走 TCP:加
-h127.0.0.1 -P3307(注意是-h127.0.0.1,不是-hlocalhost;后者仍会走 socket) - 指定 socket 文件:
-S /var/run/mysqld/mysqld-3307.sock - 写进客户端配置文件(如
~/.my.cnf)时,记得加[client-3307]段,并用mysql --defaults-group-suffix=3307调用
systemd 管理多实例要注意什么
Ubuntu/Debian 默认的 mysql.service 不支持多实例,硬改会和系统升级冲突。稳妥做法是为每个实例写独立 service 文件,比如 /etc/systemd/system/mysqld@.service,用模板方式管理:
[Unit] Description=MySQL Server %i After=network.target [Service] Type=simple User=mysql Group=mysql ExecStart=/usr/bin/mysqld --defaults-file=/etc/mysql/my-%i.cnf Restart=on-failure [Install] WantedBy=multi-user.target
然后启用:systemctl enable mysqld@3307 → 它会自动加载 /etc/mysql/my-3307.cnf。注意 %i 是占位符,启动命令里必须带实例标识。
最容易被忽略的是:多个实例共用同一个 key_buffer_size 或 innodb_buffer_pool_size 值,内存会爆。每个实例的缓冲区参数得按比例下调,尤其当总内存有限时。











