MySQL 多实例:从零搭建两个实例
一、为什么需要 MySQL 多实例
很多时候,为了充分利用服务器资源或省钱,都会需要 MySQL 多实例。
介绍:在一台物理服务器上运行多个独立的 MySQL 服务。
每个实例拥有:
- 独立的数据目录、配置文件、端口号、日志文件
- 独立的进程和系统资源分配(CPU、内存)
但是在学习的过程中我们可以了解到:数据库的数据目录、日志目录应该建在哪,配置文件怎么写,怎样为第二个实例创建服务单元,使得实例能被 systemctl 管理。
二、安装与配置过程
1. 安装并配置第一个实例
1.1 安装 MySQL 8 源
bash
# 下载 MySQL 8 的 Yum 源
wget http://dev.mysql.com/get/mysql84-community-release-el8-1.noarch.rpm
# 安装 Yum 源
sudo yum localinstall mysql84-community-release-el8-1.noarch.rpm
# 安装 MySQL 服务器
sudo yum install mysql-community-server
1.2 启动第一个实例并做初始配置
bash
# 启动第一个 MySQL 实例
sudo systemctl start mysqld
# 设置第一个 MySQL 实例开机自启
sudo systemctl enable mysqld
# 获取第一个实例的初始临时密码
sudo grep 'temporary password' /var/log/mysqld.log
# 登录第一个 MySQL 实例
mysql -u root -p
修改 root 用户密码:
sql
ALTER USER 'root'@'localhost' IDENTIFIED BY 'Qiubai@123';
2. 创建并配置第二个实例(重点在这)
重点在于实例 2 的创建配置。
2.1 创建独立的数据目录与日志目录
数据与日志的目录得单独创建,但同时别忘了把文件权限改为 mysql。
bash
# 创建第二个实例的数据目录
sudo mkdir -p /var/lib/mysql2
sudo chown -R mysql:mysql /var/lib/mysql2
# 创建第二个实例的日志目录
sudo mkdir -p /var/log/mysql2
sudo chown -R mysql:mysql /var/log/mysql2
2.2 单独创建配置文件
MySQL 配置文件也得单独创建。
bash
sudo vi /etc/my.cnf.d/mysql2.cnf
添加以下内容:
ini
[mysqld]
# 第二个实例的端口,避免与第一个实例冲突
port = 3307
# 第二个实例的数据目录
datadir = /var/lib/mysql2
# 第二个实例的日志文件路径
log-error = /var/log/mysql2/error.log
# 第二个实例的套接字文件路径
socket = /var/lib/mysql2/mysql.sock
# 服务器 ID,需要唯一
server-id = 2
2.3 初始化第二个实例
配置完毕后对实例初始化:
bash
sudo mysqld --defaults-file=/etc/my.cnf.d/mysql2.cnf --initialize --user=mysql
执行该命令后,会生成一个临时密码,使用以下命令获取:
bash
sudo grep 'temporary password' /var/log/mysql2/error.log
2.4 创建 systemd 服务文件
为了方便用 systemd 管理,创建第二个 MySQL 实例的服务文件:
bash
sudo vi /etc/systemd/system/mysqld2.service
添加以下内容:
ini
[Unit]
Description=MySQL Server 2
Documentation=man:mysqld(8)
Documentation=http://dev.mysql.com/doc/refman/en/using-systemd.html
After=network.target
After=syslog.target
[Install]
WantedBy=multi-user.target
[Service]
User=mysql
Group=mysql
ExecStart=/usr/sbin/mysqld --defaults-file=/etc/my.cnf.d/mysql2.cnf
LimitNOFILE=5000
Restart=on-failure
RestartPreventExitStatus=1
PrivateTmp=false
2.5 启动第二个实例并设置开机自启
bash
# 重新加载 systemd 管理器配置
sudo systemctl daemon-reload
# 启动第二个 MySQL 实例
sudo systemctl start mysqld2
# 设置第二个 MySQL 实例开机自启
sudo systemctl enable mysqld2
2.6 登录第二个实例并修改初始密码
bash
mysql -u root -p -P 3307 -S /var/lib/mysql2/mysql.sock
注意这里需要加
-P指明端口了。
输入之前获取的临时密码,登录成功后,修改 root 用户密码:
sql
ALTER USER 'root'@'localhost' IDENTIFIED BY 'Qiubai@123';
三、验证两个实例的状态(三个维度)
1. 直接分别登录 MySQL
bash
# 验证第一个实例
mysql -u root -p -P 3306
# 验证第二个实例
mysql -u root -p -P 3307 -S /var/lib/mysql2/mysql.sock
为什么第二个实例需要 -S + sock 路径?
从客户端访问的角度来说:
text
mysql -u root -p -P 3307 ← 没写 -h
│
└─ 客户端判断:没有 -h(或 -h localhost)
│
└─ 走 socket,去读【默认 socket 路径】
│
└─ 默认路径 = /var/lib/mysql/mysql.sock ← 这是实例 1 的!
│
└─ 结果:你连上的是 3306 那个实例
(-P 3307 被完全忽略)
2. 查看进程
bash
ps aux | grep mysqld | grep -v grep
3. 查看端口
bash
ss -lntp | grep mysql # 一定要确认端口未被占用
四、熟悉实例操作的常用命令
| 操作 | 命令 |
|---|---|
| 启动指定实例 | systemctl start mysqld |
| 停止指定实例 | systemctl stop mysqld2 |
| 查看日志 | tail -f /var/log/mysql2/error.log |
| 连接指定实例 | mysql -uroot -p -P 3307 -h 127.0.0.1 |
| 备份指定实例 | mysqldump -uroot -p -S /var/lib/mysql2/mysql.sock --all-databases > backup.sql |