Mysql二进制部署以及多实例部署
一、包管理器安装
核心前提
- 支持系统:Rocky9(RHEL 衍生版)、Ubuntu24(Debian 衍生版)
- 安装对象:MySQL 8.0/8.4(LTS 稳定版)、MariaDB 10.5/11.8(兼容 MySQL 分支)
- 核心逻辑:通过系统包管理器(
yum/apt)安装,先配置对应版本软件源,避免版本冲突 - 关键目录:系统默认路径(数据、配置、日志文件位置固定,需熟悉分布)
包管理器安装默认目录结构解析
1. Rocky9 系统默认目录(MySQL/MariaDB 通用)
| 目录/文件路径 | 核心作用 | 包含关键内容 |
|---|---|---|
/var/lib/mysql |
数据目录(核心) | 系统数据库(mysql/information_schema)、用户数据库文件、mysql.sock 套接字文件 |
/etc/my.cnf |
主配置文件 | 全局配置入口,通过 !includedir 引入 /etc/my.cnf.d/ 目录下的细分配置 |
/etc/my.cnf.d/ |
细分配置目录 | mariadb-server.cnf(服务端配置)、client.cnf(客户端配置)、mysql-clients.cnf |
/var/log/mariadb/mariadb.log |
日志文件(MariaDB) | 错误日志、启动日志,排查服务启动失败关键 |
/var/log/mysqld.log |
日志文件(MySQL) | 错误日志、临时密码记录(MySQL 8.4+ 首次安装必需) |
/usr/bin/ |
客户端工具目录 | mysql(命令行客户端)、mysqladmin(管理工具)、mysqldump(备份工具) |
/usr/sbin/ |
服务端程序目录 | mysqld(MySQL 服务进程)、mariadbd(MariaDB 服务进程,软链接到 mysqld) |
2. Ubuntu24 系统默认目录(MySQL/MariaDB 通用)
| 目录/文件路径 | 核心作用 | 包含关键内容 |
|---|---|---|
/var/lib/mysql |
数据目录(核心) | 系统数据库、用户数据文件、mysql.sock(默认路径) |
/etc/mysql/ |
主配置目录 | my.cnf(主配置入口)、conf.d/(客户端配置)、mysql.conf.d/(服务端配置) |
/etc/mysql/mysql.conf.d/mysqld.cnf |
MySQL 服务端配置文件 | 端口(port=3306)、绑定地址(bind-address)、日志路径配置 |
/etc/mysql/mariadb.conf.d/50-server.cnf |
MariaDB 服务端配置文件 | 数据目录(datadir=/var/lib/mysql)、日志配置 |
/var/log/mysql/ |
日志目录 | error.log(错误日志)、slow.log(慢查询日志,需手动开启) |
/usr/bin/ |
客户端工具目录 | mysql、mysqladmin、mysqldump 等工具 |
Rocky9 环境实操
安装 MySQL 8.0(系统默认源)
bash
# 1. 配置阿里云镜像(提升下载速度)
sed -e 's|^mirrorlist=|#mirrorlist=|g' \
-e 's|^#baseurl=http://dl.rockylinux.org/$contentdir|baseurl=https://mirrors.aliyun.com/rockylinux|g' \
-i.bak /etc/yum.repos.d/rocky*.repo
yum makecache
# 2. 安装 MySQL 8.0(实际为 MariaDB 兼容包)
yum install -y mysql mysql-server
# 3. 启动服务并设置开机自启
systemctl enable --now mysqld.service
# 4. 验证安装(含目录结构检查)
systemctl status mysqld.service # 查看服务状态(应显示 active running)
ss -tnlp | grep mysql # 查看端口监听(默认 3306)
ll /var/lib/mysql # 验证数据目录文件(应生成 auto.cnf、mysql 目录等)
ll /etc/my.cnf.d/ # 查看细分配置目录(含 client.cnf、mariadb-server.cnf)
mysql # 空密码直接登录(默认用户 root)
mysql> select version(); # 查看版本(应返回 8.0.41 兼容版)
mysql> exit; # 退出连接
安装 MariaDB 10.5(系统默认源)
bash
# 1. 安装 MariaDB 及 PAM 插件(避免权限报错)
yum install -y mariadb-server mariadb-pam
# 2. 启动服务
systemctl enable --now mariadb
# 3. 验证特性(含目录差异检查)
ss -tnlp | grep mariadb # 仅监听 3306 端口(无 33060 端口,MariaDB 特性)
ll /usr/sbin/mysqld # 查看软链接(应显示 -> /usr/libexec/mariadbd)
ll /var/log/mariadb/mariadb.log # 验证日志文件生成
mysql -e "select version();" # 验证 10.5 版本
安装 MySQL 8.4 LTS(官方源)
bash
# 1. 配置 MySQL 官方 YUM 源
mkdir /data/softs -p && cd /data/softs
wget https://dev.mysql.com/get/mysql84-community-release-el9-2.noarch.rpm
rpm -ivh mysql84-community-release-el9-2.noarch.rpm
# 2. 安装 MySQL 8.4
yum install -y mysql-community-server
# 3. 启动服务
systemctl enable --now mysqld
# 4. 关键验证(目录与日志)
ll /var/lib/mysql # 数据目录新增 mysql.ibd、undo_001 等 InnoDB 文件
grep 'temporary password' /var/log/mysqld.log # 从日志获取临时密码(MySQL 8.4 特性)
# 5. 登录并修改密码(需满足:大小写+数字+特殊字符,长度≥8)
mysql -uroot -p'临时密码'
ALTER USER 'root'@'localhost' IDENTIFIED BY 'Evan@1234';
FLUSH PRIVILEGES; # 刷新权限
exit
# 6. 验证登录
mysql -uroot -p'Sswang@1234' -e "select version();"
安装 MariaDB 11.8 LTS(清华源)
bash
# 1. 配置清华源
cat > /etc/yum.repos.d/Mariadb.repo <<-eof
[mariadb]
name = MariaDB
baseurl = https://mirrors.tuna.tsinghua.edu.cn/mariadb/yum/11.8/rhel/\$releasever/\$basearch
gpgkey = https://mirrors.tuna.tsinghua.edu.cn/mariadb/yum/RPM-GPG-KEY-MariaDB
gpgcheck = 1
eof
yum makecache
# 2. 安装 MariaDB 11.8
yum install -y MariaDB-server
# 3. 启动服务与验证
systemctl enable --now mariadb
ll /var/lib/mysql # 新增 undo001/undo002/undo003(MariaDB 11.8 新增 undo 日志文件)
mysql -e "select version();" # 应返回 11.8.2 版本
Ubuntu24 环境实操
安装 MySQL 8.0(系统默认源)
bash
# 1. 更换阿里云镜像
sed -i "s/cn.archive.ubuntu.com/mirrors.aliyun.com/g" /etc/apt/sources.list.d/ubuntu.sources
sed -i "s/security.ubuntu.com/mirrors.aliyun.com/g" /etc/apt/sources.list.d/ubuntu.sources
apt update
# 2. 安装 MySQL 8.0
apt install -y mysql-server
# 3. 启动服务与目录验证
systemctl enable --now mysql
ll /var/lib/mysql # 查看数据目录(含 #ib_16384_0.dblwr 等 InnoDB 文件)
ll /etc/mysql/mysql.conf.d/ # 查看服务端配置目录(含 mysqld.cnf)
ss -tnlp | grep mysql # 监听 127.0.0.1:3306 和 33060(MySQL 8.0 特性)
# 4. 登录验证
mysql -uroot -p # 空密码直接回车登录
select version(); # 验证 8.0.41 版本
安装 MariaDB 10.11(系统默认源)
bash
# 1. 安装 MariaDB
apt install -y mariadb-server
# 2. 启动服务与目录差异检查
systemctl enable --now mariadb
ll /etc/mysql/mariadb.conf.d/ # 查看 MariaDB 专属配置目录(含 50-server.cnf)
ss -tnlp | grep 3306 # 仅监听 127.0.0.1:3306(无 33060 端口)
mysql -e "select version();" # 验证 10.11 版本
安装 MySQL 8.4 LTS(官方源)
bash
# 1. 配置 MySQL 官方 APT 源
mkdir /data/softs -p && cd /data/softs
wget https://dev.mysql.com/get/mysql-apt-config_0.8.34-1_all.deb
dpkg -i mysql-apt-config_0.8.34-1_all.deb # 安装时默认选择 8.4 版本
# 2. 更新缓存与安装
apt update
apt install -y mysql-community-server # 安装过程中设置 root 密码
# 3. 目录验证
ll /var/lib/mysql # 新增 binlog.000001、binlog.index(二进制日志文件)
ll /etc/mysql/mysql.conf.d/mysqld.cnf # 查看配置(默认无 bind-address,需手动添加)
mysql -uroot -p'设置的密码' -e "select version();" # 验证 8.4 版本
安装 MariaDB 11.8 LTS(清华源)
bash
# 1. 安装依赖与导入密钥
apt install -y apt-transport-https curl
mkdir -p /etc/apt/keyrings
curl -o /etc/apt/keyrings/mariadb-keyring.pgp 'https://mariadb.org/mariadb_release_signing_key.pgp'
# 2. 配置清华源
cat > /etc/apt/sources.list.d/mariadb.sources <<-eof
Types: deb
URIs: https://mirrors.tuna.tsinghua.edu.cn/mariadb/repo/11.8/ubuntu
Suites: noble
Components: main main/debug
Signed-By: /etc/apt/keyrings/mariadb-keyring.pgp
eof
apt update
# 3. 安装与目录验证
apt install -y mariadb-server
ll /var/lib/mysql # 含 debian-11.8.flag(版本标识文件)
mysql -e "select version();" # 应返回 11.8.2 版本
关键注意事项
- 源配置:不同版本需对应专属源,禁止混合使用(如 MySQL 8.4 用官方源,MariaDB 11.8 用清华源)
- 密码策略:MySQL 8.4 强制密码复杂度,MariaDB 默认无强制要求
- 服务名差异:
- Rocky9:MySQL 服务名
mysqld,MariaDB 服务名mariadb - Ubuntu24:MySQL/MariaDB 服务名均为
mysql/mariadb
- Rocky9:MySQL 服务名
- 端口差异:MySQL 8.0+ 支持 3306(经典协议)和 33060(X Protocol),MariaDB 仅支持 3306
二、二进制包安装(自定义部署)
核心前提
- 核心优势:无需编译,直接解压配置,支持自定义安装路径,适合精准控制部署环境
- 支持版本:MySQL 8.4(LTS)、MySQL 9.2(创新版)
- 支持系统:Ubuntu24(实测验证),Rocky9 操作逻辑一致
- 依赖要求:需提前安装
libaio、numactl等依赖库 - 关键特点:所有目录可自定义,需手动规划路径(推荐
/usr/local/mysql为安装根目录)
二进制包安装自定义目录结构规划
推荐目录结构(以 /usr/local/mysql 为根目录)
| 目录/文件路径 | 核心作用 | 规划逻辑 |
|---|---|---|
/usr/local/mysql |
安装根目录 | 包含所有二进制文件、配置、数据、日志,便于集中管理 |
/usr/local/mysql/bin |
二进制工具目录 | mysql(客户端)、mysqld(服务端)、mysqldump、mysqladmin 等工具 |
/usr/local/mysql/etc |
配置文件目录 | 自定义 my.cnf(主配置),避免与系统默认配置冲突 |
/usr/local/mysql/data |
数据目录 | 系统数据库、用户数据、mysql.sock、mysqlx.sock 套接字文件 |
/usr/local/mysql/log |
日志目录 | error.log(错误日志)、service.log(脚本日志)、二进制日志(可选) |
/usr/local/mysql/pid |
PID 文件目录 | mysqld.pid(服务进程 ID 文件),用于启停服务识别进程 |
/usr/local/mysql/support-files |
辅助文件目录 | mysql.server(启动脚本)、my-default.cnf(默认配置模板) |
目录创建命令
bash
# 提前创建完整目录结构
mkdir -p /usr/local/mysql/{bin,etc,data,log,pid,support-files}
chown -R mysql:mysql /usr/local/mysql/ # 递归授权,避免后续权限报错
tree /usr/local/mysql/ # 验证目录结构(应显示 6 个子目录)
Ubuntu24 安装 MySQL 8.4(熟练级)
基础环境准备
bash
# 1. 安装核心依赖
apt install -y libaio-dev numactl libnuma-dev libncurses-dev
# 2. 补充安装 libaio1(Ubuntu24 无默认包)
curl -O http://launchpadlibrarian.net/646633572/libaio1_0.3.113-4_amd64.deb
dpkg -i libaio1_0.3.113-4_amd64.deb
# 3. 更换阿里云镜像(可选,提升依赖下载速度)
sed -i "s/cn.archive.ubuntu.com/mirrors.aliyun.com/g" /etc/apt/sources.list.d/ubuntu.sources
sed -i "s/security.ubuntu.com/mirrors.aliyun.com/g" /etc/apt/sources.list.d/ubuntu.sources
apt update
用户与目录配置
bash
# 1. 创建 MySQL 专用用户组(禁止登录 shell,避免安全风险)
groupadd -r mysql
useradd -r -g mysql -s /sbin/nologin mysql
# 2. 验证目录结构(参考上文规划,确保所有子目录存在)
ll /usr/local/mysql/ # 应显示 bin、etc、data、log、pid、support-files 6 个子目录
软件下载与解压
bash
# 1. 下载 MySQL 8.4 二进制包(官网归档地址)
mkdir -p /data/softs && cd /data/softs
wget https://downloads.mysql.com/archives/get/p/23/file/mysql-8.4.0-linux-glibc2.28-x86_64.tar.xz
# 2. 解压至安装目录(关键:确保二进制文件进入 /usr/local/mysql/bin)
tar xf mysql-8.4.0-linux-glibc2.28-x86_64.tar.xz
mv mysql-8.4.0-linux-glibc2.28-x86_64/bin/* /usr/local/mysql/bin/
mv mysql-8.4.0-linux-glibc2.28-x86_64/support-files/* /usr/local/mysql/support-files/
# 3. 目录权限授权(关键,避免后续启动权限报错)
chown -R mysql:mysql /usr/local/mysql/
ll /usr/local/mysql/bin/mysql # 验证所有者为 mysql:mysql
环境变量配置
bash
# 1. 设置全局环境变量(方便直接调用 mysql 命令,无需输入完整路径)
echo 'PATH=/usr/local/mysql/bin:$PATH' > /etc/profile.d/mysql.sh
# 2. 生效环境变量(当前终端立即生效,永久生效需重启终端)
source /etc/profile.d/mysql.sh
# 3. 验证(应显示 /usr/local/mysql/bin 路径,确保优先级高于系统默认)
echo $PATH
which mysql # 应返回 /usr/local/mysql/bin/mysql
配置文件编写(自定义 my.cnf)
bash
# 创建 my.cnf 配置文件(路径:/usr/local/mysql/etc/my.cnf)
cat > /usr/local/mysql/etc/my.cnf <<-eof
[mysql]
port = 3306
socket = /usr/local/mysql/data/mysql.sock # 客户端连接套接字
default-character-set = utf8mb4 # 客户端默认字符集
[mysqld]
port = 3306
mysqlx_port = 33060 # X Protocol 端口(MySQL 8.0+ 特性)
mysqlx_socket = /usr/local/mysql/data/mysqlx.sock
basedir = /usr/local/mysql # 安装根目录(必填)
datadir = /usr/local/mysql/data # 数据目录(必填)
socket = /usr/local/mysql/data/mysql.sock # 服务端套接字
pid-file = /usr/local/mysql/pid/mysqld.pid # PID 文件路径
log-error = /usr/local/mysql/log/error.log # 错误日志路径(排查问题关键)
default-authentication-plugin = mysql_native_password # 兼容旧客户端(如 Navicat 旧版本)
character-set-server = utf8mb4 # 服务端默认字符集
collation-server = utf8mb4_general_ci # 服务端默认排序规则
eof
# 验证配置文件权限(确保 mysql 用户可读取)
chown mysql:mysql /usr/local/mysql/etc/my.cnf
数据库初始化(两种方式)
方式 1:生成随机临时密码(生产环境推荐)
bash
# 1. 初始化数据库(指定用户、安装目录、数据目录)
cd /usr/local/mysql
bin/mysqld --initialize --user=mysql --basedir=/usr/local/mysql --datadir=/usr/local/mysql/data
# 2. 查看临时密码(关键,首次登录必需,从错误日志中提取)
tail -f /usr/local/mysql/log/error.log
# 示例输出:A temporary password is generated for root@localhost: dYRdhu;6MwMD
# 复制临时密码,后续登录使用
方式 2:生成空密码(仅测试环境使用,生产环境禁止)
bash
# 1. 清理残留数据(若初始化失败或需重新初始化时执行)
rm -rf /usr/local/mysql/data/*
# 2. 空密码初始化(--initialize-insecure 表示无密码)
bin/mysqld --initialize-insecure --user=mysql --basedir=/usr/local/mysql --datadir=/usr/local/mysql/data
# 3. 验证数据目录(应生成 mysql、information_schema 等系统数据库目录)
ll /usr/local/mysql/data/
服务脚本配置与启动
bash
# 1. 复制启动脚本到系统服务目录(使用 MySQL 自带脚本)
cp /usr/local/mysql/support-files/mysql.server /etc/init.d/mysqld
# 2. 修改脚本中的目录配置(关键:确保脚本指向自定义路径,而非系统默认)
sed -i "s#basedir=#basedir=/usr/local/mysql#g" /etc/init.d/mysqld
sed -i "s#datadir=#datadir=/usr/local/mysql/data#g" /etc/init.d/mysqld
# 3. 重载 systemd 配置(识别新脚本)
systemctl daemon-reload
# 4. 启动 MySQL 服务
/etc/init.d/mysqld start
# 5. 验证服务状态(多维度确认)
systemctl status mysqld # 服务状态(应显示 active running)
ss -tnlp | grep mysql # 端口监听(3306 和 33060)
ll /usr/local/mysql/data/mysql.sock # 套接字文件(存在表示启动成功)
登录与密码修改
场景 1:随机密码登录(对应方式 1)
bash
# 1. 登录数据库(通过自定义套接字文件连接,避免与系统默认冲突)
mysql -uroot -p'dYRdhu;6MwMD' -S /usr/local/mysql/data/mysql.sock
# 2. 修改密码(必需操作,MySQL 8.0+ 强制首次登录修改密码)
ALTER USER 'root'@'localhost' IDENTIFIED BY 'Sswang@1234'; # 密码需满足复杂度
FLUSH PRIVILEGES; # 刷新权限(使密码生效)
exit
# 3. 验证登录(使用新密码)
mysql -uroot -p'Sswang@1234' -S /usr/local/mysql/data/mysql.sock
场景 2:空密码登录(对应方式 2)
bash
# 1. 登录数据库(无需密码,直接连接)
mysql -uroot -S /usr/local/mysql/data/mysql.sock
# 2. 修改密码(测试环境建议设置简单密码,生产环境需复杂)
ALTER USER 'root'@'localhost' IDENTIFIED BY 'Sswang@1234';
FLUSH PRIVILEGES;
exit
# 3. 验证登录(使用新密码)
mysql -uroot -p'Sswang@1234' -S /usr/local/mysql/data/mysql.sock
Ubuntu24 安装 MySQL 9.2(扩展级)
核心差异(与 8.4 对比)
- 下载地址:
https://downloads.mysql.com/archives/get/p/23/file/mysql-9.2.0-linux-glibc2.28-x86_64.tar.xz - 认证插件:MySQL 9.0+ 移除
mysql_native_password,默认使用caching_sha2_password(需调整配置) - 目录结构:与 8.4 完全一致,仅配置文件中认证插件需修改
关键配置调整
bash
# 修改 my.cnf 中的认证插件配置(替换为 MySQL 9.2 支持的插件)
sed -i "s/default-authentication-plugin = mysql_native_password/default-authentication-plugin = caching_sha2_password/g" /usr/local/mysql/etc/my.cnf
# 其余步骤(解压、初始化、启动)与 8.4 完全一致
验证版本
bash
# 登录后验证版本(应返回 9.2.0)
mysql -uroot -p'Sswang@1234' -S /usr/local/mysql/data/mysql.sock -e "select version();"
常见问题排查
- 依赖缺失报错:
libaio.so.1: cannot open shared object file→ 重新安装libaio1包(执行dpkg -i libaio1_0.3.113-4_amd64.deb) - 权限报错:
Permission denied→ 执行chown -R mysql:mysql /usr/local/mysql/*递归授权(确保所有子目录所有者正确) - 服务启动失败:直接执行
bin/mysqld_safe --defaults-file=/usr/local/mysql/etc/my.cnf查看实时日志,定位配置错误(如路径写错、端口占用) - 环境变量失效:重新执行
source /etc/profile.d/mysql.sh或重启终端,确保which mysql返回自定义路径 - 套接字连接失败:使用
-S /usr/local/mysql/data/mysql.sock指定套接字路径,避免连接到系统默认的/var/lib/mysql/mysql.sock
三、MySQL 多实例部署(MariaDB 版本)
核心前提
- 定义:一台服务器运行多个 MariaDB 进程,每个实例独立端口(3306/3307/3308)、配置文件、数据目录
- 支持版本:MariaDB 10.5(镜像版)、MariaDB 11.8(LTS 版)
- 核心优势:节约硬件资源、便于版本测试、集中管理
- 核心风险:资源抢占(单服务器资源有限)、单点故障(服务器宕机影响所有实例)
- 关键原则:实例完全隔离(端口、配置、数据、日志、套接字均独立,目录结构需按实例区分)
多实例部署目录结构规划(Rocky9 为例)
推荐多实例目录结构(以 /mysql 为根目录,3 个实例:3306/3307/3308)
| 目录/文件路径 | 核心作用 | 实例隔离逻辑 |
|---|---|---|
/mysql/3306/ |
3306 实例根目录 | 包含该实例的所有子目录,与其他实例完全独立 |
/mysql/3306/data |
3306 实例数据目录 | 系统数据库、用户数据、mysql.sock(仅 3306 实例使用) |
/mysql/3306/etc |
3306 实例配置目录 | 自定义 my.cnf(仅 3306 实例生效,端口、路径均指向 3306 目录) |
/mysql/3306/log |
3306 实例日志目录 | mysql.log(错误日志)、service.log(启动脚本日志) |
/mysql/3306/pid |
3306 实例 PID 目录 | mysql.pid(仅 3306 实例进程 ID) |
/mysql/3306/socket |
3306 实例套接字目录 | mysql.sock(仅 3306 实例客户端连接使用) |
/mysql/3306/bin |
3306 实例启动脚本目录 | 自定义 mysqld 启动脚本(含端口、路径配置,仅控制 3306 实例) |
/mysql/3307/、/mysql/3308/ |
3307/3308 实例根目录 | 结构与 3306 完全一致,仅端口和路径中的数字(3306)替换为 3307/3308 |
目录创建命令(一键生成 3 个实例目录)
bash
# 创建多实例核心目录(3306/3307/3308 三个实例,每个实例含 6 个子目录)
mkdir -pv /mysql/{3306,3307,3308}/{data,etc,socket,log,bin,pid}
# 查看目录结构(应显示 21 个目录:3 个实例 × 6 个子目录 + 1 个根目录)
tree /mysql
# 目录权限授权(关键:所有实例目录所有者为 mysql:mysql,避免权限报错)
chown -R mysql:mysql /mysql/
ll /mysql/ # 验证 3306/3307/3308 目录所有者为 mysql:mysql
环境准备(Rocky9 为例)
bash
# 1. 安装 MariaDB 基础软件(以 11.8 LTS 为例,多实例共享基础二进制文件)
yum install -y MariaDB-server MariaDB-pam
# 2. 验证 MySQL 用户(系统自动创建,无则手动创建)
id mysql
# 手动创建命令(若未自动生成,确保 UID/GID 唯一)
groupadd -g 980 mysql
useradd -s /usr/sbin/nologin -u 980 -g 980 mysql
# 3. 关闭默认服务(避免端口冲突,多实例不使用系统默认服务)
systemctl stop mariadb
systemctl disable mariadb
systemctl status mariadb # 应显示 inactive (dead)
内核参数优化(可选,提升多实例性能)
bash
# 启用高性能异步 I/O 功能(多实例并发时提升 I/O 效率)
echo "kernel.io_uring_disabled=0" | tee -a /etc/sysctl.conf
sysctl -p # 立即生效配置
# 验证参数(应返回 0,表示启用)
sysctl -a | grep kernel.io_uring_disabled
实例初始化(每个实例独立初始化)
bash
# 初始化 3306 实例(指定用户和数据目录)
mariadb-install-db --user=mysql --datadir=/mysql/3306/data
# 初始化 3307 实例
mariadb-install-db --user=mysql --datadir=/mysql/3307/data
# 初始化 3308 实例
mariadb-install-db --user=mysql --datadir=/mysql/3308/data
# 验证初始化结果(每个 data 目录应生成系统数据库文件)
ll /mysql/3306/data/ # 含 mysql、information_schema 目录
ll /mysql/3307/data/ # 结构与 3306 一致,数据独立
实例配置文件编写(按实例隔离)
1. 3306 实例配置(/mysql/3306/etc/my.cnf)
bash
cat > /mysql/3306/etc/my.cnf <<-eof
[mysqld]
port=3306 # 实例独立端口(3306)
datadir=/mysql/3306/data # 实例独立数据目录
socket=/mysql/3306/socket/mysql.sock # 实例独立套接字
log-error=/mysql/3306/log/mysql.log # 实例独立错误日志
pid-file=/mysql/3306/pid/mysql.pid # 实例独立 PID 文件
character-set-server=utf8mb4 # 字符集配置
collation-server=utf8mb4_general_ci
server-id=1 # 多实例必须不同(3306=1,3307=2,3308=3)
log-bin=/mysql/3306/log/mysql-bin # 二进制日志(可选,用于主从复制)
eof
2. 3307/3308 实例配置(复制修改,确保隔离)
bash
# 复制 3306 配置到 3307 并修改关键参数(端口、路径、server-id)
cp -a /mysql/3306/etc/my.cnf /mysql/3307/etc/my.cnf
sed -i "s#3306#3307#g" /mysql/3307/etc/my.cnf # 替换所有 3306 为 3307
sed -i "s/server-id=1/server-id=2/g" /mysql/3307/etc/my.cnf # server-id 改为 2
# 复制 3306 配置到 3308 并修改
cp -a /mysql/3306/etc/my.cnf /mysql/3308/etc/my.cnf
sed -i "s#3306#3308#g" /mysql/3308/etc/my.cnf
sed -i "s/server-id=1/server-id=3/g" /mysql/3308/etc/my.cnf
# 验证配置文件(确保关键参数正确)
grep "port" /mysql/3307/etc/my.cnf # 应返回 port=3307
grep "datadir" /mysql/3308/etc/my.cnf # 应返回 datadir=/mysql/3308/data
启动脚本编写(按实例定制,3306 为例)
bash
# 创建 3306 实例启动脚本(/mysql/3306/bin/mysqld)
cat > /mysql/3306/bin/mysqld <<-eof
#!/bin/bash
# 功能: MariaDB 多实例启动脚本(3306 实例)
# 版本: 2025-05-05
PORT=3306 # 实例端口(与配置文件一致)
USER="root" # 管理员用户名
PWD="Magedu" # 管理员密码(后续可修改)
CMD_PATH="/usr/bin" # MariaDB 基础工具路径(共享系统二进制文件)
BASE_DIR="/mysql" # 多实例根目录
SOCKET="${BASE_DIR}/${PORT}/socket/mysql.sock" # 实例套接字路径
LOG_FILE="${BASE_DIR}/${PORT}/log/service.log" # 脚本日志路径
# 日志记录函数(记录启动/停止日志,便于排查问题)
log() {
local message="$1"
local timestamp=$(date +"%Y-%m-%d %H:%M:%S")
echo "$timestamp - $message" >> "$LOG_FILE"
}
# 启动函数(仅启动当前实例)
mysql_start() {
if [ ! -e "$SOCKET" ]; then # 检查套接字是否存在(避免重复启动)
log "Starting MariaDB ${PORT}..."
echo "Starting MariaDB ${PORT}..."
# 启动服务(指定实例专属配置文件)
${CMD_PATH}/mysqld_safe --defaults-file=${BASE_DIR}/${PORT}/etc/my.cnf &>/dev/null &
local pid=$!
sleep 2 # 等待服务启动(避免立即检查导致误判)
if ps -p $pid > /dev/null; then
log "MariaDB ${PORT} started successfully."
echo "MariaDB ${PORT} started successfully."
else
log "Failed to start MariaDB ${PORT}."
echo "Failed to start MariaDB ${PORT}."
fi
else
log "MariaDB ${PORT} is running..."
echo "MariaDB ${PORT} is running..."
exit 1 # 已运行则退出,避免重复操作
fi
}
# 停止函数(仅停止当前实例)
mysql_stop() {
if [ ! -e "$SOCKET" ]; then # 检查套接字是否存在(避免停止未运行实例)
log "MariaDB ${PORT} is stopped..."
echo "MariaDB ${PORT} is stopped..."
exit 1
else
log "Stopping MariaDB ${PORT}..."
echo "Stopping MariaDB ${PORT}..."
# 通过套接字停止服务(指定实例专属套接字)
${CMD_PATH}/mysqladmin -u ${USER} -p${PWD} -S ${SOCKET} shutdown &>/dev/null
local result=$?
if [ $result -eq 0 ]; then
log "MariaDB ${PORT} stopped successfully."
echo "MariaDB ${PORT} stopped successfully."
else
log "Failed to stop MariaDB ${PORT}."
echo "Failed to stop MariaDB ${PORT}."
fi
fi
}
# 重启函数(先停止再启动)
mysql_restart() {
log "Restarting MariaDB ${PORT}..."
echo "Restarting MariaDB ${PORT}..."
mysql_stop
sleep 2 # 等待完全停止
mysql_start
}
# 用法提示(告知用户可用命令)
usage_msg() {
echo "Usage: ${BASE_DIR}/${PORT}/bin/mysqld {start|stop|restart}"
}
# 信号处理(捕获终止信号时停止服务,避免进程残留)
trap 'mysql_stop; exit 1' SIGTERM SIGINT
# 命令分发(根据用户输入执行对应函数)
case \$1 in
start)
mysql_start;;
stop)
mysql_stop;;
restart)
mysql_restart;;
*)
usage_msg;;
esac
eof
启动脚本复制与授权(3307/3308 实例)
bash
# 复制 3306 脚本到 3307/3308 并修改端口(确保实例隔离)
for i in 7 8; do
cp -a /mysql/3306/bin/mysqld /mysql/330$i/bin/mysqld
sed -i "s#3306#330$i#g" /mysql/330$i/bin/mysqld # 替换端口为 3307/3308
chmod +x /mysql/330$i/bin/mysqld # 添加执行权限
done
# 为所有实例脚本添加执行权限
chmod +x /mysql/3306/bin/mysqld
chmod +x /mysql/3307/bin/mysqld
chmod +x /mysql/3308/bin/mysqld
# 验证脚本权限(确保可执行)
ll /mysql/3306/bin/mysqld # 应显示 -rwxr-xr-x
多实例启动与验证(完全隔离测试)
1. 启动所有实例
bash
# 启动 3306 实例
/mysql/3306/bin/mysqld start
# 启动 3307 实例
/mysql/3307/bin/mysqld start
# 启动 3308 实例
/mysql/3308/bin/mysqld start
2. 多维度验证实例隔离性
bash
# 验证端口监听(应显示 3306、3307、3308 三个端口,进程均为 mariadbd)
ss -tnlp | grep 330
# 验证套接字文件(每个实例的套接字独立存在)
ll /mysql/3306/socket/mysql.sock
ll /mysql/3307/socket/mysql.sock
ll /mysql/3308/socket/mysql.sock
# 验证实例连接(通过专属套接字连接不同实例,确保数据隔离)
# 连接 3306 实例
mysql -S /mysql/3306/socket/mysql.sock -e "select version(), @@port;"
# 连接 3307 实例
mysql -S /mysql/3307/socket/mysql.sock -e "select version(), @@port;"
# 连接 3308 实例
mysql -S /mysql/3308/socket/mysql.sock -e "select version(), @@port;"
# 验证数据隔离(在 3306 实例创建数据库,3307/3308 实例不可见)
mysql -S /mysql/3306/socket/mysql.sock -e "create database db_3306;"
mysql -S /mysql/3306/socket/mysql.sock -e "show databases like 'db_%';" # 应显示 db_3306
mysql -S /mysql/3307/socket/mysql.sock -e "show databases like 'db_%';" # 应无结果
开机自启配置(两种方式,确保实例随系统启动)
方式 1:rc.local 配置(简单直观,适合新手)
bash
# 编辑 rc.local 文件(系统启动后自动执行)
vim /etc/rc.d/rc.local
# 添加多实例启动命令(按顺序启动 3306、3307、3308)
for i in {3306..3308}; do
/mysql/$i/bin/mysqld start;
done
# 为 rc.local 添加执行权限(确保系统启动时可执行)
chmod a+x /etc/rc.d/rc.local
# 验证配置(手动执行一次,确保无报错)
/etc/rc.d/rc.local
方式 2:systemd 服务配置(推荐,支持服务管理)
bash
# 创建 3306 实例 systemd 服务文件(/etc/systemd/system/mysql3306.service)
cat > /etc/systemd/system/mysql3306.service <<-eof
[Unit]
Description=MariaDB 3306 Server # 服务描述(区分实例)
After=network.target # 网络启动后再启动服务
[Service]
User=mysql # 运行用户(与实例目录所有者一致)
Group=mysql # 运行组
ExecStart=/usr/bin/mysqld_safe --defaults-file=/mysql/3306/etc/my.cnf # 启动命令(指定实例配置)
ExecStop=/usr/bin/mysqladmin -u root -pMagedu -S /mysql/3306/socket/mysql.sock shutdown # 停止命令
Restart=always # 服务异常时自动重启
RestartSec=5 # 重启间隔 5 秒
[Install]
WantedBy=multi-user.target # 多用户模式下启动
eof
# 复制服务文件到 3307/3308 实例并修改关键参数
for i in 7 8; do
cp -a /etc/systemd/system/mysql3306.service /etc/systemd/system/mysql330$i.service
sed -i "s#3306#330$i#g" /etc/systemd/system/mysql330$i.service # 替换实例端口
done
# 重载 systemd 配置并设置开机自启
systemctl daemon-reload
systemctl enable --now mysql3306 mysql3307 mysql3308
# 验证开机自启配置(应显示 enabled)
systemctl is-enabled mysql3306
systemctl is-enabled mysql3307
systemctl is-enabled mysql3308
常见问题排查
-
启动失败:
- 检查目录权限:
chown -R mysql:mysql /mysql/330x/(确保实例目录所有者正确) - 检查端口冲突:
ss -tnlp | grep 330x(确保端口未被其他服务占用) - 查看日志:
tail -f /mysql/330x/log/mysql.log(从错误日志定位配置错误,如路径写错)
- 检查目录权限:
-
连接失败:
- 必须通过实例专属套接字连接:
mysql -S /mysql/330x/socket/mysql.sock,不可使用默认端口 - 验证套接字存在:
ll /mysql/330x/socket/mysql.sock(不存在表示实例未启动)
- 必须通过实例专属套接字连接:
-
权限报错:
- 临时关闭 SELinux:
setenforce 0(生产环境需添加 SELinux 规则,允许 MariaDB 访问/mysql目录) - 防火墙放行端口:
firewall-cmd --add-port=3306/tcp --permanent(如需远程连接,需放行所有实例端口)
- 临时关闭 SELinux:
-
数据混乱:
- 检查实例配置文件:确保
datadir、socket、pid-file均指向实例专属目录,无交叉引用 - 初始化前清理数据:
rm -rf /mysql/330x/data/*(重新初始化时必需,避免残留数据干扰)
- 检查实例配置文件:确保
-
开机自启失效:
rc.local方式:检查/etc/rc.d/rc.local是否有执行权限,命令路径是否正确systemd方式:执行systemctl daemon-reload重载配置,查看服务状态systemctl status mysql330x定位错误
四、总结
本文档通过「包管理器安装→二进制包安装→多实例部署」的递进逻辑,覆盖 MySQL/MariaDB 核心部署场景,同时补充关键目录结构解析,帮助理解文件分布与实例隔离原理。实操时需注意:
- 包管理器安装:依赖系统默认目录,重点关注数据、配置、日志路径
- 二进制包安装:自定义目录灵活,需手动规划路径并确保权限正确
- 多实例部署:核心是「完全隔离」,端口、配置、数据、日志、套接字均需按实例区分,避免交叉干扰