MySQL8/9主从复制集群安装自动化全过程-Fgedu

# MySQL8/9主从复制集群安装自动化全过程-Fgedu

一、程序介绍

1.1 工具概述

FGDBA-MySQL8/9主从复制自动化安装工具是一款由风哥自主设计、研发并长期维护的 MySQL数据库主从复制架构自动化部署工具。该工具定位为"配置驱动型一键自动化安装"解决方案,面向 DBA 工程师、数据库运维人员以及需要在 Linux 平台上快速、标准、可重复地搭建 MySQL 8.X/9.X 主从复制环境的各类技术团队。

FGDBA-MySQL8/9主从复制自动化安装工具的核心思想是:将所有可调参数(包括主从 IP、SSH 凭据、MySQL 二进制版本、安装目录、数据目录、日志目录、端口、root 密码、复制账号、内核参数、LVM、防火墙、SELinux、NUMA、透明大页、IO 调度器、my.cnf 全量参数等)全部集中在一个 YAML 配置文件中,通过命令行参数指定主从 IP 列表与 SSH 凭据后,由控制机通过 SSH(基于 paramiko)远程登录各目标服务器,按照"环境检测 -> 系统配置 -> MySQL 安装 -> 主从配置 -> 健康检查"的固定流程自动完成全栈部署,无需人工干预。

该工具采用纯 Python 实现,依赖极少(仅需 pyyaml 与 paramiko),并自带离线安装包目录(python-pkgs/),支持在内网无外网的环境下离线部署。其设计目标是在保证生产级稳定性与可回滚性的前提下,将一台或多台全新 Linux 主机在 10~20 分钟内转变为一个具备 GTID、半同步复制、自动故障感知能力的 MySQL 8.X/9.X 主从集群。

1.2 作者信息

作者:风哥
官方网站   http://www.fgedu.net.cn , http://www.itpux.com
数据库教程 https://edu.51cto.com/lecturer/8020378.html
mysql主从集群一键安装教程 https://edu.51cto.com/course/40554.html

1.3 工具定位

本工具并非一个通用的 MySQL 生命周期管理平台,而是一个聚焦于"从零到一搭建 MySQL 8.X/9.X 主从复制集群"的自动化安装器。其适用场景包括但不限于:

  • 新机房、新服务器上架后的 MySQL 标准化初始化部署;
  • 开发、测试环境的快速重建与版本升级回归;
  • 灾备环境搭建与复制拓扑重建;
  • DBA 培训与教学演示;
  • 数据库迁移项目的前期环境准备。

工具本身不承担后续的监控、备份、自动故障切换等职责(这部分建议配合 Orchestrator、MHA、ProxySQL 或企业自有平台使用),但其输出的标准化目录结构、统一 my.cnf 模板与清晰的日志,可以很好地与上述平台对接。

1.4 技术架构

工具采用"控制机 + 目标服务器"的两层架构:

  1. 控制机:运行FGMYSQL主从复制自动化工具的机器,负责读取 YAML 配置、调度安装流程、通过 paramiko 下发命令与文件、汇总各主机执行结果。控制机本身不需要安装 MySQL,但需要能够 SSH 到所有目标服务器。
  2. 目标服务器:实际承载 MySQL 服务的机器,分为主服务器(Master,可读写)与从服务器(Slave,只读)。控制机会以并行方式在多台目标服务器上同时执行安装,显著缩短整体部署时间。

安装过程中,控制机与目标服务器之间的所有交互均通过 SSH 通道完成(命令执行使用 exec_command,文件写入使用 SFTP),不依赖额外的 Agent 或中间件,保证了对目标服务器的零侵入与最小化依赖。

1.5 工具文件清单

文件/目录 用途说明
FGMYSQL主从复制自动化工具 主程序脚本,包含全部安装逻辑
全量配置文件,所有可调参数集中在此
requirements.txt Python 依赖清单
python-pkgs/ 离线安装包目录,包含 paramiko、cryptography、bcrypt、pynacl、pyyaml 等 wheel 包
docs/README.md 工具使用说明文档
docs/INSTALL.md 逐步安装与依赖配置指南
logs/ 程序运行时自动生成的日志目录

二、功能与特性

2.1 核心功能

本工具围绕"MySQL 8.X/9.X 主从复制集群一键安装"这一核心目标,提供以下主要功能模块:

2.1.1 配置驱动

  • 所有参数集中在 中,使用 YAML 格式,结构清晰、可读性强;
  • 命令行参数(-mr-u-p--port)会自动回写到配置文件中,保证配置文件与实际执行参数一致;
  • 支持通过 -c/--config 指定自定义配置文件路径,便于在多套环境(开发/测试/生产)间切换;
  • 配置文件中的 my_cnfmy_cnf_mastermy_cnf_slave 三段分别管理公共、主库专属、从库专属参数,工具会自动合并生成最终 my.cnf

2.1.2 并行安装

  • 使用 Python threading 模块,为每台目标服务器创建独立线程并行执行安装;
  • 各线程的执行结果通过共享字典与锁(threading.Lock)汇总到主线程;
  • 任意一台主机安装失败,主流程会立即停止后续主从配置,并对失败主机执行 cleanup 回滚,避免遗留半成品环境;
  • 并行安装大幅缩短整体部署时间,1 主 2 从的典型安装可在 10~20 分钟内完成。

2.1.3 完整流程覆盖

工具覆盖从裸机到可用集群的全流程,包含以下六大阶段:

  1. 阶段 0.5 / 1:检查现有 MySQL 与安装包——在每台目标主机上搜索 .tar.xz.tar.gz 格式的 MySQL 二进制包(搜索路径覆盖 /tmp、当前目录、/root),若发现多版本会交互式让用户选择统一版本;同时检测是否已存在旧版 MySQL 安装,按提示决定是否清理。
  2. 阶段 2:并行安装 MySQL——创建目录、解压二进制包、创建 mysql 用户、初始化数据库(带 lower_case_table_names=1)、生成 my.cnf、配置 systemd 服务、启动 MySQL、设置 root 密码。
  3. 阶段 3:配置主从复制——创建复制用户、安装半同步复制插件、在从库执行 CHANGE REPLICATION SOURCE TO 并启动复制。
  4. 阶段 4:创建测试数据库——在主库创建测试库与测试表并写入测试数据,用于验证复制链路是否正常。
  5. 阶段 5:验证复制状态——在主库执行 SHOW BINARY LOG STATUS、在从库执行 SHOW REPLICA STATUS,并检查半同步源端/复制端状态变量。
  6. 阶段 6:输出安装完成信息——汇总主从关系、复制模式、测试库信息、常用检查命令、生产环境提醒等。

2.1.4 错误处理与回滚

  • SSH 命令执行支持配置重试次数(默认 3 次)与超时(默认 30 秒),应对网络抖动;
  • 关键操作失败后会调用 cleanup(host) 清理失败主机的残留文件与进程,避免干扰下次安装;
  • 安装日志同时输出到控制台与 logs/mysql_mr_install_YYYYMMDD_HHMMSS.log 文件,便于事后排查;
  • 对 paramiko 的内部调试日志统一降级为 WARNING,避免干扰主流程输出。

2.1.5 半同步复制与 GTID

  • 默认启用 GTID 模式(gtid_mode=ONenforce_gtid_consistency=ON),保证事务唯一标识与一致性;
  • 自动加载 rpl_semi_sync_sourcerpl_semi_sync_replica 半同步复制插件,主库使用 AFTER_SYNC 等待点,从库启用半同步复制端;
  • 主库 server-id 固定为 33061,从库自 33062 起递增,保证集群内唯一;
  • 同时加载 mysql_clone.so 克隆插件,为后续快速扩从库提供基础。

2.1.6 灵活拓扑

  • 支持 1 主 1 从、1 主 2 从、1 主 3 从、1 主 4 从共 4 种拓扑规模;
  • 从库数量仅由命令行 -mr 参数中 IP 列表的长度决定,无需修改代码;
  • 从库 server-id 自动递增,无需手动维护。

2.2 功能特性详细说明

2.2.1 环境检测模块

  • 系统类型识别:通过 cat /etc/redhat-release 等方式识别 RHEL9 / OEL9 / Kylin V10 等目标系统;
  • 网络连通性测试:使用 bash 的 /dev/tcp 特性测试目标主机端口可达性,不依赖 telnet/nc
  • SSH 连接验证:基于 paramiko 验证 SSH 用户名、密码、端口是否正确;
  • 磁盘空间检查:检查 MySQL 数据目录、安装目录所在分区的可用空间;
  • 依赖包检查:检查 libaionumactlperlnet-toolswgettaropenssh-clients 等是否已安装;
  • 端口可用性检查:检查 3306 端口是否被占用,避免与既有服务冲突;
  • 本地安装包检测:在控制机本地与目标主机本地搜索 MySQL 二进制包,无需提前上传到远程主机。

2.2.2 系统配置模块

  • YUM 仓库清理:自动清理冲突的 YUM 仓库配置(保留 fgedudb.repo),避免依赖包安装异常;
  • 依赖包自动安装:通过 yum/dnf 自动安装前述依赖包;
  • 内核参数优化:配置 fs.file-maxnet.core.somaxconnnet.ipv4.tcp_max_syn_backlognet.ipv4.tcp_fin_timeoutvm.swappinessvm.nr_hugepagesvm.min_free_kbytesvm.overcommit_memoryvm.hugetlb_shm_group 等关键参数;
  • 防火墙关闭systemctl stop firewalld && systemctl disable firewalld
  • SELinux 禁用setenforce 0 并修改 /etc/selinux/configdisabled
  • 透明大页禁用:关闭 THP,避免 InnoDB 性能抖动;
  • IO 调度器优化:将磁盘 IO 调度器设置为 deadline
  • NUMA 禁用:在 systemd 服务或内核启动参数中关闭 NUMA;
  • LVM 自动配置:支持在指定块设备(如 /dev/sdc)上自动创建 PV、VG、LV,格式化为 xfs 并挂载到 /mysql/backup,通过 skip 参数可跳过已配置的主机;
  • 大页内存配置:支持配置 vm.nr_hugepageshugetlb_shm_group,为 InnoDB 大页内存使用做准备。

2.2.3 MySQL 安装模块

  • 二进制包自动检测:支持 .tar.xz.tar.gz 两种格式,优先按 /tmp、当前目录、/root 顺序搜索;
  • 多版本选择:检测到多个 MySQL 二进制包时,交互式让用户选择统一版本,所有主机安装一致版本;
  • 解压安装:解压到 /mysql/app/mysql,显示解压进度;
  • 数据库初始化:使用 mysqld --initialize --lower-case-table-names=1 初始化数据目录;
  • my.cnf 生成:从 读取 my_cnfmy_cnf_mastermy_cnf_slave 三段配置,自动合并为最终 my.cnf,落盘到 /mysql/data/3306/my.cnf
  • systemd 服务:生成 /etc/systemd/system/mysql.service,设置 LimitNOFILE=65535LimitNPROC=65535TimeoutStartSec=300
  • root 密码设置:启动 MySQL 后通过 ALTER USER 设置 root 密码,密码来源于配置文件。

2.2.4 主从配置模块

  • 复制用户创建:在主库执行 CREATE USER ... REPLICATION SLAVEGRANT REPLICATION SLAVE ON *.*
  • 半同步插件安装:在主库安装 rpl_semi_sync_source,在从库安装 rpl_semi_sync_replica
  • 克隆插件加载:加载 mysql_clone.so,为后续克隆从库提供基础;
  • 复制关系建立:在从库执行 CHANGE REPLICATION SOURCE TO ... SOURCE_HOST=主库IP, SOURCE_USER=复制用户, SOURCE_PASSWORD=密码, ...,并启用 GTID_AUTO_POSITION=1
  • 复制启动与验证:执行 START REPLICA,并检查 Replica_IO_RunningReplica_SQL_Running 是否为 Yes。

2.2.5 健康检查模块

  • MySQL 服务状态检查systemctl status mysql.service
  • MySQL 连接测试:通过 mysql -u root -p -e "SELECT VERSION()" 验证登录;
  • 复制状态检查:主库 SHOW BINARY LOG STATUS,从库 SHOW REPLICA STATUS
  • 半同步状态验证SHOW GLOBAL VARIABLES LIKE 'rpl_semi_sync_source_enabled''rpl_semi_sync_replica_enabled'
  • 数据一致性验证:在主库创建测试库、测试表并写入数据,在从库查询验证同步结果。

2.3 支持环境

2.3.1 控制机环境

项目 要求
操作系统 Linux(推荐 RHEL/CentOS 7+,或与目标服务器同源系统)
Python 版本 3.6 及以上(RHEL9/OEL9 默认 Python 3.9 即可)
必需依赖 pyyaml >= 5.0、paramiko >= 2.0(离线包见 python-pkgs/
网络 能够 SSH 到所有目标服务器的 22 端口(或自定义端口)
权限 具有目标服务器的 root SSH 登录权限
磁盘 至少预留 MySQL 二进制包大小(约 1GB)的临时空间

2.3.2 目标服务器环境

项目 要求
操作系统 RHEL9 / OEL9 / Kylin V10 系列 Linux(glibc 2.28+)
内存 至少 4GB RAM(生产推荐 8GB+,工具默认 innodb_buffer_pool_size=2G
磁盘 至少 50GB 可用空间(数据目录与日志目录分开更佳)
网络 所有目标服务器之间网络互通,且 3306 端口未被占用
权限 提供 root 用户 SSH 登录权限(工具会创建 mysql 系统用户)
软件包 libaionumactlperlnet-toolswgettaropenssh-clients(工具会自动安装)

2.3.3 软件版本依赖

依赖 最低版本 用途
Python 3.6 脚本运行环境
pyyaml 5.0 YAML 配置文件解析
paramiko 2.0 SSH 连接与文件传输
MySQL 二进制包 8.X/9.X.0 目标数据库软件
Linux glibc 2.28 MySQL 8.X/9.X 二进制包依赖

2.3.4 不支持的场景

  • 不支持 Windows、macOS 作为目标服务器;
  • 不支持 MySQL 5.x、8.0 以下版本的二进制包(仅针对 9.x 设计);
  • 不支持非 root 用户安装(依赖 systemd、LVM、内核参数调整等特权操作);
  • 不支持跨大区、跨公网的高延迟链路作为主从复制通道(建议同机房或同专网)。

三、程序使用

3.1 前置准备

3.1.1 控制机依赖安装

在线安装:

pip3 install pyyaml paramiko

离线安装(使用工具自带 python-pkgs/):

pip3 install --no-index --find-links=./python-pkgs pyyaml paramiko

验证:

python3 -c "import yaml, paramiko; print('pyyaml', yaml.__version__); print('paramiko', paramiko.__version__)"

3.1.2 准备 MySQL 二进制包

将 MySQL 8.X/9.X.0 二进制包放置在控制机的脚本同级目录或 /tmp 目录下,文件名形如 mysql-8.X/9.X.0-linux-glibc2.28-x86_64.tar.xz。工具会自动搜索 .tar.xz.tar.gz 两种格式,无需提前上传到目标服务器。

3.1.3 编辑配置文件

编辑 ,重点关注以下字段:

replication:
  master_ip: "192.168.1.51"          # 主服务器 IP(命令行 -mr 会覆盖)
  slave_ips:                          # 从服务器 IP 列表(命令行 -mr 会覆盖)
    - "192.168.1.52"
    - "192.168.1.53"
  replication_user: "fgedu_repl"
  replication_password: "fgedu_repl_123"

mysql:
  install_dir: /mysql/app/mysql
  data_dir: /mysql/data/3306/data
  port: 3306
  socket: /tmp/mysql.sock
  root_password: "fgedu123"
  version: "8.X/9.X.0"

ssh:
  username: root
  password: "rootroot"
  port: 22
  timeout: 30
  retry_count: 3

其余 system.kernelsystem.lvmsystem.securitysystem.timeoutmysql.my_cnf 等字段可按需调整,未调整则使用工具内置的合理默认值。

3.2 命令行参数

参数 简写 是否必填 说明
--master-replica -mr 主从服务器 IP 列表,格式:主IP,从1IP,从2IP,...,至少 2 个 IP
--username -u SSH 用户名(通常为 root)
--password -p SSH 密码
--port SSH 端口,默认 22
--verify-only 仅验证环境不安装
--config -c 配置文件路径,默认

查看帮助:

python3 FGMySQLAutoInstall_MR.py --help

3.3 基本使用

3.3.1 安装 1 主 2 从(最常用)

python3 FGMySQLAutoInstall_MR.py -mr 192.168.1.51,192.168.1.52,192.168.1.53 -u root -p rootroot

说明:192.168.1.51 为主库(可读写),192.168.1.52192.168.1.53 为从库(只读)。

3.3.2 安装 1 主 1 从

python3 FGMySQLAutoInstall_MR.py -mr 192.168.1.51,192.168.1.52 -u root -p rootroot

3.3.3 安装 1 主 3 从 / 1 主 4 从

# 1 主 3 从
python3 FGMySQLAutoInstall_MR.py -mr 192.168.1.51,192.168.1.52,192.168.1.53,192.168.1.54 -u root -p rootroot

# 1 主 4 从
python3 FGMySQLAutoInstall_MR.py -mr 192.168.1.51,192.168.1.52,192.168.1.53,192.168.1.54,192.168.1.55 -u root -p rootroot

3.3.4 指定自定义 SSH 端口

python3 FGMySQLAutoInstall_MR.py -mr 192.168.1.51,192.168.1.52 -u root -p rootroot --port 2222

3.3.5 仅验证环境不安装

python3 FGMySQLAutoInstall_MR.py -mr 192.168.1.51,192.168.1.52,192.168.1.53 -u root -p rootroot --verify-only

3.3.6 使用自定义配置文件

python3 FGMySQLAutoInstall_MR.py -mr 192.168.1.51,192.168.1.52 -u root -p rootroot -c /path/to/custom_config.yaml

3.4 执行流程说明

执行安装命令后,工具会依次完成以下步骤:

  1. 打印工具版本与作者信息;
  2. 加载并解析 ,将命令行参数回写配置;
  3. 检查各目标主机是否已存在 MySQL 安装,提示用户决定是否清理;
  4. 在各目标主机搜索 MySQL 二进制包,多版本时交互选择统一版本;
  5. 为每台主机创建独立线程并行执行:系统配置 -> 解压安装 -> 初始化 -> 生成 my.cnf -> 配置 systemd -> 启动 MySQL -> 设置 root 密码;
  6. 等待所有线程完成,汇总失败主机并执行回滚;
  7. 配置主从复制:创建复制用户、安装半同步插件、从库连接主库、启动复制;
  8. 创建测试数据库与测试表,写入测试数据;
  9. 验证主从复制状态与半同步状态;
  10. 打印安装完成信息、主从关系图、常用检查命令、生产环境提醒。

3.5 输出与日志

  • 控制台输出:实时打印进度与状态;
  • 日志文件logs/mysql_mr_install_YYYYMMDD_HHMMSS.log,完整记录所有操作与远程命令输出;
  • 完成信息:包含主从关系树形图、复制模式、测试库信息、常用检查命令。

四、案例场景与操作过程

4.1 场景一:MySQL标准 1 主 2 从生产部署

背景:某企业新采购 3 台服务器(192.168.1.51/52/53),需要部署一套 MySQL 8.X/9.X 主从复制集群用于业务系统。

操作过程

  1. 在控制机安装依赖:
pip3 install --no-index --find-links=./python-pkgs pyyaml paramiko
  1. 将 MySQL 8.X/9.X.0 二进制包 mysql-8.X/9.X.0-linux-glibc2.28-x86_64.tar.xz 上传到控制机脚本同级目录;

  2. 编辑 ,确认 mysql.root_passwordreplication.replication_user/password 已改为强密码;

  3. 执行安装:

python3 FGMySQLAutoInstall_MR.py -mr 192.168.1.51,192.168.1.52,192.168.1.53 -u root -p rootroot
  1. 观察输出,确认各阶段全部 SUCCESS;

  2. 验证复制状态:

# 主库
mysql -h 192.168.1.51 -u root -p -e "SHOW BINARY LOG STATUS;"
mysql -h 192.168.1.51 -u root -p -e "SHOW REPLICAS;"

# 从库
mysql -h 192.168.1.52 -u root -p -e "SHOW REPLICA STATUS\G"
mysql -h 192.168.1.53 -u root -p -e "SHOW REPLICA STATUS\G"

确认 Replica_IO_Running: YesReplica_SQL_Running: YesSeconds_Behind_Source: 0

4.2 场景二:MySQL 1 主 1 从最小化部署

背景:开发测试环境仅需 1 主 1 从即可。

操作过程

python3 FGMySQLAutoInstall_MR.py -mr 192.168.1.51,192.168.1.52 -u root -p rootroot

执行过程与场景一一致,区别仅在于从库数量为 1,server-id 从 33062 开始。

4.3 场景三:MySQL 1 主 3 从高可用扩展

背景:业务读写分离需要 1 主 3 从。

操作过程

python3 FGMySQLAutoInstall_MR.py -mr 192.168.1.51,192.168.1.52,192.168.1.53,192.168.1.54 -u root -p rootroot

工具会自动为 3 台从库分配 server-id 33062/33063/33064,并并行安装。

4.4 场景四:MySQL自定义 SSH 端口的安全主机

背景:目标服务器 SSH 端口改为 2222,密码登录。

操作过程

python3 FGMySQLAutoInstall_MR.py -mr 192.168.1.51,192.168.1.52 -u root -p rootroot --port 2222

--port 参数会被回写到 的 ssh.port 字段,后续所有 SSH 操作均使用该端口。

4.5 场景五:仅验证环境不安装

背景:正式安装前先确认环境是否满足要求。

操作过程

python3 FGMySQLAutoInstall_MR.py -mr 192.168.1.51,192.168.1.52,192.168.1.53 -u root -p rootroot --verify-only

工具会完成配置加载、SSH 连接验证、安装包检测等前置检查,但不执行实际安装,便于提前发现问题。

4.6 场景六:使用自定义配置文件

背景:同时维护开发、测试、生产三套环境,使用不同配置文件。

操作过程

# 开发环境
python3 FGMySQLAutoInstall_MR.py -mr 10.0.0.11,10.0.0.12 -u root -p devpass -c config/dev.yaml

# 生产环境
python3 FGMySQLAutoInstall_MR.py -mr 192.168.1.51,192.168.1.52,192.168.1.53 -u root -p prodpass -c config/prod.yaml

4.7 场景七:多版本 MySQL 安装包选择

背景:控制机 /tmp 目录下同时存在 MySQL 8.X/9.X.0 与另一版本二进制包。

操作过程

执行安装命令后,工具会列出检测到的所有版本并提示:

检测到多个MySQL版本,请选择要安装的版本:
  [1] mysql-8.X/9.X.0-linux-glibc2.28-x86_64.tar.xz (xxx.xx MB)
  [2] mysql-9.x.x-linux-glibc2.28-x86_64.tar.xz (yyy.yy MB)
请选择版本 (1-2):

输入对应序号后,工具会统一所有主机的安装版本。

4.8 场景八:MySQL主从切换演练

背景:安装完成后,演练将主库从 192.168.1.51 切换到 192.168.1.52。

操作过程

# 1. 主库加读锁
mysql -h 192.168.1.51 -u root -p -e "FLUSH TABLES WITH READ LOCK; SET GLOBAL read_only=ON;"

# 2. 确认从库 192.168.1.52 已追上
mysql -h 192.168.1.52 -u root -p -e "SHOW REPLICA STATUS\G"
# 确认 Seconds_Behind_Source = 0

# 3. 提升从库为新主
mysql -h 192.168.1.52 -u root -p -e "STOP REPLICA; RESET REPLICA ALL; SET GLOBAL read_only=OFF; SET GLOBAL super_read_only=OFF;"

# 4. 其他从库指向新主
mysql -h 192.168.1.53 -u root -p -e "STOP REPLICA; CHANGE REPLICATION SOURCE TO SOURCE_HOST='192.168.1.52', SOURCE_USER='fgedu_repl', SOURCE_PASSWORD='fgedu_repl_123', SOURCE_AUTO_POSITION=1; START REPLICA;"

# 5. 验证
mysql -h 192.168.1.52 -u root -p -e "SHOW BINARY LOG STATUS;"
mysql -h 192.168.1.53 -u root -p -e "SHOW REPLICA STATUS\G"

4.9 场景九:MySQL离线环境部署

背景:目标机房无外网,无法在线安装 Python 依赖。

操作过程

  1. 在有网机器上准备 python-pkgs/ 目录(工具已自带),或使用 pip3 download pyyaml paramiko -d ./python-pkgs 下载;
  2. 将整个工具目录连同 python-pkgs/ 拷贝到控制机;
  3. 在控制机执行:
pip3 install --no-index --find-links=./python-pkgs pyyaml paramiko
  1. 将 MySQL 二进制包拷贝到控制机脚本同级目录或 /tmp
  2. 执行安装命令,流程与在线环境一致。

五、常用问题与排查

5.1 SSH 连接失败

现象:日志提示 主机 x.x.x.x 连接失败ERROR: ...

排查

# 1. 检查网络连通性
ping <目标IP>

# 2. 检查 SSH 端口可达
bash -c "exec 3<>/dev/tcp/<目标IP>/22; echo OK"

# 3. 手工 SSH 登录验证
ssh root@<目标IP>

# 4. 检查防火墙
systemctl status firewalld

常见原因:目标服务器防火墙未关闭、SSH 服务未启动、SSH 端口非 22、密码错误、/etc/hosts.allowfail2ban 拦截。

5.2 未找到 MySQL 安装包

现象:日志提示 所有主机都未找到MySQL安装包

排查

# 1. 确认安装包位置
ls -lh ./mysql-9*.tar.xz
ls -lh /tmp/mysql-9*.tar.xz

# 2. 确认文件大小大于 100MB(工具的过滤阈值)
ls -lh mysql-8.X/9.X.0-linux-glibc2.28-x86_64.tar.xz

常见原因:文件名不含 mysql(被过滤)、文件大小小于 100MB(被过滤)、文件格式不是 .tar.xz.tar.gz

5.3 磁盘空间不足

现象:解压或初始化阶段报 No space left on device

排查

df -h /mysql
df -h /tmp
df -h /

处理:清理 /var/log/tmp 残留文件,或在 的 system.lvm 中挂载更大的块设备到 /mysql

5.4 端口 3306 被占用

现象:MySQL 启动失败,错误日志提示 Port 3306 already in use

排查

netstat -tlnp | grep 3306
lsof -i:3306

处理:停止占用端口的进程,或在 中修改 mysql.portmy_cnf.port

5.5 依赖包安装失败

现象yum install 阶段失败,提示 No package xxx available

排查

yum repolist
# 确认是否有可用仓库

处理:配置本地 YUM 源或内网镜像源,或在 的 system.packages 中移除缺失的包(前提是目标系统已有替代)。

5.6 MySQL 初始化失败

现象mysqld --initialize 报错。

排查

# 查看数据目录是否为空
ls -la /mysql/data/3306/data

# 查看 mysql 用户是否创建
id mysql

# 查看权限
ls -ld /mysql/data/3306/data

处理:清空数据目录后重试,确认目录属主为 mysql:mysql

5.7 root 密码设置失败

现象:启动 MySQL 后执行 ALTER USER 报错。

排查

# 查看错误日志
tail -100 /mysql/log/3306/fgedudb-error.err

常见原因:MySQL 未完全启动、root 初始密码未正确获取、my.cnf 中存在语法错误。

5.8 主从复制无法启动

现象:从库 SHOW REPLICA STATUSReplica_IO_RunningReplica_SQL_Running 为 No。

排查

# 从库查看复制状态与错误
mysql -u root -p -e "SHOW REPLICA STATUS\G" | grep -E "Running|Last_Error"

# 检查网络
bash -c "exec 3<>/dev/tcp/<主库IP>/3306; echo OK"

# 检查复制用户
mysql -h <主库IP> -u root -p -e "SELECT user,host FROM mysql.user WHERE user='fgedu_repl';"

常见原因:主库未创建复制用户、复制用户密码错误、主库 3306 端口未开放、GTID 模式不一致。

5.9 半同步插件加载失败

现象INSTALL PLUGIN rpl_semi_sync_source SONAME 'semisync_source.so' 报错。

排查

# 检查插件文件是否存在
ls -la /mysql/app/mysql/lib/plugin/semisync*.so

# 查看 MySQL 错误日志
tail -50 /mysql/log/3306/fgedudb-error.err

处理:确认二进制包完整,必要时重新解压;检查 my.cnfplugin-load-add 语法是否正确。

5.10 LVM 配置失败

现象pvcreate/vgcreate/lvcreate 报错。

排查

# 确认块设备存在
ls -la /dev/sdc

# 确认设备未被占用
pvdisplay | grep /dev/sdc

处理:如该主机已配置 LVM,可在 的对应 system.lvm 项中将 skip 设为 true 跳过。

5.11 安装中断后如何清理重试

现象:安装过程中因各种原因中断,再次执行时提示已存在 MySQL。

处理

# 1. 在目标主机停止 MySQL
systemctl stop mysql.service
pkill -9 mysqld

# 2. 清理数据目录与安装目录
rm -rf /mysql/data/3306/data/*
rm -rf /mysql/app/mysql/*

# 3. 重新执行安装命令
python3 FGMySQLAutoInstall_MR.py -mr ... -u root -p ...

工具在检测到旧安装时会提示用户选择是否清理,按提示操作即可。

5.12 日志位置与查看

# 安装日志
ls -lh logs/mysql_mr_install_*.log
tail -200 logs/mysql_mr_install_YYYYMMDD_HHMMSS.log

# MySQL 错误日志
ssh root@<目标IP> "tail -100 /mysql/log/3306/fgedudb-error.err"

# MySQL 慢查询日志
ssh root@<目标IP> "tail -50 /mysql/log/3306/fgedudb-query.err"

六、附录

6.1 目录结构

/mysql/
├── app/
│   └── mysql/              # MySQL 安装目录
├── data/
│   └── 3306/
│       ├── data/           # 数据文件目录
│       ├── my.cnf          # 配置文件
│       └── mysql.pid       # 进程 PID
├── log/
│   └── 3306/
│       ├── fgedudb-error.err   # 错误日志
│       ├── fgedudb-query.err   # 慢查询日志
│       ├── fgedudb-general.err# 通用日志
│       ├── binlog/            # 二进制日志
│       └── relaylog/          # 中继日志
/backup/                     # 备份目录(LVM 可选)

6.2 常用维护命令

# 检查服务状态
systemctl status mysql.service

# 主库查看二进制日志状态
mysql -u root -p -e "SHOW BINARY LOG STATUS;"

# 主库查看从库列表
mysql -u root -p -e "SHOW REPLICAS;"

# 从库查看复制状态
mysql -u root -p -e "SHOW REPLICA STATUS\G"

# 从库停止/启动/重置复制
mysql -u root -p -e "STOP REPLICA;"
mysql -u root -p -e "START REPLICA;"
mysql -u root -p -e "RESET REPLICA;"

# 查看半同步状态
mysql -u root -p -e "SHOW GLOBAL VARIABLES LIKE 'rpl_semi_sync%';"

6.3 安全建议

  • 安装完成后立即修改 中的默认密码(root、复制用户、SSH 密码);
  • 生产环境关闭防火墙后应配置 iptables/firewalld 规则,仅允许可信 IP 访问 3306;
  • 启用 SSH 密钥登录并禁用 root 密码登录;
  • 定期备份 /mysql/data/3306/data 与 binlog;
  • 为 MySQL 配置独立的备份账号与监控账号,遵循最小权限原则。

6.4 技术支持

如在使用过程中遇到问题,可通过以下方式联系作者获取支持:
作者:风哥
官方网站   http://www.fgedu.net.cn , http://www.itpux.com
数据库教程 https://edu.51cto.com/lecturer/8020378.html
mysql主从集群一键安装教程 https://edu.51cto.com/course/40554.html

posted @ 2026-09-02 18:54  风哥数据库教程  阅读(4)  评论(0)    收藏  举报