MySQL单机多实例部署主要有两种实用方案:mysqld_multi方案 和 独立配置文件方案。以下是两种方案的详细对比和实施步骤:
方案一:mysqld_multi方案(官方推荐)
优点
- MySQL官方提供的标准工具
- 统一管理,操作方便
- 配置文件集中管理
部署步骤
准备目录结构
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
最佳实践建议
资源分配
- 为每个实例分配独立的资源限制
- 使用cgroups限制CPU和内存
监控配置
备份策略
安全建议
- 不同实例使用不同的账号
- 独立设置权限
- 定期审计日志
选择方案时,根据实际需求:开发测试环境推荐mysqld_multi,生产环境推荐独立配置文件方案。