如何在一台服务器部署多个mysql实例_mysql多实例部署方案

7次阅读

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

如何在一台服务器部署多个mysql实例_mysql多实例部署方案

一台服务器上部署多个 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.sockmysql -h127.0.0.1 -P3307

权限与资源控制建议

多个实例共享同一台物理机,需防止互相争抢资源:

  • 在配置中限制 innodb_buffer_pool_size 总和不超过物理内存的 60%~70%
  • 设置 max_connections 合理值,避免单个实例耗尽连接数
  • 使用 cgroups 或 systemd 的 MemoryLimit/CPUShares 限制各实例资源(高级但有效)
  • 所有数据目录和配置文件属主设为 mysql 用户,禁止 root 直接运行 mysqld 进程

不复杂但容易忽略。关键是每个实例“自成一体”,配置隔离、路径隔离、端口隔离,再辅以规范的启停管理,就能稳定运行多个 MySQL 实例。

text=ZqhQzanResources