在Ubuntu上运行两个MySQL服务(不同端口)可以通过多种方式实现,以下是两种主要方法:
方法一:使用不同配置文件运行多个实例(推荐)
1. 安装MySQL(如果尚未安装)
sudo apt update
sudo apt install mysql-server
2. 创建第二个实例的配置目录和数据目录
# 创建配置目录
sudo mkdir -p /etc/mysql/mysql2
sudo cp /etc/mysql/my.cnf /etc/mysql/mysql2/
# 创建数据目录
sudo mkdir -p /var/lib/mysql2
sudo chown mysql:mysql /var/lib/mysql2
3. 创建第二个实例的配置文件
编辑 /etc/mysql/mysql2/my.cnf:
[mysqld]
# 基础配置
user = mysql
pid-file = /var/run/mysqld/mysqld2.pid
socket = /var/run/mysqld/mysqld2.sock
port = 3307 # 使用不同端口
# 数据目录
datadir = /var/lib/mysql2
# 日志文件
log_error = /var/log/mysql/error2.log
# 避免与默认实例冲突
server-id = 2
# 其他配置(根据需要调整)
[mysql]
socket = /var/run/mysqld/mysqld2.sock
4. 初始化第二个实例的数据目录
sudo mysqld --defaults-file=/etc/mysql/mysql2/my.cnf --initialize-insecure
# 或使用安全初始化(会生成随机root密码)
# sudo mysqld --defaults-file=/etc/mysql/mysql2/my.cnf --initialize
5. 创建Systemd服务文件
创建 /etc/systemd/system/mysql2.service:
[Unit]
Description=MySQL Server 2
After=network.target
[Service]
Type=forking
User=mysql
Group=mysql
ExecStart=/usr/sbin/mysqld --defaults-file=/etc/mysql/mysql2/my.cnf
ExecStop=/usr/bin/mysqladmin --defaults-file=/etc/mysql/mysql2/my.cnf shutdown
Restart=on-failure
[Install]
WantedBy=multi-user.target
6. 启动和管理第二个实例
# 重新加载systemd配置
sudo systemctl daemon-reload
# 启动第二个实例
sudo systemctl start mysql2
# 设置开机自启
sudo systemctl enable mysql2
# 查看状态
sudo systemctl status mysql2
方法二:使用Docker运行多个MySQL实例
1. 安装Docker
sudo apt install docker.io
sudo systemctl start docker
sudo systemctl enable docker
2. 运行第二个MySQL实例
# 运行第二个MySQL实例在3307端口
sudo docker run -d
--name mysql2
-e MYSQL_ROOT_PASSWORD=your_password
-p 3307:3306
-v mysql2_data:/var/lib/mysql
mysql:8.0
# 查看运行状态
sudo docker ps
连接测试
连接默认实例(端口3306)
mysql -u root -p -h 127.0.0.1 -P 3306
连接第二个实例(端口3307)
mysql -u root -p -h 127.0.0.1 -P 3307
防火墙配置(如果需要远程访问)
# 允许3307端口
sudo ufw allow 3307/tcp
sudo ufw reload
注意事项
- 资源分配:确保系统有足够资源运行两个实例
- 端口冲突:确保选择的端口(如3307)未被其他服务占用
- 数据备份:分别备份每个实例的数据
- 监控:分别监控两个实例的性能和日志
- 连接管理:应用程序连接时需要指定正确的端口
快速检查脚本
#!/bin/bash
# 检查两个MySQL实例状态
echo "检查MySQL实例状态:"
echo "默认实例(3306):"
sudo systemctl status mysql --no-pager | grep Active
echo -e "n第二个实例(3307):"
sudo systemctl status mysql2 --no-pager | grep Active
echo -e "n端口监听情况:"
sudo netstat -tlnp | grep mysql
选择哪种方法取决于你的需求:方法一更适合生产环境,方法二更适合开发和测试环境。
CLOUD技术笔记