mysql二进制部署以及多实例部署

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/ 客户端工具目录 mysqlmysqladminmysqldump 等工具

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 版本

关键注意事项

  1. 源配置:不同版本需对应专属源,禁止混合使用(如 MySQL 8.4 用官方源,MariaDB 11.8 用清华源)
  2. 密码策略:MySQL 8.4 强制密码复杂度,MariaDB 默认无强制要求
  3. 服务名差异:
    • Rocky9:MySQL 服务名 mysqld,MariaDB 服务名 mariadb
    • Ubuntu24:MySQL/MariaDB 服务名均为 mysql/mariadb
  4. 端口差异:MySQL 8.0+ 支持 3306(经典协议)和 33060(X Protocol),MariaDB 仅支持 3306

二、二进制包安装(自定义部署)

核心前提

  • 核心优势:无需编译,直接解压配置,支持自定义安装路径,适合精准控制部署环境
  • 支持版本:MySQL 8.4(LTS)、MySQL 9.2(创新版)
  • 支持系统:Ubuntu24(实测验证),Rocky9 操作逻辑一致
  • 依赖要求:需提前安装 libaionumactl 等依赖库
  • 关键特点:所有目录可自定义,需手动规划路径(推荐 /usr/local/mysql 为安装根目录)

二进制包安装自定义目录结构规划

推荐目录结构(以 /usr/local/mysql 为根目录)
目录/文件路径 核心作用 规划逻辑
/usr/local/mysql 安装根目录 包含所有二进制文件、配置、数据、日志,便于集中管理
/usr/local/mysql/bin 二进制工具目录 mysql(客户端)、mysqld(服务端)、mysqldumpmysqladmin 等工具
/usr/local/mysql/etc 配置文件目录 自定义 my.cnf(主配置),避免与系统默认配置冲突
/usr/local/mysql/data 数据目录 系统数据库、用户数据、mysql.sockmysqlx.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 对比)
  1. 下载地址:https://downloads.mysql.com/archives/get/p/23/file/mysql-9.2.0-linux-glibc2.28-x86_64.tar.xz
  2. 认证插件:MySQL 9.0+ 移除 mysql_native_password,默认使用 caching_sha2_password(需调整配置)
  3. 目录结构:与 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();"

常见问题排查

  1. 依赖缺失报错:libaio.so.1: cannot open shared object file → 重新安装 libaio1 包(执行 dpkg -i libaio1_0.3.113-4_amd64.deb
  2. 权限报错:Permission denied → 执行 chown -R mysql:mysql /usr/local/mysql/* 递归授权(确保所有子目录所有者正确)
  3. 服务启动失败:直接执行 bin/mysqld_safe --defaults-file=/usr/local/mysql/etc/my.cnf 查看实时日志,定位配置错误(如路径写错、端口占用)
  4. 环境变量失效:重新执行 source /etc/profile.d/mysql.sh 或重启终端,确保 which mysql 返回自定义路径
  5. 套接字连接失败:使用 -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

常见问题排查

  1. 启动失败:

    • 检查目录权限:chown -R mysql:mysql /mysql/330x/(确保实例目录所有者正确)
    • 检查端口冲突:ss -tnlp | grep 330x(确保端口未被其他服务占用)
    • 查看日志:tail -f /mysql/330x/log/mysql.log(从错误日志定位配置错误,如路径写错)
  2. 连接失败:

    • 必须通过实例专属套接字连接:mysql -S /mysql/330x/socket/mysql.sock,不可使用默认端口
    • 验证套接字存在:ll /mysql/330x/socket/mysql.sock(不存在表示实例未启动)
  3. 权限报错:

    • 临时关闭 SELinux:setenforce 0(生产环境需添加 SELinux 规则,允许 MariaDB 访问 /mysql 目录)
    • 防火墙放行端口:firewall-cmd --add-port=3306/tcp --permanent(如需远程连接,需放行所有实例端口)
  4. 数据混乱:

    • 检查实例配置文件:确保 datadirsocketpid-file 均指向实例专属目录,无交叉引用
    • 初始化前清理数据:rm -rf /mysql/330x/data/*(重新初始化时必需,避免残留数据干扰)
  5. 开机自启失效:

    • rc.local 方式:检查 /etc/rc.d/rc.local 是否有执行权限,命令路径是否正确
    • systemd 方式:执行 systemctl daemon-reload 重载配置,查看服务状态 systemctl status mysql330x 定位错误

四、总结

本文档通过「包管理器安装→二进制包安装→多实例部署」的递进逻辑,覆盖 MySQL/MariaDB 核心部署场景,同时补充关键目录结构解析,帮助理解文件分布与实例隔离原理。实操时需注意:

  1. 包管理器安装:依赖系统默认目录,重点关注数据、配置、日志路径
  2. 二进制包安装:自定义目录灵活,需手动规划路径并确保权限正确
  3. 多实例部署:核心是「完全隔离」,端口、配置、数据、日志、套接字均需按实例区分,避免交叉干扰
相关推荐
Access开发易登软件2 小时前
Access开发实战:绘制漏斗图实现业务转化分析
数据库·信息可视化·html·vba·图表·access
云老大TG:@yunlaoda3602 小时前
开通华为云国际站代理商的UCS服务需要哪些资质?
大数据·数据库·华为云·云计算
总有刁民想爱朕ha2 小时前
Windows Server 2019部署MySQL 8教程
数据库·windows·mysql
纪伊路上盛名在2 小时前
记1次BioPython Entrez模块Elink的debug
前端·数据库·python·debug·工具开发
程序员水自流2 小时前
MySQL数据库自带系统数据库功能介绍
java·数据库·mysql·oracle
旧梦吟2 小时前
脚本网页 三人四字棋
前端·数据库·算法·css3·html5
小光学长2 小时前
基于ssm的考研复习平台w0ws1848(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。
数据库
-大头.2 小时前
数据库高可用架构终极指南
数据库·架构
Elastic 中国社区官方博客2 小时前
Elasticsearch:构建一个 AI 驱动的电子邮件钓鱼检测
大数据·数据库·人工智能·elasticsearch·搜索引擎·ai·全文检索