mysql

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. 三种记录格式

  1. SBR(Statement):记录 SQL 语句,日志量小,部分函数存在主从数据不一致风险
  2. RBR(Row):记录行变更数据,数据安全,日志体积大(企业主流)
  3. 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

恢复流程:

  1. 截取 binlog 导出 sql
  2. set sql_log_bin=0;(避免恢复语句写入 binlog)
  3. source recover.sql;
  4. 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. 数据丢失原因 & 解决方案

  1. 程序 Bug:严格测试、代码评审
  2. 人为误操作(运维高发):权限最小化、操作规范、变更审批
  3. 硬件故障:硬件冗余(RAID、多服务器)
  4. 不可抗力(火灾 / 地震):两地三中心异地容灾

2. 备份分类

  1. 是否停机
    • 冷备:数据库停机备份
    • 热备:不停机备份(InnoDB 支持)
  2. 备份数据量
    • 全备:整库完整备份
    • 增备:备份上次备份后新增数据(依赖上一次备份)
    • 差异备份:备份上次全备之后变化的数据
  3. 备份层次
    • 物理备份:直接拷贝数据文件(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. 读写分离实现

  1. 代码层实现(开发)
  2. 中间件实现(运维):Amoeba、Atlas

3. 主从复制原理(2 日志 + 2 线程)

  • 主库:开启 binlog,记录所有变更 SQL
  • 从库:开启 relay_log 中继日志
  1. IO 线程:从库连接主库,拉取主库 binlog,写入本地中继日志
  2. SQL 线程:读取本地中继日志,回放执行 SQL,保证主从数据一致

关键点:集群所有节点 server_id 不能相同

4. 主从搭建完整步骤

  1. 规划多台 MySQL 节点,修改配置,保证 server_id 唯一

  2. 主库开启 log_bin,从库开启 relay_log

  3. 主库创建复制专用账号

    grant replication slave on . to 'myslave'@'192.168.23.%' identified by '123123';

  4. 主库执行全量备份(带上 master-data 记录 binlog 位置)

  5. 将备份文件导入从库,初始化基础数据

  6. 从库配置主库信息

    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;

  7. start slave; start slave io_thread; start slave sql_thread;

  8. 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. 部署方式

  1. YUM/APT 包部署:中小企业标准化,上线快
  2. 源码编译:自定义模块、定制化部署
  3. 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. 企业上线优化

  1. 系统层:防火墙、SELinux、内核参数(文件句柄、TCP)
  2. Nginx:日志轮转、连接复用、访问日志分割
  3. MySQL:binlog、定时备份、主从、索引优化
  4. 安全加固:目录最小权限、禁止上传目录执行 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 监控告警

相关推荐
三8442 小时前
PHP 绕过污点追踪构造 Webshell:反序列化引用复用与 Trait 可变函数 RCE
android
石头猫灯2 小时前
WordPress wp2shell漏洞断点逐过程到注入点
android·学习
Android打工仔4 小时前
Kotlin 协程源码解析(五):BaseContinuationImpl.resumeWith() —— Continuation 链是如何被展开的?
android·kotlin
存在morning4 小时前
【PySpark 学习笔记 三】DataFrame API 入门
android·java·数据库
YSoup4 小时前
2026 安卓面试助手APP(安卓八股、题库)
android·面试·职场和发展
xcyxiner4 小时前
flutter 运行到模拟器上
android·前端·flutter
Android-Flutter5 小时前
android Glide 源码流程分析
android·kotlin
Android-Flutter5 小时前
android Glide 使用详解
android·kotlin
恋猫de小郭5 小时前
Dart 3.13 的到底改了什么?为什么很重要?有什么坑?
android·前端·flutter
HZZD_HZZD6 小时前
3T-UEM 数据建模实战:三维立方体 + LAM/ELA 双归因怎么落地?
android