MySQL 运维(Binlog + 备份 + 主从 + LNMP)整合面试背诵笔记
一、Binlog 二进制日志
1. 作用
记录产生数据变更 的 SQL 语句:DML、DDL、DCL;用于数据恢复、主从复制
补充:DML 按事务记录,DDL/DCL 单条语句自成一个事务
2. 开启配置(my.cnf)
log_bin=binlog
server_id=1 # 集群必填,所有节点不能重复
修改配置后重启 MySQL,自动生成 binlog 文件 + binlog 索引文件
3. 三种记录格式
- SBR(Statement):记录 SQL 语句,日志量小,部分函数存在主从数据不一致风险
- RBR(Row):记录行变更数据,数据安全,日志体积大(企业主流)
- MBR(Mixed):混合模式,自动选择 SBR/RBR
4. 常用查看命令
-- 查看binlog是否开启
show variables like '%log_bin%';
-- 查看所有binlog文件
show binary logs;
-- 查看当前正在写入的binlog及position
show master status;
-- 查看指定binlog内事件
show binlog events in "mysql-bin.000002";
# 解析binlog文件
mysqlbinlog mysql-bin.000002
5. binlog 切割、重置、临时关闭
flush logs; -- 手动切割binlog,生成新日志文件
reset master; -- 清空所有binlog(生产慎用!)
set sql_log_bin=0; -- 当前会话临时关闭binlog,恢复设为1
6. Binlog 数据恢复
① 按位置截取
mysqlbinlog --start-position=xxx --stop-position=xxx mysql-bin.000001 > recover.sql
恢复流程:
- 截取 binlog 导出 sql
set sql_log_bin=0;(避免恢复语句写入 binlog)source recover.sql;set sql_log_bin=1;
② 按时间截取
mysqlbinlog --start-datetime="2026-08-11 09:40:49" --stop-datetime="2026-08-11 09:44:15" mysql-bin.000001 > 3.sql
③ GTID 模式截取(事务为单位)
# --skip-gtids:导入时不保留原有gtid;--include-gtids 指定导入事务
mysqlbinlog --skip-gtids --include-gtids='984cd010-2297-11ed-9769-000c2945923c:1-3' mysql-bin.000004 >/tmp/gtid.sql
# --exclude-gtids:跳过指定事务
二、MySQL 数据备份与容灾
1. 数据丢失原因 & 解决方案
- 程序 Bug:严格测试、代码评审
- 人为误操作(运维高发):权限最小化、操作规范、变更审批
- 硬件故障:硬件冗余(RAID、多服务器)
- 不可抗力(火灾 / 地震):两地三中心异地容灾
2. 备份分类
- 是否停机
- 冷备:数据库停机备份
- 热备:不停机备份(InnoDB 支持)
- 备份数据量
- 全备:整库完整备份
- 增备:备份上次备份后新增数据(依赖上一次备份)
- 差异备份:备份上次全备之后变化的数据
- 备份层次
- 物理备份:直接拷贝数据文件(xtrabackup)
- 逻辑备份:导出 SQL 语句(mysqldump)
3. 备份策略
根据业务数据量、更新频率、RTO/RPO制定:多久一次全备、多久增量备份、保留备份周期
4. mysqldump(自带免费逻辑备份,InnoDB 热备)
配套工具:
- mysqladmin:管理账号、修改密码
- mysqldumpslow:慢查询日志分析
- mysqlbinlog:解析二进制日志
常用备份命令
# 单库(不加-B:库名 表名)
mysqldump -uroot -p123456 testdb > test.sql
# -B / --databases 备份库(包含建库语句)
mysqldump -uroot -p123456 -B testdb > test.sql
# 全库备份
mysqldump -uroot -p123456 --all-databases > all.sql
# 备份并压缩
mysqldump -uroot -p123456 -A | gzip -9 > all.sql.gz
企业标准备份参数说明
mysqldump -uroot --master-data=2 --single-transaction --set-gtid-purged=OFF -p123123 --triggers --all-databases >/backup/all.sql
--single-transaction:InnoDB 热备,快照读,不锁表--master-data=1:导出文件中 CHANGE MASTER 语句无注释(用于搭建主从)--master-data=2:CHANGE MASTER 语句注释(日常备份推荐)--set-gtid-purged=OFF:关闭 GTID 相关导出配置--triggers:同步导出触发器
数据恢复两种方式
# 方式1:登录mysql执行
source /backup/all.sql;
# 方式2:命令行导入
mysql -uroot -p123456 < all.sql
经验:备份压缩后体积约为原文件 1/4
三、MySQL 主从复制(读写分离基础)
1. 业务架构演进
单机 LNMP → MySQL 主从(读写分离) → 增加 Redis 缓存、MQ 削峰 → 分库分表 → MHA 高可用
2. 读写分离实现
- 代码层实现(开发)
- 中间件实现(运维):Amoeba、Atlas
3. 主从复制原理(2 日志 + 2 线程)
- 主库:开启 binlog,记录所有变更 SQL
- 从库:开启 relay_log 中继日志
- IO 线程:从库连接主库,拉取主库 binlog,写入本地中继日志
- SQL 线程:读取本地中继日志,回放执行 SQL,保证主从数据一致
关键点:集群所有节点
server_id不能相同
4. 主从搭建完整步骤
-
规划多台 MySQL 节点,修改配置,保证 server_id 唯一
-
主库开启 log_bin,从库开启 relay_log
-
主库创建复制专用账号
grant replication slave on . to 'myslave'@'192.168.23.%' identified by '123123';
-
主库执行全量备份(带上 master-data 记录 binlog 位置)
-
将备份文件导入从库,初始化基础数据
-
从库配置主库信息
change master to
master_host='192.168.23.142',
master_user='myslave',
master_password='123123',
master_log_file='master-bin.000002',
master_log_pos=1081; -
start slave; start slave io_thread; start slave sql_thread; -
show slave status\G;查看主从状态(Slave_IO_Running、Slave_SQL_Running 均为 Yes)
5. Amoeba 读写分离账号示例
grant all on *.* to 'amoebauser'@'192.168.23.145' identified by '123123';
四、MySQL 扩展方向
- 高可用方案:MHA、Atlas
- 部署方式:源码编译、二进制包、Docker 容器化
- 优化方向:索引优化、存储引擎选型、事务调优、慢查询日志、错误日志
注意:DDL 定义类语句生产环境谨慎执行,容易锁表
五、企业级 LNMP 环境应用实践
LNMP = Linux + Nginx + MySQL + PHP(PHP-FPM)
1. 请求流程
用户请求 → Nginx 静态资源(html/css/js/ 图片)→ Nginx 直接返回 动态.php 请求 → FastCGI 转发给 PHP-FPM 解析 PHP-FPM 连接 MySQL 读写数据,结果原路返回客户端
2. 部署方式
- YUM/APT 包部署:中小企业标准化,上线快
- 源码编译:自定义模块、定制化部署
- Docker 容器化:云平台、CI/CD,环境一致性
3. Nginx 核心配置要点
-
Server 虚拟主机:多站点部署
-
动静分离、gzip 压缩、expires 静态缓存
-
upstream 负载均衡(多 PHP 节点)
-
HTTPS、防盗链、防跨域
-
php 转发核心配置
location ~ .php { fastcgi_pass 127.0.0.1:9000; fastcgi_index index.php; fastcgi_param SCRIPT_FILENAME document_root$fastcgi_script_name;
include fastcgi_params;
}
4. PHP-FPM 调优
进程管理模式:static/dynamic/ondemand 参数:pm.max_children、request_terminate_timeout 必备优化:OPcache 字节码缓存
5. 企业上线优化
- 系统层:防火墙、SELinux、内核参数(文件句柄、TCP)
- Nginx:日志轮转、连接复用、访问日志分割
- MySQL:binlog、定时备份、主从、索引优化
- 安全加固:目录最小权限、禁止上传目录执行 PHP、防注入
6. 常见报错排查
- 502 Bad Gateway:php-fpm 未启动、端口占用、进程耗尽
- 504 Gateway Timeout:PHP 超时、SQL 慢查询
- 403:目录权限、SELinux、root 配置错误
7. LNMP 架构扩展
单机 LNMP → 组件分离部署 → Nginx 负载均衡多 PHP → Redis 缓存热点数据 → MySQL 主从读写分离 → MHA 高可用 → CDN 静态加速 → 分库分表
8. 自动化运维
Shell 一键部署、Ansible 批量运维、Docker Compose/K8s 编排、Prometheus+Grafana 监控告警