Mysql多实例——一个服务器多个mysql服务

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
相关推荐
程序猿老A1 小时前
云服务器怎么配置OSS?
运维·服务器
对讲机数码科普1 小时前
数字集群对讲工程全流程拆解:DMR/ePDT 制式选型、组网落地与运维实战
运维·软件工程
加油yx1 小时前
数据库基础
数据库
天桥下的卖艺者1 小时前
chrals.CTI函数升级版发布,增加了CTI衍生的脂肪指数提取
数据库·r语言
程序猿老A1 小时前
从入门型到企业型:云服务器开放共享型到独享型规格升级变配
运维·服务器
吴声子夜歌1 小时前
Nginx应用与运维——Nginx代理服务应用实战(TCP/UDP代理)
运维·tcp/ip·nginx
吴声子夜歌1 小时前
Nginx应用与运维——Nginx缓存服务应用实战(一)
运维·nginx·缓存
海宇数据1 小时前
零信任架构实战:基于海宇活体识别V步骤1构建自动化考前活体认证网关
运维·人工智能·架构·自动化
帷幕落秋1 小时前
Mysql备份
运维·数据库