一台服务器部署多个MySQL实例需严格隔离配置、数据目录、端口及进程,通过独立my.cnf、专属启动脚本和mysqld/mysqld_safe启动,确保port、socket、datadir等参数唯一,并合理控制资源与权限。

一台服务器上部署多个 MySQL 实例,核心在于隔离配置、数据目录、端口和进程管理。不依赖虚拟化或容器时,推荐使用 MySQL 官方支持的多实例方式——即为每个实例指定独立的 my.cnf 配置文件 和 启动脚本,通过 mysqld_safe 或 mysqld 直接启动多个独立服务。
准备独立的实例目录结构
每个实例需有专属的数据目录、socket 文件、错误日志、pid 文件和配置文件。建议按端口号组织目录,例如:
- /data/mysql/3307/ —— 数据目录(含 ibdata1、mysql/、sys/ 等)
- /etc/my_3307.cnf —— 实例专属配置文件
- /var/run/mysqld/mysqld_3307.pid —— PID 文件
- /var/log/mysql/error_3307.log —— 错误日志
初始化新实例前,先用 mysqld --initialize --datadir=/data/mysql/3307 --user=mysql 生成初始数据和临时密码。
配置文件关键参数必须唯一
每个 my_xxx.cnf 中以下参数不可重复,否则启动失败或产生冲突:
- port:如 3307、3308、3309
- socket:如 /tmp/mysql_3307.sock
- datadir:指向对应实例的数据目录
- pid-file:如 /var/run/mysqld/mysqld_3307.pid
- log-error:如 /var/log/mysql/error_3307.log
- server-id:主从复制场景下必须全局唯一(即使暂不启用复制也建议设)
启动与管理多个实例
避免使用系统级 service mysql 启动(它只认 /etc/my.cnf),改用以下方式:
- 手动启动:
mysqld --defaults-file=/etc/my_3307.cnf & - 用 mysqld_safe(更稳妥):
mysqld_safe --defaults-file=/etc/my_3307.cnf & - 写 systemd service 文件(推荐长期运行):为每个实例创建
/etc/systemd/system/mysqld@3307.service,利用模板实例化 - 连接时指定 socket 或 host+port:
mysql -S /tmp/mysql_3307.sock或mysql -h127.0.0.1 -P3307
权限与资源控制建议
多个实例共享同一台物理机,需防止互相争抢资源:
- 在配置中限制 innodb_buffer_pool_size 总和不超过物理内存的 60%~70%
- 设置 max_connections 合理值,避免单个实例耗尽连接数
- 使用 cgroups 或 systemd 的 MemoryLimit/CPUShares 限制各实例资源(高级但有效)
- 所有数据目录和配置文件属主设为 mysql 用户,禁止 root 直接运行 mysqld 进程
不复杂但容易忽略。关键是每个实例“自成一体”,配置隔离、路径隔离、端口隔离,再辅以规范的启停管理,就能稳定运行多个 MySQL 实例。










