MySQL单机多实例部署主要有两种实用方案:mysqld_multi方案 和 独立配置文件方案。以下是两种方案的详细对比和实施步骤:
准备目录结构
mkdir -p /data/mysql/{3306,3307,3308}/{data,logs,binlog}
chown -R mysql:mysql /data/mysql
修改主配置文件 /etc/my.cnf
[mysqld_multi]
mysqld = /usr/bin/mysqld_safe
mysqladmin = /usr/bin/mysqladmin
user = multi_admin
password = your_password
[mysqld3306] port = 3306 socket = /tmp/mysql3306.sock datadir = /data/mysql/3306/data log-error = /data/mysql/3306/logs/error.log pid-file = /data/mysql/3306/mysql3306.pid
[mysqld3307] port = 3307 socket = /tmp/mysql3307.sock datadir = /data/mysql/3307/data log-error = /data/mysql/3307/logs/error.log pid-file = /data/mysql/3307/mysql3307.pid
[mysqld3308] port = 3308 socket = /tmp/mysql3308.sock datadir = /data/mysql/3308/data log-error = /data/mysql/3308/logs/error.log pid-file = /data/mysql/3308/mysql3308.pid
3. **初始化数据目录**
```bash
# 为每个实例初始化
mysqld --initialize-insecure --user=mysql \
--datadir=/data/mysql/3306/data
mysqld --initialize-insecure --user=mysql \
--datadir=/data/mysql/3307/data
mysqld --initialize-insecure --user=mysql \
--datadir=/data/mysql/3308/data
启动和管理实例
# 启动所有实例
mysqld_multi start
启动指定实例
mysqld_multi start 3306
停止指定实例mysqld_multi stop 3306
查看实例状态mysqld_multi report
## 方案二:独立配置文件方案(更灵活)
### 优点
- 配置隔离,互不影响
- 便于不同版本的MySQL部署
- 适合Docker容器化部署
### 部署步骤
1. **创建目录结构**
```bash
# 创建实例目录
for port in 3306 3307 3308; do
mkdir -p /mysql/${port}/{data,logs,conf,tmp}
done
chown -R mysql:mysql /mysql
为每个实例创建独立配置文件
实例1配置 /mysql/3306/conf/my.cnf
[client]
port = 3306
socket = /mysql/3306/mysql.sock
[mysqld]
port = 3306
socket = /mysql/3306/mysql.sock
datadir = /mysql/3306/data
log-error = /mysql/3306/logs/error.log
pid-file = /mysql/3306/mysql.pid
tmpdir = /mysql/3306/tmp
server-id = 1
# 避免端口冲突的参数
# 每个实例使用不同的参数
innodb_buffer_pool_size = 512M
实例2配置 /mysql/3307/conf/my.cnf
[client]
port = 3307
socket = /mysql/3307/mysql.sock
[mysqld]
port = 3307
socket = /mysql/3307/mysql.sock
datadir = /mysql/3307/data
log-error = /mysql/3307/logs/error.log
pid-file = /mysql/3307/mysql.pid
tmpdir = /mysql/3307/tmp
server-id = 2
innodb_buffer_pool_size = 256M
创建启动脚本 /etc/init.d/mysql-multi
#!/bin/bash
# 多实例启动脚本
case "$1" in start) for port in 3306 3307 3308; do if [ -f /mysql/${port}/conf/my.cnf ]; then echo "Starting MySQL instance on port ${port}..." mysqld_safe --defaults-file=/mysql/${port}/conf/my.cnf \ --user=mysql \ --datadir=/mysql/${port}/data \ --pid-file=/mysql/${port}/mysql.pid & fi done ;; stop) for port in 3306 3307 3308; do if [ -f /mysql/${port}/mysql.pid ]; then echo "Stopping MySQL instance on port ${port}..." mysqladmin -u root -S /mysql/${port}/mysql.sock shutdown fi done ;; restart) $0 stop sleep 5 $0 start ;; *) echo "Usage: $0 {start|stop|restart}" exit 1 ;; esac
4. **初始化并启动**
```bash
# 初始化每个实例
for port in 3306 3307 3308; do
mysqld --initialize-insecure \
--user=mysql \
--datadir=/mysql/${port}/data \
--defaults-file=/mysql/${port}/conf/my.cnf
done
# 启动所有实例
chmod +x /etc/init.d/mysql-multi
/etc/init.d/mysql-multi start
| 特性 | mysqld_multi方案 | 独立配置文件方案 |
|---|---|---|
| 配置管理 | 集中在一个文件 | 分散多个文件 |
| 隔离性 | 较低 | 较高 |
| 启动方式 | 统一命令管理 | 需自定义脚本 |
| 维护难度 | 简单 | 中等 |
| 适用场景 | 测试/开发环境 | 生产环境 |
| 版本隔离 | 不支持 | 支持 |
| 资源限制 | 统一配置 | 可独立配置 |
# 连接不同实例
mysql -P 3306 -S /tmp/mysql3306.sock -u root
mysql -P 3307 -S /tmp/mysql3307.sock -u root
mysql -P 3308 -S /tmp/mysql3308.sock -u root
# 或使用端口连接(需确保监听不同IP或配置不同端口)
mysql -h 127.0.0.1 -P 3306 -u root
mysql -h 127.0.0.1 -P 3307 -u root
资源分配
监控配置
备份策略
安全建议
选择方案时,根据实际需求:开发测试环境推荐mysqld_multi,生产环境推荐独立配置文件方案。