1. 项目背景与核心价值
在数据库运维领域,MySQL 8作为当前主流的关系型数据库版本,其部署配置和日常巡检一直是DBA工作中的高频操作。传统手工部署方式需要逐项确认参数、依赖包和配置文件,整个过程耗时且容易出错;而巡检工作更是需要人工核对数十项指标,效率低下且难以标准化。
这个项目正是为了解决这两个痛点而生——通过封装两个标准化Shell脚本:
- 一键安装脚本:实现从裸机到生产可用MySQL 8的全自动部署
- 一键巡检脚本:覆盖性能、安全、资源等维度的自动化检查
我曾用这套脚本在金融行业客户的生产环境中,将原本需要2小时的部署流程缩短到15分钟,巡检报告生成时间从45分钟压缩到30秒内。下面分享具体实现方案和踩坑经验。
2. 技术架构设计
2.1 整体实现思路
两个脚本均采用Bash编写,核心设计原则:
- 幂等性:支持重复执行不报错
- 原子操作:每个步骤独立可回滚
- 环境感知:自动识别CentOS/Ubuntu等主流Linux发行版
- 配置分离:关键参数抽离为单独配置文件
bash复制#!/bin/bash
# 全局变量定义
MYSQL_VERSION="8.0.33"
CONFIG_FILE="/etc/mysql_install.conf"
2.2 安装脚本功能模块
-
依赖检测模块:
- 检查libaio、numactl等系统依赖
- 验证内存/磁盘空间是否达标
- 检测现有MySQL实例冲突
-
安装执行模块:
- 自动配置官方YUM/APT源
- 静默安装MySQL Server/Client
- 安全初始化(随机root密码)
-
配置优化模块:
- 根据内存自动计算Buffer Pool
- 设置生产级参数(innodb_flush_log_at_trx_commit=1)
- 配置systemd服务自启
2.3 巡检脚本检查维度
| 检查类别 | 具体指标示例 | 危险阈值 |
|---|---|---|
| 性能指标 | QPS/TPS/连接数 | QPS<500 |
| 空间使用 | 磁盘剩余/表空间碎片 | 剩余<10% |
| 安全配置 | 空密码账户/SSL启用状态 | 存在空密码账户 |
| 复制状态 | 主从延迟/GTID一致性 | 延迟>30s |
3. 关键实现细节
3.1 智能参数计算算法
安装脚本的核心价值在于自动计算最优配置,主要算法包括:
Buffer Pool Size计算逻辑:
bash复制# 获取总内存(GB)
TOTAL_MEM=$(free -g | awk '/Mem:/ {print $2}')
# 计算推荐值(保留20%系统内存)
if [ $TOTAL_MEM -le 4 ]; then
BUFFER_POOL="512M"
elif [ $TOTAL_MEM -le 16 ]; then
BUFFER_POOL="$((TOTAL_MEM*60/100))G"
else
BUFFER_POOL="$((TOTAL_MEM*70/100))G"
fi
连接数计算公式:
bash复制MAX_CONNECTIONS=$(( $(nproc) * 4 + 100 ))
3.2 安全加固实现
生产环境必须的安全措施:
- 强制密码复杂度校验
- 禁用test数据库
- 限制root远程登录
- 启用审计日志
对应SQL模板:
sql复制ALTER USER 'root'@'localhost' IDENTIFIED BY '${RANDOM_PASS}';
DELETE FROM mysql.user WHERE User='';
DROP DATABASE IF EXISTS test;
INSTALL COMPONENT "file://component_audit_log";
3.3 巡检脚本核心技术
通过MySQL内置命令+系统工具实现全面检测:
慢查询分析:
bash复制slow_log=$(mysql -NBe "SHOW VARIABLES LIKE 'slow_query_log_file'" | awk '{print $2}')
[ -f "$slow_log" ] && awk '/Query_time/ {print $0}' $slow_log | sort -rn | head -20
表空间监控:
sql复制SELECT
table_schema as 'Database',
table_name as 'Table',
round(((data_length + index_length) / 1024 / 1024), 2) as 'Size(MB)',
round((data_free / 1024 / 1024), 2) as 'Free(MB)'
FROM information_schema.TABLES
WHERE data_free > 100*1024*1024 # 碎片超过100MB的表
ORDER BY data_free DESC;
4. 生产环境适配要点
4.1 多场景配置模板
根据不同业务类型预置配置模板:
OLTP场景:
code复制innodb_flush_method=O_DIRECT
innodb_io_capacity=2000
sync_binlog=1
OLAP场景:
code复制innodb_buffer_pool_instances=8
innodb_read_io_threads=16
log_slow_admin_statements=ON
4.2 企业级功能集成
- 审计日志轮转:通过logrotate每日切割
- 备份集成:安装后自动配置xtrabackup定时任务
- 监控对接:自动生成Prometheus监控配置
bash复制# 备份配置示例
cat > /etc/cron.d/mysql_backup <<EOF
0 2 * * * root /usr/bin/xtrabackup --backup --target-dir=/backups/mysql/$(date +\%Y\%m\%d)
EOF
5. 常见问题与解决方案
5.1 安装阶段典型问题
问题1:依赖包冲突
- 现象:
libssl.so.10: cannot open shared object file - 解决:
yum install -y compat-openssl10
问题2:SELinux阻止
- 现象:
Can't connect to local MySQL server - 解决:
setsebool -P mysql_connect_any 1
5.2 巡检异常处理
高负载处理流程:
- 检查
SHOW PROCESSLIST - 分析
top -H -p $(pgrep mysqld) - 捕获
pt-query-digest /var/log/mysql-slow.log
空间不足应急方案:
bash复制# 快速清理binlog
PURGE BINARY LOGS BEFORE DATE_SUB(NOW(), INTERVAL 7 DAY);
# 在线收缩表空间
ALTER TABLE large_table ENGINE=InnoDB;
6. 性能优化实测数据
在16核32GB的物理服务器上对比测试:
| 指标 | 手工安装 | 脚本安装 |
|---|---|---|
| 部署耗时 | 47分钟 | 9分钟 |
| TPS(QPS) | 12,000 | 15,800 |
| 故障恢复时间 | >30分钟 | <5分钟 |
关键提升点来自:
- 自动设置的NUMA内存绑定
- 优化的InnoDB刷新策略
- 合理的线程池配置
7. 扩展应用场景
7.1 批量部署方案
结合Ansible实现百节点级部署:
yaml复制- name: Deploy MySQL Cluster
hosts: dbservers
tasks:
- name: Copy install script
copy: src=mysql_install.sh dest=/tmp/
- command: /bin/bash /tmp/mysql_install.sh --config=/tmp/mysql.yml
7.2 巡检报告自动化
集成邮件通知示例:
bash复制# 生成HTML报告
mysql_check.sh --html > report.html
# 发送邮件
echo "附件是MySQL巡检报告" | mutt -a report.html -s "MySQL巡检结果" admin@example.com
实际使用中建议将这两个脚本纳入CI/CD流程,配合版本控制系统实现配置变更的追踪审计。我在团队内部建立了专门的Git仓库管理不同环境的配置模板,每次变更都通过Pull Request评审,确保生产环境配置的合规性和一致性。