MySQL 学习|源码编译安装、备份恢复、主从复制与读写分离
整理自 MySQL 课程教材第四章,适合 Linux 下 MySQL 运维学习,包含实操重点、原理和实验要点。
一、MySQL5.7 源码编译安装
源码安装适合自定义编译参数,灵活定制 MySQL 功能,生产环境与学习环境都可以使用。
1. 环境准备
操作系统:CentOS 7
- 安装编译依赖包
yum-yinstallncurses ncurses-devel bison cmake gcc gcc-c++- 创建运行 MySQL 的系统用户,禁止登录 shell
useradd-s/sbin/nologin mysql- 解压源码包与 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.172. 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&&makeinstall3. 系统配置
- 修改目录属主属组
chown-Rmysql.mysql /usr/local/mysql/- 编写
/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- 配置环境变量
echo'PATH=/usr/local/mysql/bin:/usr/local/mysql/lib:$PATH'>>/etc/profileecho'export PATH'>>/etc/profilesource/etc/profile4. 数据库初始化、配置 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 systemctlenablemysqld5. 设置密码、远程授权
# 设置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 openpyxlpython 示例代码
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 备份与恢复
生产环境数据安全至关重要,人为误删、磁盘损坏、灾难都会造成数据丢失,必须定期备份。
备份两大分类
- 物理备份:直接备份数据库磁盘数据文件
- 冷备份(脱机):停止 MySQL 服务,直接打包 data 数据目录。恢复:解压压缩包,修改文件权限,启动 MySQL。优点速度快;缺点业务必须停机。
- 热备份(联机):数据库不停机,依赖二进制日志 binlog;代表工具 Percona‑XtraBackup。
- 逻辑备份:备份 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),可以实现增量恢复。
- 在 my.cnf 开启二进制日志
[mysqld]log‑bin=mysql‑bin重启 MySQL 生成 binlog 日志文件。 2. 操作流程
- 先执行一次完整全量备份;
- 使用
mysqladmin flush‑logs刷新 binlog,生成新日志文件; - 后续新增业务操作全部记录在新 binlog;
- 故障恢复:
mysqlbinlog 日志文件 | mysql -uroot -p重放日志恢复数据。
⚠️注意:binlog 是二进制文件,不能直接 vim 打开查看,必须用 mysqlbinlog 工具解析。
三、MySQL 主从复制
核心组件
- 主库 binlog(二进制日志):记录所有写操作
- 从库 IO 线程:连接主库,拉取 binlog,写入本地
relay‑log中继日志 - 从库 SQL 线程:读取中继日志,重放 SQL 语句,实现数据同步
完整工作流程
- 主库执行
insert / update / delete写操作,操作写入 binlog 二进制日志; - 从库 IO 线程建立连接请求主库 binlog;主库 dump 线程推送 binlog 事件;
- IO 线程收到日志写入本机中继日志 relay‑log;
- SQL 线程读取中继日志,执行日志内 SQL;
- 最终从库数据与主库保持一致。
✅ 健康状态判断:show slave status\G,Slave_IO_Running: Yes、Slave_SQL_Running: Yes,两个 Yes 代表复制正常。
实验配置要点
- 环境准备:所有节点时间同步
ntpdate ntp.aliyun.com,关闭防火墙与 SELinux。 - 主库配置
- 修改 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值- 从库配置
克隆虚拟机生成从库,一定要删除
/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- 验证:主库创建库、表,插入数据,查看从库是否同步。
主从复制作用
- 数据冗余,灾难故障恢复;
- 分离读写压力,为读写分离打下基础;
缺点:从库 SQL 线程串行回放日志,主库并发写入时,从库会存在复制延迟。
四、MySQL 读写分离(Amoeba 中间件)
原理
- 写操作(INSERT / UPDATE / DELETE):全部交给主库执行;
- 读操作(SELECT 查询):交给从库执行; 主从复制自动把主库变更同步到从库。
实现两种方案:
- 代码层实现:业务代码判断 SQL 类型,写连主库,读连从库;
- 中间件代理实现:Amoeba、MyCat、MySQL‑Proxy。应用连接代理,代理自动路由 SQL,业务代码零改动。
Amoeba 介绍
Amoeba 是 Java 开发的 MySQL 代理中间件,SQL 路由器。
⚠️重要前提:Amoeba 只做 SQL 路由,不做数据同步!必须提前部署好 MySQL 主从复制集群。
核心配置文件
amoeba.xml:代理端口、客户端账号密码、读写池配置
writePool:写操作转发的主库;readPool:读操作转发从库集群,自动负载均衡。
dbServers.xml:配置后端 MySQL 主、从节点 IP、数据库账号密码。
部署流程
- 安装 JDK 环境;部署 amoeba 程序包;配置环境变量。
- 在所有 MySQL 主从节点,授权 amoeba 访问账号。
- 修改
amoeba.xml、dbServers.xml配置后端数据库集群信息。 - 启动 amoeba 服务,默认监听 8066 端口。
- 应用程序连接 amoeba 代理服务,写自动路由主库,读轮询转发各个从库。
实验拓扑回顾
表格
| 主机名 | IP 地址 | 角色 |
|---|---|---|
| mysql‑master | 192.168.108.101 | mysql 主服务器 |
| mysql‑slave01 | 192.168.108.102 | 从节点 1 |
| mysql‑slave02 | 192.168.108.103 | 从节点 2 |
| amoeba | 192.168.108.110 | amoeba 代理中间件 |
| mysql‑client | 192.168.108.111 | 应用客户端 |
📝本章核心总结
- MySQL 源码编译重点注意 cmake 参数,报错删除 CMakeCache.txt;初始化使用
--initialize‑insecure生成无密码实例。 - 备份分物理备份、逻辑备份、增量备份;mysqldump 做逻辑备份,binlog 实现增量恢复。
- 主从复制三要素:binlog、IO 线程、SQL 线程;
server‑id全局唯一,克隆从库删除 auto.cnf。 - 读写分离:主写从读;Amoeba 属于代理中间件,依赖主从复制环境,实现业务无感知读写分离。