Ubuntu系统下如何部署多个MySQL实例?

在Ubuntu系统下部署多个MySQL实例有多种方法,以下是几种常见方案:

方法一:使用多个配置文件(推荐)

1. 安装MySQL

sudo apt update
sudo apt install mysql-server

2. 创建第二个实例的数据目录和配置

# 创建数据目录
sudo mkdir -p /var/lib/mysql2
sudo chown mysql:mysql /var/lib/mysql2

# 创建配置文件
sudo cp /etc/mysql/mysql.conf.d/mysqld.cnf /etc/mysql/mysql2.cnf

3. 修改第二个实例的配置文件

编辑 /etc/mysql/mysql2.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

# 其他需要修改的配置
server-id = 2  # 如果是主从复制需要

4. 初始化第二个实例

# 停止默认MySQL服务
sudo systemctl stop mysql

# 初始化数据目录
sudo mysqld --defaults-file=/etc/mysql/mysql2.cnf --initialize-insecure
# 或使用安全初始化(会生成随机root密码)
# sudo mysqld --defaults-file=/etc/mysql/mysql2.cnf --initialize

# 启动默认MySQL服务
sudo systemctl start mysql

5. 创建启动脚本

创建 /etc/systemd/system/mysql2.service

[Unit]
Description=MySQL Server 2
After=network.target

[Service]
Type=simple
User=mysql
Group=mysql
ExecStart=/usr/sbin/mysqld --defaults-file=/etc/mysql/mysql2.cnf
Restart=on-failure

[Install]
WantedBy=multi-user.target

6. 启动和管理

# 重新加载systemd
sudo systemctl daemon-reload

# 启动第二个实例
sudo systemctl start mysql2

# 设置开机启动
sudo systemctl enable mysql2

# 连接第二个实例
mysql -u root -P 3307 -S /var/run/mysqld/mysqld2.sock

方法二:使用MySQL Sandbox(快速测试)

1. 安装MySQL Sandbox

# 下载MySQL Sandbox
wget https://github.com/datacharmer/mysql-sandbox/releases/download/3.2.17/MySQL-Sandbox-3.2.17.tar.gz
tar -xzf MySQL-Sandbox-3.2.17.tar.gz
cd MySQL-Sandbox-3.2.17
perl Makefile.PL
make
sudo make install

# 或直接安装
sudo apt install mysql-sandbox

2. 部署多个实例

# 下载MySQL二进制包(如果需要)
wget https://dev.mysql.com/get/Downloads/MySQL-8.0/mysql-8.0.33-linux-glibc2.17-x86_64-minimal.tar.xz

# 创建多个实例
make_sandbox mysql-8.0.33-linux-glibc2.17-x86_64-minimal.tar.xz
make_multiple_sandbox --how_many_nodes=3 8.0.33

方法三:使用Docker(容器化部署)

1. 安装Docker

sudo apt install docker.io
sudo systemctl start docker
sudo systemctl enable docker

2. 部署多个MySQL容器

# 第一个实例
docker run -d 
  --name mysql1 
  -e MYSQL_ROOT_PASSWORD=password1 
  -p 3306:3306 
  mysql:8.0

# 第二个实例
docker run -d 
  --name mysql2 
  -e MYSQL_ROOT_PASSWORD=password2 
  -p 3307:3306 
  mysql:8.0

# 第三个实例
docker run -d 
  --name mysql3 
  -e MYSQL_ROOT_PASSWORD=password3 
  -p 3308:3306 
  mysql:8.0

方法四:使用mysqld_multi

1. 配置mysqld_multi

编辑 /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.sock1
datadir = /var/lib/mysql1
pid-file = /var/lib/mysql1/mysql.pid

[mysqld2]
port = 3307
socket = /tmp/mysql.sock2
datadir = /var/lib/mysql2
pid-file = /var/lib/mysql2/mysql.pid

2. 管理多个实例

# 启动所有实例
sudo mysqld_multi start

# 启动特定实例
sudo mysqld_multi start 1
sudo mysqld_multi start 2

# 查看状态
sudo mysqld_multi report

# 停止实例
sudo mysqld_multi stop 1

连接不同实例的方法

# 通过不同端口连接
mysql -u root -P 3306 -h 127.0.0.1
mysql -u root -P 3307 -h 127.0.0.1

# 通过不同socket连接
mysql -u root -S /var/run/mysqld/mysqld.sock
mysql -u root -S /var/run/mysqld/mysqld2.sock

注意事项

  1. 端口冲突:确保每个实例使用不同的端口
  2. 数据目录:每个实例必须有独立的数据目录
  3. 资源分配:监控系统资源,避免过度消耗
  4. 备份策略:为每个实例制定独立的备份计划
  5. 防火墙:配置防火墙规则开放相应端口

推荐方案

  • 生产环境:使用方法一(多个配置文件),稳定性最好
  • 开发测试:使用方法二(MySQL Sandbox)或方法三(Docker),部署快速
  • 传统方案:使用方法四(mysqld_multi),但MySQL 8.0已不推荐使用

选择哪种方法取决于具体需求,如资源限制、隔离要求和维护复杂度等。

云服务器