在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
注意事项
- 端口冲突:确保每个实例使用不同的端口
- 数据目录:每个实例必须有独立的数据目录
- 资源分配:监控系统资源,避免过度消耗
- 备份策略:为每个实例制定独立的备份计划
- 防火墙:配置防火墙规则开放相应端口
推荐方案
- 生产环境:使用方法一(多个配置文件),稳定性最好
- 开发测试:使用方法二(MySQL Sandbox)或方法三(Docker),部署快速
- 传统方案:使用方法四(mysqld_multi),但MySQL 8.0已不推荐使用
选择哪种方法取决于具体需求,如资源限制、隔离要求和维护复杂度等。
CLOUD技术笔记