在阿里云的 Ubuntu 服务器上安装两个 MySQL 实例是可行的,但需要进行一些配置以避免端口冲突、数据目录冲突和进程管理问题。以下是详细步骤:
✅ 目标
在同一台 Ubuntu 服务器上运行 两个独立的 MySQL 实例,例如:
- 实例1:默认端口
3306(主实例) - 实例2:自定义端口
3307(副实例)
📌 前提条件
- 已登录阿里云 ECS 实例(Ubuntu 系统)
- 具备 root 或 sudo 权限
- 已安装一个 MySQL(可选,也可以从零开始装两个)
🔧 步骤一:安装第一个 MySQL(默认实例)
如果你还没有安装任何 MySQL,先安装第一个:
sudo apt update
sudo apt install mysql-server -y
启动并设置开机自启:
sudo systemctl start mysql
sudo systemctl enable mysql
运行安全初始化(可选):
sudo mysql_secure_installation
这个实例使用默认配置:端口
3306,数据目录/var/lib/mysql,配置文件/etc/mysql/mysql.conf.d/mysqld.cnf
🚀 步骤二:创建第二个 MySQL 实例
1. 创建新的数据目录和日志目录
sudo mkdir -p /var/lib/mysql2
sudo mkdir -p /var/log/mysql2
sudo chown -R mysql:mysql /var/lib/mysql2 /var/log/mysql2
2. 初始化第二个实例的数据目录
sudo mysqld --initialize --user=mysql --datadir=/var/lib/mysql2 --basedir=/usr
记住生成的临时 root 密码(在日志中),后续登录要用。
3. 创建第二个实例的配置文件
新建配置文件:
sudo nano /etc/mysql/mysql.conf.d/mysqld2.cnf
写入以下内容:
[mysqld]
# 基本设置
user = mysql
port = 3307
socket = /var/run/mysqld/mysqld2.sock
pid-file = /var/run/mysqld/mysqld2.pid
datadir = /var/lib/mysql2
log-error = /var/log/mysql2/error.log
server-id = 2
# 避免与第一个实例冲突
skip-networking = 0
bind-address = 127.0.0.1
# 可选:不同端口的 performance schema 端口等(如果需要)
performance_schema_port = 33071
保存退出。
4. 创建 systemd 服务文件(用于管理第二个实例)
sudo cp /lib/systemd/system/mysql.service /lib/systemd/system/mysql2.service
编辑新服务文件:
sudo nano /lib/systemd/system/mysql2.service
修改以下关键字段:
[Unit]
Description=MySQL Second Instance
After=network.target
After=syslog.target
Conflicts=mysql.service # 避免冲突
[Service]
User=mysql
Group=mysql
ExecStartPre=/bin/mkdir -p /var/run/mysqld
ExecStartPre=/bin/chown mysql:mysql /var/run/mysqld
ExecStart=/usr/sbin/mysqld --defaults-file=/etc/mysql/mysql.conf.d/mysqld2.cnf
ExecReload=/bin/kill -HUP $MAINPID
KillMode=mixed
TimeoutSec=60
Restart=on-failure
RestartPreventExitStatus=1
Type=notify
注意:
--defaults-file指向我们刚创建的mysqld2.cnf
5. 重新加载 systemd 并启动第二个实例
sudo systemctl daemon-reexec
sudo systemctl daemon-reload
sudo systemctl start mysql2
设置开机自启:
sudo systemctl enable mysql2
检查状态:
sudo systemctl status mysql2
🔐 步骤三:为第二个实例设置密码
使用临时密码登录(查看日志获取):
sudo grep 'temporary password' /var/log/mysql2/error.log
然后登录:
mysql -u root -p -h 127.0.0.1 -P 3307 --protocol=tcp
必须用
-h 127.0.0.1和--protocol=tcp才能通过 TCP 连接到 3307 端口(否则会尝试 socket)
首次登录后修改密码:
ALTER USER 'root'@'localhost' IDENTIFIED BY 'YourStrongPassword';
FLUSH PRIVILEGES;
EXIT;
🔍 测试连接
测试第一个实例:
mysql -u root -p -h 127.0.0.1 -P 3306
测试第二个实例:
mysql -u root -p -h 127.0.0.1 -P 3307
⚠️ 安全与网络注意事项(阿里云 ECS)
-
安全组规则:
- 如果你希望外部访问,需在阿里云控制台开放
3306和3307端口(建议仅对特定 IP 开放) - 生产环境不建议直接暴露 MySQL 端口,可通过 SSH 隧道或跳板机访问
- 如果你希望外部访问,需在阿里云控制台开放
-
防火墙(UFW):
sudo ufw allow from 192.168.1.100 to any port 3306,3307
🛠️ 常见问题排查
| 问题 | 解决方法 |
|---|---|
| 启动失败,权限错误 | 检查 /var/lib/mysql2 所有者是否为 mysql |
| 端口被占用 | 使用 netstat -tulnp | grep 3307 查看 |
| socket 文件路径冲突 | 确保每个实例的 socket 路径唯一 |
| 配置文件未加载 | 检查 --defaults-file 路径是否正确 |
✅ 总结
你现在拥有两个独立运行的 MySQL 实例:
| 实例 | 端口 | 数据目录 | 配置文件 | 服务名 |
|---|---|---|---|---|
| 第一个 | 3306 | /var/lib/mysql |
/etc/mysql/mysql.conf.d/mysqld.cnf |
mysql |
| 第二个 | 3307 | /var/lib/mysql2 |
/etc/mysql/mysql.conf.d/mysqld2.cnf |
mysql2 |
如需更多实例,可复制此流程,注意每次更换端口、目录、socket、服务名。
如有需要,我也可以提供一键部署脚本。欢迎继续提问!
CLOUD技术博