在 CentOS 或 Ubuntu 系统中配置 MySQL 双实例(Multiple Instances)的核心思路是:为每个实例使用独立的端口、数据目录、Socket 文件、PID 文件和配置文件。以下是详细步骤(以 MySQL 8.0 为例,MySQL 5.7 类似):
✅ 前提条件
- 已安装 MySQL(推荐使用官方包或
yum/apt安装) - 确保系统用户有权限访问
/var/lib/mysql等目录 - 关闭防火墙或开放对应端口(如 3306, 3307)
📁 方案一:手动配置双实例(推荐用于生产/学习)
1️⃣ 创建独立的数据目录和日志目录
sudo mkdir -p /data/mysql/{instance1,data1,log1}
/data/mysql/{instance2,data2,log2}
sudo chown -R mysql:mysql /data/mysql
sudo chmod 750 /data/mysql
💡 建议将数据放在非默认路径(如
/data),避免与主实例冲突。
2️⃣ 初始化两个实例
初始化实例 1(端口 3306)
sudo mysqld --defaults-file=/etc/my.cnf.instance1
--initialize-insecure
--user=mysql
--datadir=/data/mysql/data1
--socket=/data/mysql/instance1/mysql.sock
--port=3306
--pid-file=/data/mysql/instance1/mysql.pid
--log-error=/data/mysql/log1/error.log
初始化实例 2(端口 3307)
sudo mysqld --defaults-file=/etc/my.cnf.instance2
--initialize-insecure
--user=mysql
--datadir=/data/mysql/data2
--socket=/data/mysql/instance2/mysql.sock
--port=3307
--pid-file=/data/mysql/instance2/mysql.pid
--log-error=/data/mysql/log2/error.log
⚠️
--initialize-insecure允许无密码启动(首次登录后需设置 root 密码)。若需安全初始化,去掉该参数并记录临时密码(查看error.log)。
3️⃣ 编写配置文件
/etc/my.cnf.instance1
[mysqld]
# 通用配置
basedir=/usr
datadir=/data/mysql/data1
socket=/data/mysql/instance1/mysql.sock
port=3306
pid-file=/data/mysql/instance1/mysql.pid
log-error=/data/mysql/log1/error.log
# 可选:调整参数
max_connections=200
innodb_buffer_pool_size=1G
[client]
port=3306
socket=/data/mysql/instance1/mysql.sock
/etc/my.cnf.instance2
[mysqld]
basedir=/usr
datadir=/data/mysql/data2
socket=/data/mysql/instance2/mysql.sock
port=3307
pid-file=/data/mysql/instance2/mysql.pid
log-error=/data/mysql/log2/error.log
max_connections=200
innodb_buffer_pool_size=1G
[client]
port=3307
socket=/data/mysql/instance2/mysql.sock
🔔 注意:
[client]段必须匹配对应实例的端口和 socket,否则mysql客户端会连错。
4️⃣ 启动两个实例
方式 A:直接启动(适合测试)
# 实例 1
sudo mysqld_safe --defaults-file=/etc/my.cnf.instance1 &
# 实例 2
sudo mysqld_safe --defaults-file=/etc/my.cnf.instance2 &
方式 B:通过 systemd 管理(推荐生产环境)
创建服务文件:
/etc/systemd/system/mysqld@instance1.service
[Unit]
Description=MySQL Instance 1
After=network.target
[Service]
Type=forking
User=mysql
Group=mysql
ExecStart=/usr/bin/mysqld_safe --defaults-file=/etc/my.cnf.instance1
ExecStop=/bin/kill $MAINPID
Restart=on-failure
LimitNOFILE=65535
[Install]
WantedBy=multi-user.target
/etc/systemd/system/mysqld@instance2.service
内容同上,仅 ExecStart 指向 .instance2 配置。
启用并启动:
sudo systemctl daemon-reload
sudo systemctl enable mysqld@instance1 mysqld@instance2
sudo systemctl start mysqld@instance1
sudo systemctl start mysqld@instance2
验证状态:
systemctl status mysqld@instance1
systemctl status mysqld@instance2
5️⃣ 连接测试
# 连接实例 1
mysql -S /data/mysql/instance1/mysql.sock -P 3306 -u root -p
# 连接实例 2
mysql -S /data/mysql/instance2/mysql.sock -P 3307 -u root -p
✅ 成功登录后,立即修改 root 密码:
ALTER USER 'root'@'localhost' IDENTIFIED BY 'your_strong_password'; FLUSH PRIVILEGES;
🛠️ 方案二:使用官方多实例脚本(MySQL 8+ 推荐)
MySQL 8.0+ 提供了 mysqld_multi 工具简化配置:
-
编辑
/etc/my.cnf.multi:[mysqld] # 基础共享配置(可选) basedir=/usr datadir=/data/mysql/data socket=/tmp/mysql.sock port=3306 user=mysql [mysqld1] datadir=/data/mysql/data1 socket=/data/mysql/instance1/mysql.sock port=3306 pid-file=/data/mysql/instance1/mysql.pid log-error=/data/mysql/log1/error.log [mysqld2] datadir=/data/mysql/data2 socket=/data/mysql/instance2/mysql.sock port=3307 pid-file=/data/mysql/instance2/mysql.pid log-error=/data/mysql/log2/error.log -
初始化:
mysqld_multi --defaults-file=/etc/my.cnf.multi init -
启动:
mysqld_multi --defaults-file=/etc/my.cnf.multi start 1 mysqld_multi --defaults-file=/etc/my.cnf.multi start 2
❗ 注意:
mysqld_multi对权限要求较严格,且部分功能在 MySQL 8 中已被弱化,更推荐方案一的手动 + systemd 方式。
🔐 安全加固建议
- 为每个实例创建独立 OS 用户(可选)
- 限制监听地址:
bind-address = 127.0.0.1 - 定期备份各实例数据
- 监控磁盘空间、连接数、慢查询
📌 常见问题排查
| 问题 | 解决方案 |
|---|---|
Can't connect to MySQL server on 'localhost:3306' |
检查 mysqld 是否运行、端口是否被占用、firewalld 规则 |
Access denied for user 'root'@'localhost' |
确认使用的是对应实例的 socket/port;检查 my.cnf 中 [client] 段 |
Error: Can't create directory |
检查目录权限:chown -R mysql:mysql /data/mysql |
| 启动后自动退出 | 查看 error.log 定位原因(如内存不足、权限错误) |
需要我提供:
- Docker 版双实例配置?
- 自动化部署脚本(Ansible/Bash)?
- 高可用方案(如 MHA/Orchestrator)扩展建议?
欢迎告诉我你的具体场景 😊
CLOUD技术笔记