☰
吃透 MySQL 高可用:源码安装、备份恢复、主从复制与读写分离
2026/9/30 7:23:46 网站建设 项目流程

MySQL 学习|源码编译安装、备份恢复、主从复制与读写分离

整理自 MySQL 课程教材第四章,适合 Linux 下 MySQL 运维学习,包含实操重点、原理和实验要点。

一、MySQL5.7 源码编译安装

源码安装适合自定义编译参数,灵活定制 MySQL 功能,生产环境与学习环境都可以使用。

1. 环境准备

操作系统:CentOS 7

  1. 安装编译依赖包
yum-yinstallncurses ncurses-devel bison cmake gcc gcc-c++
  1. 创建运行 MySQL 的系统用户,禁止登录 shell
useradd-s/sbin/nologin mysql
  1. 解压源码包与 boost 库(boost 为 C++ 底层依赖库)
tarzxvf mysql-5.7.17.tar.gz-C/opt/tarzxvf boost_1_59_0.tar.gz-C/usr/local/mv/usr/local/boost_1_59_0 /usr/local/boostcd/opt/mysql-5.7.17

2. cmake 编译配置

cmake 用来配置编译参数,编译报错后,必须删除源码目录下的CMakeCache.txt,再重新 cmake,否则旧错误会保留。

cmake\-DCMAKE_INSTALL_PREFIX=/usr/local/mysql\-DMYSQL_UNIX_ADDR=/usr/local/mysql/mysql.sock\-DSYSCONFDIR=/etc\-DSYSTEMD_PID_DIR=/usr/local/mysql\-DDEFAULT_CHARSET=utf8\-DDEFAULT_COLLATION=utf8_general_ci\-DWITH_INNOBASE_STORAGE_ENGINE=1\-DWITH_ARCHIVE_STORAGE_ENGINE=1\-DWITH_BLACKHOLE_STORAGE_ENGINE=1\-DWITH_PERFSCHEMA_STORAGE_ENGINE=1\-DMYSQL_DATADIR=/usr/local/mysql/data\-DWITH_BOOST=/usr/local/boost\-DWITH_SYSTEMD=1

编译并安装:

make&&makeinstall

3. 系统配置

  1. 修改目录属主属组
chown-Rmysql.mysql /usr/local/mysql/
  1. 编写/etc/my.cnf主配置文件,修改属主
[client]port=3306default-character-set=utf8 socket=/usr/local/mysql/mysql.sock[mysql]port=3306default-character-set=utf8 socket=/usr/local/mysql/mysql.sock[mysqld]user=mysql basedir=/usr/local/mysql datadir=/usr/local/mysql/data port=3306character_set_server=utf8 pid-file=/usr/local/mysql/mysqld.pid socket=/usr/local/mysql/mysql.sock server-id=1sql_mode=NO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES,NO_AUTO_CREATE_USER,NO_AUTO_VALUE_ON_ZERO,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,PIPES_AS_CONCAT,ANSI_QUOTESchownmysql:mysql /etc/my.cnf
  1. 配置环境变量
echo'PATH=/usr/local/mysql/bin:/usr/local/mysql/lib:$PATH'>>/etc/profileecho'export PATH'>>/etc/profilesource/etc/profile

4. 数据库初始化、配置 systemd 服务

cd/usr/local/mysql/ bin/mysqld --initialize-insecure--user=mysql--basedir=/usr/local/mysql--datadir=/usr/local/mysql/datacp/usr/local/mysql/usr/lib/systemd/system/mysqld.service /usr/lib/systemd/system/ systemctl daemon-reload systemctl start mysqld systemctlenablemysqld

5. 设置密码、远程授权

# 设置root密码mysqladmin-urootpassword"huawei"# 授权root远程访问mysql-uroot-phuaweiGRANT ALL PRIVILEGES ON *.* TO'root'@'%'IDENTIFIED BY'huawei'WITH GRANT OPTION;FLUSH PRIVILEGES;

6. Python 导出 MySQL 数据到 Excel

安装依赖库

pipinstallpandas sqlalchemy pymysql openpyxl

python 示例代码

importpandas as pd from sqlalchemyimportcreate_engine# 数据库连接engine=create_engine('mysql+pymysql://root:huawei@192.168.108.142:3306/school')# 查询数据df=pd.read_sql('select * from info', engine)print(df)# 导出exceldf.to_excel('info.xlsx',index=False)print('excel 导出成功!')

二、MySQL 备份与恢复

生产环境数据安全至关重要,人为误删、磁盘损坏、灾难都会造成数据丢失,必须定期备份。

备份两大分类

  1. 物理备份:直接备份数据库磁盘数据文件
  • 冷备份(脱机):停止 MySQL 服务,直接打包 data 数据目录。恢复:解压压缩包,修改文件权限,启动 MySQL。优点速度快;缺点业务必须停机。
  • 热备份(联机):数据库不停机,依赖二进制日志 binlog;代表工具 Percona‑XtraBackup。
  1. 逻辑备份:备份 SQL 语句,使用mysqldump工具,数据库可以正常对外提供服务。
#备份单个库mysqldump-uroot-pschool>/mysql_bak/school.sql#备份多个库mysqldump-uroot-p--databasesschool mysql>/mysql_bak/school‑mysql.sql#备份所有库mysqldump-uroot-p--opt--all‑databases>/mysql_bak/all.sql#备份单张表mysqldump-uroot-pschool info>/mysql_bak/info.sql

逻辑备份恢复:登录 mysql 使用source 备份文件路径;

增量备份(基于 binlog 二进制日志)

binlog 记录所有数据库 DML 写操作(insert/update/delete),可以实现增量恢复。

  1. 在 my.cnf 开启二进制日志
[mysqld]log‑bin=mysql‑bin

重启 MySQL 生成 binlog 日志文件。 2. 操作流程

  • 先执行一次完整全量备份;
  • 使用mysqladmin flush‑logs刷新 binlog,生成新日志文件;
  • 后续新增业务操作全部记录在新 binlog;
  • 故障恢复:mysqlbinlog 日志文件 | mysql -uroot -p重放日志恢复数据。

⚠️注意:binlog 是二进制文件,不能直接 vim 打开查看,必须用 mysqlbinlog 工具解析。


三、MySQL 主从复制

核心组件

  1. 主库 binlog(二进制日志):记录所有写操作
  2. 从库 IO 线程:连接主库,拉取 binlog,写入本地relay‑log中继日志
  3. 从库 SQL 线程:读取中继日志,重放 SQL 语句,实现数据同步

完整工作流程

  1. 主库执行insert / update / delete写操作,操作写入 binlog 二进制日志;
  2. 从库 IO 线程建立连接请求主库 binlog;主库 dump 线程推送 binlog 事件;
  3. IO 线程收到日志写入本机中继日志 relay‑log;
  4. SQL 线程读取中继日志,执行日志内 SQL;
  5. 最终从库数据与主库保持一致。

✅ 健康状态判断:show slave status\G,Slave_IO_Running: Yes、Slave_SQL_Running: Yes,两个 Yes 代表复制正常。

实验配置要点

  1. 环境准备:所有节点时间同步ntpdate ntp.aliyun.com,关闭防火墙与 SELinux。
  2. 主库配置
  • 修改 my.cnf
server‑id=11log‑bin=master‑bin log‑slave‑updates=true

重启 MySQL。创建复制账号:

GRANT REPLICATION SLAVE ON *.* TO'myslave'@'192.168.108.%'IDENTIFIED BY'123456';FLUSH PRIVILEGES;show master status;--记录File和Position值
  1. 从库配置

克隆虚拟机生成从库,一定要删除/usr/local/mysql/data/auto.cnf,防止 UUID 重复,复制报错!

  • my.cnf 配置
server‑id=22# 多个从库server‑id必须各不相同,不能和主库重复relay‑log=relay‑log‑bin relay‑log‑index=slave‑relay‑bin.index

重启 MySQL,配置主从连接:

change master tomaster_host='192.168.108.101',master_user='myslave',master_password='123456',master_log_file='master‑bin.000001',master_log_pos=604;start slave;show slave status\G
  1. 验证:主库创建库、表,插入数据,查看从库是否同步。

主从复制作用

  1. 数据冗余,灾难故障恢复;
  2. 分离读写压力,为读写分离打下基础;

缺点:从库 SQL 线程串行回放日志,主库并发写入时,从库会存在复制延迟。


四、MySQL 读写分离(Amoeba 中间件)

原理

  • 写操作(INSERT / UPDATE / DELETE):全部交给主库执行;
  • 读操作(SELECT 查询):交给从库执行; 主从复制自动把主库变更同步到从库。

实现两种方案:

  1. 代码层实现:业务代码判断 SQL 类型,写连主库,读连从库;
  2. 中间件代理实现:Amoeba、MyCat、MySQL‑Proxy。应用连接代理,代理自动路由 SQL,业务代码零改动。

Amoeba 介绍

Amoeba 是 Java 开发的 MySQL 代理中间件,SQL 路由器。

⚠️重要前提:Amoeba 只做 SQL 路由,不做数据同步!必须提前部署好 MySQL 主从复制集群。

核心配置文件
  1. amoeba.xml:代理端口、客户端账号密码、读写池配置
  • writePool:写操作转发的主库;
  • readPool:读操作转发从库集群,自动负载均衡。
  1. dbServers.xml:配置后端 MySQL 主、从节点 IP、数据库账号密码。
部署流程
  1. 安装 JDK 环境;部署 amoeba 程序包;配置环境变量。
  2. 在所有 MySQL 主从节点,授权 amoeba 访问账号。
  3. 修改amoeba.xml、dbServers.xml配置后端数据库集群信息。
  4. 启动 amoeba 服务,默认监听 8066 端口。
  5. 应用程序连接 amoeba 代理服务,写自动路由主库,读轮询转发各个从库。

实验拓扑回顾

表格

主机名IP 地址角色
mysql‑master192.168.108.101mysql 主服务器
mysql‑slave01192.168.108.102从节点 1
mysql‑slave02192.168.108.103从节点 2
amoeba192.168.108.110amoeba 代理中间件
mysql‑client192.168.108.111应用客户端

📝本章核心总结

  1. MySQL 源码编译重点注意 cmake 参数,报错删除 CMakeCache.txt;初始化使用--initialize‑insecure生成无密码实例。
  2. 备份分物理备份、逻辑备份、增量备份;mysqldump 做逻辑备份,binlog 实现增量恢复。
  3. 主从复制三要素:binlog、IO 线程、SQL 线程;server‑id全局唯一,克隆从库删除 auto.cnf。
  4. 读写分离:主写从读;Amoeba 属于代理中间件,依赖主从复制环境,实现业务无感知读写分离。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询