必须确保端口、socket、datadir、pid-file、log-error五者全部独立;推荐用systemd模板或mysqld_safe启动,连接时须显式指定-s socket或-h 127.0.0.1 -p端口。

能,但必须让每个实例“互不碰面”——端口、socket、数据目录、pid 文件、错误日志,五者全部独立,缺一不可。用 mysqld_multi 看似省事,实际埋坑最多,生产环境不建议。
每个实例必须独占这 5 个路径和端口
操作系统靠这些标识区分进程,冲突就起不来或连错库:
-
port:比如3307、3308、3309,不能和已运行的3306或其他服务重复 -
socket:本地连接用,例如/tmp/mysql_3307.sock,不能共用/tmp/mysql.sock -
datadir:必须是全新空目录,如/data/mysql/3307/data,严禁复用或软链到别处 -
pid-file:如/var/run/mysqld/mysqld_3307.pid,systemd 停止时靠它找进程 -
log-error:如/var/log/mysql/error_3307.log,初始化失败时全靠它查原因
初始化必须用 --initialize,且指定完整参数
只跑 mysqld --initialize --datadir=/data/mysql/3307 很大概率失败——它会按默认值去配 socket、port、log-error,而这些默认值早被第一个实例占了。
正确做法是显式传全:
mysqld --initialize \ --user=mysql \ --basedir=/usr \ --datadir=/data/mysql/3307/data \ --socket=/tmp/mysql_3307.sock \ --port=3307 \ --pid-file=/var/run/mysqld/mysqld_3307.pid \ --log-error=/var/log/mysql/error_3307.log
执行完立刻去 error_3307.log 最末行找临时密码,像 A temporary password is generated for root@localhost: xxxxxx,丢了就得重初始化。
启动别碰 system service mysql,改用 mysqld_safe 或 systemd 模板
系统级 service mysql start 只读 /etc/my.cnf,强行启动多实例会覆盖或报错。
推荐两种方式:
- 手动测试用:
mysqld_safe --defaults-file=/etc/my_3307.cnf &,自带守护和错误重拉 - 长期运行用:写
/etc/systemd/system/mysqld@.service模板,然后启用systemctl enable mysqld@3307—— 这样systemctl status mysqld@3307才真能看对应实例
切记:每个 .service 文件里 ExecStart 必须带 --defaults-file,否则还是走全局配置。
连接时必须显式指定 -S 或 -P,不能只写 -h localhost
mysql -h localhost 默认走 socket,但若你没设 socket 参数或设错了路径,它会 fallback 到 /tmp/mysql.sock,连上的是第一个实例。
安全写法只有两个:
- 本地连接:
mysql -S /tmp/mysql_3307.sock(强制走指定 socket) - TCP 连接:
mysql -h 127.0.0.1 -P 3307(-h localhost不行,它会走 socket)
很多脚本连串了还查不出问题,就卡在这一步。











