一台服务器上部署多个 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 实例。
