Skip to main content
今日里程碑:你将不再写那种”一次性脚本”,而是通过函数封装、错误处理编写可用于生产环境的 自动化运维工具;同时,你将掌握数据库性能优化的”黄金法则”。今天不只是写代码,而是要彻底理解 “如何编写健壮的运维脚本”“如何分析慢查询” 以及 “如何优化数据库性能”

知识图谱 | Knowledge Map

Shell 运维自动化

  • 系统监控:磁盘/内存水位监测
  • 逻辑封装:增强健壮性的 Error Handling
  • 远程执行:SSH 批量下发指令
  • 备份自动化:定时备份脚本

SQL 性能调优

  • EXPLAIN 进阶:读懂 type/rows/key_len
  • 优化口诀:小表驱动大表、索引失效规避
  • 实战案例:千万级大表的分页优化
  • 慢查询分析:定位性能瓶颈

代码任务 (90 mins)

1

Shell 生产级脚本实战

我们将编写一个 自动备份与磁盘监控脚本。拒绝硬编码,采用函数式编程。任务分解
  1. 定义配置变量
  2. 编写颜色输出函数
  3. 编写磁盘检查函数
  4. 编写备份函数
  5. 编写清理旧备份函数
  6. 添加错误处理
常见错误
  • usage=$(df / | awk '{print $5}') - 没有过滤,可能获取错误行
  • if [ $usage -gt 80 ] - 变量未加引号,空值会报错
  • tar -zcf backup.tar.gz /var/www/html - 没有错误处理
  • usage=$(df / | grep / | awk '{print $5}' | sed 's/%//g') - 正确
  • if [ "$usage" -gt "$DISK_WARNING_THRESHOLD" ] - 正确
  • if [ $? -eq 0 ]; then ... fi - 正确
验证步骤
  1. 修改配置(根据实际情况):
  2. 创建测试目录:
  3. 运行脚本:
  4. 检查输出:
    • 应该看到磁盘使用率检查结果
    • 应该看到备份成功信息
    • 应该看到备份文件大小
    • 应该看到旧备份清理信息
  5. 验证备份文件:
2

SQL 慢查询优化

我们将学习如何分析和优化慢查询,这是数据库性能优化的核心技能。任务分解
  1. 启用慢查询日志
  2. 分析慢查询场景
  3. 优化查询语句
  4. 对比优化前后的性能
字段类型选择详解
1. 避免全表扫描
  • 为 WHERE 条件中的字段添加索引
  • 避免使用 !=NOT INIS NULL(某些情况)
  • 避免对字段使用函数
2. 利用索引
  • 使用 =INBETWEENLIKE 'prefix%'
  • 遵循最左前缀原则
  • 使用覆盖索引减少回表
3. 优化 JOIN
  • 小表驱动大表
  • 为 JOIN 条件添加索引
  • 避免子查询,使用 JOIN
4. 优化排序
  • 为 ORDER BY 字段添加索引
  • 避免 ORDER BYWHERE 使用不同索引
问题LIMIT 1000000, 10 需要扫描并丢弃前 100 万行,非常慢。优化方案
或者使用 JOIN
性能提升
  • 优化前:扫描 100 万+ 行,耗时数秒
  • 优化后:扫描索引 + 查询 10 行,耗时毫秒级
原则:小表作为驱动表,大表作为被驱动表。原因
  • 驱动表会被全表扫描
  • 被驱动表通过索引查找
  • 小表扫描快,大表通过索引查找也快
示例
验证步骤
  1. 连接 MySQL:
  2. 执行 SQL 脚本:
  3. 分析查询:
  4. 测试深分页优化:
常见错误
  • WHERE status != 1 - 导致全表扫描
  • WHERE username LIKE '%keyword' - 索引失效
  • WHERE YEAR(created_at) = 2024 - 索引失效
  • LIMIT 1000000, 10 - 深分页,非常慢
  • WHERE status IN (0, 2) - 可以使用索引
  • WHERE username LIKE 'keyword%' - 可以使用索引
  • WHERE created_at >= '2024-01-01' - 可以使用索引
  • ✅ 使用子查询优化深分页 - 正确

每日挑战 (Challenge)

Shell 挑战

任务:给备份脚本加上 find $BACKUP_DEST -mtime +7 -delete 命令,实现自动删除 7 天前旧备份的功能。提示
  • 使用 find 命令查找旧文件
  • -mtime +7:修改时间超过 7 天
  • -delete:删除找到的文件
  • 思考:如何添加日志记录删除的文件?

SQL 挑战

任务:使用 SHOW PROFILES 查看你刚才执行的 SQL 到底耗时多少秒。提示
  • 启用 profiling:SET profiling = 1;
  • 执行查询后:SHOW PROFILES;
  • 查看详细分析:SHOW PROFILE FOR QUERY 1;
  • 思考:如何对比优化前后的性能差异?

今日产出物

  • day05/backup_script.sh - Shell 生产级备份脚本
  • day05/04_slow_query_opt.sql - SQL 慢查询优化脚本

参考代码

查看参考代码

在 GitHub 查看完整的示例代码

在线运行

使用在线编辑器测试代码

实际应用场景

Shell 生产级脚本在运维中的应用

  • 自动化备份:定时执行备份脚本,确保数据安全
  • 系统监控:监控磁盘、内存、CPU 使用率,及时告警
  • 日志管理:自动清理旧日志,防止磁盘满
  • 部署自动化:编写健壮的部署脚本,减少人工错误
  • 故障恢复:编写自动恢复脚本,快速恢复服务

SQL 慢查询优化在生产环境的重要性

  • 性能监控:定期分析慢查询日志,定位性能瓶颈
  • 索引优化:根据查询模式设计合适的索引
  • 查询优化:优化慢查询语句,提高响应速度
  • 容量规划:通过性能分析预测数据库容量需求
  • 用户体验:优化查询性能,提升用户体验
与 Day 04 和 Day 06 的关联
  • Day 04 学习了索引的基础知识,今天学习了如何优化慢查询
  • Day 06 将进行综合实战,今天学习的脚本编写和查询优化是基础
  • 掌握今天的生产级脚本和慢查询优化,明天的综合实战会更轻松

上一天: 三剑客优化

Day 04 | Shell 三剑客与 SQL 优化

下一天: 整合实战

Day 06 | 第一阶段综合实战