如何在Debian或Ubuntu系统中隔离运行多个MySQL服务?

在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

注意事项

  1. 资源限制:确保系统有足够内存和CPU资源
  2. 端口冲突:避免端口冲突,常用备用端口:3307, 3308, 3309
  3. 备份策略:每个实例需要独立的备份计划
  4. 监控:分别监控每个实例的性能指标
  5. 防火墙:根据需要配置防火墙规则

验证隔离效果

# 检查进程隔离
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

推荐使用方法一,它结合了良好的隔离性和易管理性,适合生产环境使用。

云服务器