在Debian/Ubuntu系统中隔离运行多个MySQL服务,可以通过以下几种方法实现:
方法一:使用不同端口和配置目录(推荐)
1. 准备配置目录
# 创建独立的配置和数据目录
sudo mkdir -p /etc/mysql2
sudo mkdir -p /var/lib/mysql2
sudo chown mysql:mysql /var/lib/mysql2
2. 复制并修改配置文件
# 复制默认配置
sudo cp /etc/mysql/my.cnf /etc/mysql2/my.cnf
# 编辑新配置文件
sudo nano /etc/mysql2/my.cnf
修改关键配置项:
[mysqld]
port = 3307 # 使用不同端口
socket = /var/run/mysqld/mysqld2.sock
datadir = /var/lib/mysql2 # 独立数据目录
pid-file = /var/run/mysqld/mysqld2.pid
log-error = /var/log/mysql/error2.log
3. 初始化数据目录
# 停止主MySQL服务
sudo systemctl stop mysql
# 初始化新实例
sudo mysqld --defaults-file=/etc/mysql2/my.cnf --initialize-insecure
# 或使用安全初始化(会生成随机root密码)
# sudo mysqld --defaults-file=/etc/mysql2/my.cnf --initialize
4. 创建Systemd服务文件
sudo nano /etc/systemd/system/mysql2.service
内容示例:
[Unit]
Description=MySQL Server 2
After=network.target
[Service]
Type=notify
User=mysql
Group=mysql
ExecStart=/usr/sbin/mysqld --defaults-file=/etc/mysql2/my.cnf
Restart=on-failure
RestartPreventExitStatus=1
[Install]
WantedBy=multi-user.target
5. 启动和管理
# 重载systemd
sudo systemctl daemon-reload
# 启动第二个实例
sudo systemctl start mysql2
# 设置开机启动
sudo systemctl enable mysql2
# 连接测试
mysql -h 127.0.0.1 -P 3307 -u root -p
方法二:使用MySQL官方多实例管理(mysqld_multi)
1. 配置mysqld_multi
sudo nano /etc/mysql/my.cnf
添加配置:
[mysqld_multi]
mysqld = /usr/bin/mysqld_safe
mysqladmin = /usr/bin/mysqladmin
user = multi_admin
password = multipass
[mysqld1]
port = 3306
socket = /tmp/mysql.sock
datadir = /var/lib/mysql
[mysqld2]
port = 3307
socket = /tmp/mysql2.sock
datadir = /var/lib/mysql2
2. 初始化和管理实例
# 初始化第二个实例
sudo mysql_install_db --datadir=/var/lib/mysql2
# 启动实例
sudo mysqld_multi start 2
# 查看状态
sudo mysqld_multi report
方法三:使用Docker容器(最隔离)
# 运行多个MySQL容器
docker run --name mysql1 -e MYSQL_ROOT_PASSWORD=pass1 -p 3306:3306 -d mysql:8.0
docker run --name mysql2 -e MYSQL_ROOT_PASSWORD=pass2 -p 3307:3306 -d mysql:8.0
方法四:使用AppArmor/SELinux增强隔离
对于需要更严格隔离的场景:
# 创建自定义AppArmor配置
sudo cp /etc/apparmor.d/usr.sbin.mysqld /etc/apparmor.d/usr.sbin.mysqld2
sudo nano /etc/apparmor.d/usr.sbin.mysqld2
# 修改路径限制
# 将原有路径改为新实例的路径
/var/lib/mysql2/** rwk,
/etc/mysql2/** r,
实用脚本示例
创建管理脚本 /usr/local/bin/mysql-multi-admin:
#!/bin/bash
case $1 in
start)
systemctl start mysql
systemctl start mysql2
;;
stop)
systemctl stop mysql2
systemctl stop mysql
;;
status)
systemctl status mysql
systemctl status mysql2
;;
*)
echo "Usage: $0 {start|stop|status}"
exit 1
;;
esac
注意事项
- 资源限制:确保系统有足够内存和CPU资源
- 端口冲突:避免端口冲突,常用备用端口:3307, 3308, 3309
- 备份策略:每个实例需要独立的备份计划
- 监控:分别监控每个实例的性能指标
- 防火墙:根据需要配置防火墙规则
验证隔离效果
# 检查进程隔离
ps aux | grep mysqld
# 检查网络隔离
netstat -tlnp | grep mysql
# 测试连接
mysql -h 127.0.0.1 -P 3306 -u root -p
mysql -h 127.0.0.1 -P 3307 -u root -p
推荐使用方法一,它结合了良好的隔离性和易管理性,适合生产环境使用。
CLOUD技术笔记