MySQL官方自带的多实例管理工具mysqld_multi

mysqld_multi 是 MySQL 官方自带的 多实例管理工具,它能在同一台服务器上方便地启动、停止和监控多个 mysqld 实例,非常适合 DBA / SRE 在测试、开发或多业务分区场景下使用。


一、mysqld_multi 简介

作用:

  • 管理多个 mysqld 实例(启动、停止、查看状态)
  • 统一配置文件管理(共用一个 my.cnf
  • 避免手动启动多个 mysqld_safe 的繁琐

运行机制:

  • mysqld_multi 是一个 Perl 脚本(通常在 /usr/bin/mysqld_multi

  • 它读取 my.cnf 中的 [mysqldN] 配置段来识别不同实例

  • 每个实例必须使用:

    • 独立的 port
    • 独立的 socket
    • 独立的 datadir
    • 可选独立的 log-error

二、配置示例

假设我们要在一台服务器上运行两个实例:

  • 实例 1:端口 3306
  • 实例 2:端口 3307

编辑 /etc/my.cnf

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
[mysqld_multi]
mysqld = /usr/sbin/mysqld_safe
mysqladmin = /usr/bin/mysqladmin
user = multiadmin
password = 123456

[mysqld1]
socket = /data/mysql3306/mysql.sock
port = 3306
pid-file = /data/mysql3306/mysql.pid
datadir = /data/mysql3306/data
log-error = /data/mysql3306/error.log
user = mysql

[mysqld2]
socket = /data/mysql3307/mysql.sock
port = 3307
pid-file = /data/mysql3307/mysql.pid
datadir = /data/mysql3307/data
log-error = /data/mysql3307/error.log
user = mysql

注意:

  • datadir 需事先创建并初始化(使用 mysqld --initialize-insecuremysql_install_db
  • 每个实例都要有唯一的 socket、port、pid-file、日志路径

三、初始化数据目录

1
2
3
4
5
6
7
# 为实例1初始化
mysqld --initialize-insecure --user=mysql --datadir=/data/mysql3306/data

# 为实例2初始化
mysqld --initialize-insecure --user=mysql --datadir=/data/mysql3307/data

chown -R mysql:mysql /data/mysql*

四、使用 mysqld_multi 管理实例

启动所有实例

1
mysqld_multi start

启动指定实例

1
2
mysqld_multi start 1
mysqld_multi start 2

停止指定实例

1
mysqld_multi stop 2

查看状态

1
mysqld_multi report

输出示例:

Reporting MySQL servers
MySQL server from group: mysqld1 is running
MySQL server from group: mysqld2 is not running

五、权限安全

mysqld_multi 登录需要管理账号:

1
2
mysql> CREATE USER 'multiadmin'@'localhost' IDENTIFIED BY '123456';
mysql> GRANT SHUTDOWN, SUPER, PROCESS ON *.* TO 'multiadmin'@'localhost';

建议仅限 localhost,并且账号权限最小化。


六、结构图(Mermaid)

graph TD
    A[服务器] --> B[mysqld_multi 管理器]
    B --> C[mysqld1 实例
Port:3306
Socket:/data/mysql3306/mysql.sock] B --> D[mysqld2 实例
Port:3307
Socket:/data/mysql3307/mysql.sock] C --> E[DataDir:/data/mysql3306/data] D --> F[DataDir:/data/mysql3307/data]

七、常见问题(FAQ)

问题 原因与解决
启动时报错 “Can’t connect to local MySQL server” 检查 socket 路径或权限
一个实例启动失败 查看对应的 log-error 文件
“mysqld_multi cannot find mysqld_safe” 确认配置文件 [mysqld_multi] 段路径正确
实例冲突 确保端口、socket、pid-file 唯一