mysql多实例本质是多个独立mysqld进程共存,必须严格隔离port、datadir、socket、pid-file和log-error五项,缺一即启动失败;配置需显式指定--defaults-file,初始化与启动均须设置--user=mysql并确保路径权限正确。

mysqld 进程本身不支持单进程多实例,所谓“MySQL多实例”就是多个独立的 mysqld 进程共存——只要端口、数据目录、socket、pid-file、错误日志路径全部隔离,就能稳定运行。
必须隔离的四个核心路径与端口
漏掉任意一项,启动必然失败,常见报错包括:Can't start server: Bind on TCP/IP port. Got error: 98: Address already in use 或 Table 'mysql.plugin' doesn't exist。
-
port:必须互不相同(如3306、3307、3308),且未被占用(可用ss -tuln | grep :3307检查) -
datadir:必须是全新空目录(不能复用已有实例的数据),例如/data/mysql/3307/data -
socket:本地连接依赖该文件,必须唯一,例如/tmp/mysql_3307.sock -
pid-file和log-error:避免进程误杀和日志混写,例如/data/mysql/3307/mysqld.pid和/data/mysql/3307/error.log
配置文件必须用 --defaults-file 显式指定
MySQL 8.0 初始化或启动时,不再默认读取 /etc/my.cnf;若省略 --defaults-file,mysqld --initialize-insecure 会按固定顺序查找配置(如 /etc/my.cnf、/etc/mysql/my.cnf),极易初始化到错误目录。
- 正确写法:
mysqld --defaults-file=/etc/my3307.cnf --initialize-insecure --user=mysql - 错误写法:
mysqld --initialize-insecure(行为不可控,可能覆盖其他实例数据) - Linux 下
--user=mysql不可省略,否则因权限不足无法写入datadir,报Permission denied
启动方式决定是否常驻后台
直接执行 mysqld 命令是前台阻塞模式,终端关闭即退出;生产环境必须用守护方式。
- 推荐
mysqld_safe --defaults-file=/etc/my3307.cnf &:兼容性好,自带异常重启逻辑 - systemd 用户可用
systemctl start mysqld@3307,但要求 unit 文件中定义了[mysqld@3307]段落,且ExecStart中已嵌入--defaults-file=... - 切勿用
systemctl start mysqld启动非默认实例——它只认[mysqld]段,与其他实例无关
Windows 和 Linux 的路径/权限陷阱
最容易被忽略的不是逻辑,而是细节:
- Linux 下
datadir目录需chown mysql:mysql且chmod 750,否则初始化失败 - Windows 下配置文件路径里的反斜杠
必须转义为双反斜杠\或统一用正斜杠/,否则mysqld --install解析失败 - 所有路径(尤其是
basedir)不能含中文、空格或特殊符号,否则mysqld启动时静默退出











