CentOS或Ubuntu系统中怎样配置MySQL双实例?

在 CentOS 或 Ubuntu 系统中配置 MySQL 双实例(Multiple Instances)的核心思路是:为每个实例使用独立的端口、数据目录、Socket 文件、PID 文件和配置文件。以下是详细步骤(以 MySQL 8.0 为例,MySQL 5.7 类似):


✅ 前提条件

  • 已安装 MySQL(推荐使用官方包或 yum/apt 安装)
  • 确保系统用户有权限访问 /var/lib/mysql 等目录
  • 关闭防火墙或开放对应端口(如 3306, 3307)

📁 方案一:手动配置双实例(推荐用于生产/学习)

1️⃣ 创建独立的数据目录和日志目录

sudo mkdir -p /data/mysql/{instance1,data1,log1} 
                 /data/mysql/{instance2,data2,log2}
sudo chown -R mysql:mysql /data/mysql
sudo chmod 750 /data/mysql

💡 建议将数据放在非默认路径(如 /data),避免与主实例冲突。


2️⃣ 初始化两个实例

初始化实例 1(端口 3306)

sudo mysqld --defaults-file=/etc/my.cnf.instance1 
            --initialize-insecure 
            --user=mysql 
            --datadir=/data/mysql/data1 
            --socket=/data/mysql/instance1/mysql.sock 
            --port=3306 
            --pid-file=/data/mysql/instance1/mysql.pid 
            --log-error=/data/mysql/log1/error.log

初始化实例 2(端口 3307)

sudo mysqld --defaults-file=/etc/my.cnf.instance2 
            --initialize-insecure 
            --user=mysql 
            --datadir=/data/mysql/data2 
            --socket=/data/mysql/instance2/mysql.sock 
            --port=3307 
            --pid-file=/data/mysql/instance2/mysql.pid 
            --log-error=/data/mysql/log2/error.log

⚠️ --initialize-insecure 允许无密码启动(首次登录后需设置 root 密码)。若需安全初始化,去掉该参数并记录临时密码(查看 error.log)。


3️⃣ 编写配置文件

/etc/my.cnf.instance1

[mysqld]
# 通用配置
basedir=/usr
datadir=/data/mysql/data1
socket=/data/mysql/instance1/mysql.sock
port=3306
pid-file=/data/mysql/instance1/mysql.pid
log-error=/data/mysql/log1/error.log

# 可选:调整参数
max_connections=200
innodb_buffer_pool_size=1G

[client]
port=3306
socket=/data/mysql/instance1/mysql.sock

/etc/my.cnf.instance2

[mysqld]
basedir=/usr
datadir=/data/mysql/data2
socket=/data/mysql/instance2/mysql.sock
port=3307
pid-file=/data/mysql/instance2/mysql.pid
log-error=/data/mysql/log2/error.log

max_connections=200
innodb_buffer_pool_size=1G

[client]
port=3307
socket=/data/mysql/instance2/mysql.sock

🔔 注意:[client] 段必须匹配对应实例的端口和 socket,否则 mysql 客户端会连错。


4️⃣ 启动两个实例

方式 A:直接启动(适合测试)

# 实例 1
sudo mysqld_safe --defaults-file=/etc/my.cnf.instance1 &

# 实例 2
sudo mysqld_safe --defaults-file=/etc/my.cnf.instance2 &

方式 B:通过 systemd 管理(推荐生产环境)

创建服务文件:

/etc/systemd/system/mysqld@instance1.service

[Unit]
Description=MySQL Instance 1
After=network.target

[Service]
Type=forking
User=mysql
Group=mysql
ExecStart=/usr/bin/mysqld_safe --defaults-file=/etc/my.cnf.instance1
ExecStop=/bin/kill $MAINPID
Restart=on-failure
LimitNOFILE=65535

[Install]
WantedBy=multi-user.target

/etc/systemd/system/mysqld@instance2.service
内容同上,仅 ExecStart 指向 .instance2 配置。

启用并启动:

sudo systemctl daemon-reload
sudo systemctl enable mysqld@instance1 mysqld@instance2
sudo systemctl start mysqld@instance1
sudo systemctl start mysqld@instance2

验证状态:

systemctl status mysqld@instance1
systemctl status mysqld@instance2

5️⃣ 连接测试

# 连接实例 1
mysql -S /data/mysql/instance1/mysql.sock -P 3306 -u root -p

# 连接实例 2
mysql -S /data/mysql/instance2/mysql.sock -P 3307 -u root -p

✅ 成功登录后,立即修改 root 密码:

ALTER USER 'root'@'localhost' IDENTIFIED BY 'your_strong_password';
FLUSH PRIVILEGES;

🛠️ 方案二:使用官方多实例脚本(MySQL 8+ 推荐)

MySQL 8.0+ 提供了 mysqld_multi 工具简化配置:

  1. 编辑 /etc/my.cnf.multi

    [mysqld]
    # 基础共享配置(可选)
    basedir=/usr
    datadir=/data/mysql/data
    socket=/tmp/mysql.sock
    port=3306
    user=mysql
    
    [mysqld1]
    datadir=/data/mysql/data1
    socket=/data/mysql/instance1/mysql.sock
    port=3306
    pid-file=/data/mysql/instance1/mysql.pid
    log-error=/data/mysql/log1/error.log
    
    [mysqld2]
    datadir=/data/mysql/data2
    socket=/data/mysql/instance2/mysql.sock
    port=3307
    pid-file=/data/mysql/instance2/mysql.pid
    log-error=/data/mysql/log2/error.log
  2. 初始化:

    mysqld_multi --defaults-file=/etc/my.cnf.multi init
  3. 启动:

    mysqld_multi --defaults-file=/etc/my.cnf.multi start 1
    mysqld_multi --defaults-file=/etc/my.cnf.multi start 2

❗ 注意:mysqld_multi 对权限要求较严格,且部分功能在 MySQL 8 中已被弱化,更推荐方案一的手动 + systemd 方式


🔐 安全加固建议

  • 为每个实例创建独立 OS 用户(可选)
  • 限制监听地址:bind-address = 127.0.0.1
  • 定期备份各实例数据
  • 监控磁盘空间、连接数、慢查询

📌 常见问题排查

问题 解决方案
Can't connect to MySQL server on 'localhost:3306' 检查 mysqld 是否运行、端口是否被占用、firewalld 规则
Access denied for user 'root'@'localhost' 确认使用的是对应实例的 socket/port;检查 my.cnf[client]
Error: Can't create directory 检查目录权限:chown -R mysql:mysql /data/mysql
启动后自动退出 查看 error.log 定位原因(如内存不足、权限错误)

需要我提供:

  • Docker 版双实例配置?
  • 自动化部署脚本(Ansible/Bash)?
  • 高可用方案(如 MHA/Orchestrator)扩展建议?

欢迎告诉我你的具体场景 😊

云服务器