深色模式
数据库巡检脚本
摘要:把每天重复敲的检查命令固化成脚本,定时跑、留存档、异常告警。本文给出一个可直接使用的 Bash 巡检脚本,覆盖健康项与风险项,并接入 cron 与日志轮转。
适用环境
bash
mysql --version
# 建议把凭据写入受保护的配置文件,避免在命令行暴露密码
sudo tee /root/.my.cnf >/dev/null <<'EOF'
[client]
user=root
password='你的密码'
EOF
sudo chmod 600 /root/.my.cnf1
2
3
4
5
6
7
8
2
3
4
5
6
7
8
操作步骤
1. 编写巡检脚本
bash
#!/usr/bin/env bash
# /usr/local/bin/db_inspect.sh MySQL 日常巡检
set -u
LOG=/var/log/db_inspect/$(date +%F).log
mkdir -p "$(dirname "$LOG")"
say(){ echo "[$(date '+%F %T')] $*" | tee -a "$LOG"; }
say "===== 1. 存活与版本 ====="
mysqladmin ping 2>&1 | tee -a "$LOG"
mysql -N -e "SELECT VERSION();" | tee -a "$LOG"
say "===== 2. 连接数水位 ====="
mysql -N -e "SELECT CONCAT('used=', @@max_connections - (SELECT VARIABLE_VALUE FROM performance_schema.global_status WHERE VARIABLE_NAME='Threads_connected'), ' max=', @@max_connections);" | tee -a "$LOG"
say "===== 3. 慢查询与 QPS 采样 ====="
a=$(mysql -N -e "SHOW GLOBAL STATUS LIKE 'Questions'" | awk '{print $2}')
sleep 1
b=$(mysql -N -e "SHOW GLOBAL STATUS LIKE 'Questions'" | awk '{print $2}')
say "QPS=$((b-a)) Slow_queries=$(mysql -N -e "SHOW GLOBAL STATUS LIKE 'Slow_queries'" | awk '{print $2}')"
say "===== 4. 复制状态 ====="
mysql -e "SHOW REPLICA STATUS\G" 2>/dev/null | grep -E 'Slave_IO_Running|Slave_SQL_Running|Seconds_Behind|Last_Error' | tee -a "$LOG" || say "非从库或查询失败"
say "===== 5. 磁盘与备份 ====="
df -h /data | tee -a "$LOG"
ls -lt /data/backup/logical 2>/dev/null | head -n 3 | tee -a "$LOG"
say "===== 6. 大表 Top5 ====="
mysql -N -e "SELECT table_schema, table_name, ROUND((data_length+index_length)/1024/1024,0) mb
FROM information_schema.tables ORDER BY (data_length+index_length) DESC LIMIT 5;" | tee -a "$LOG"
say "===== 7. 异常错误日志 ====="
grep -iE '\[ERROR\]' /data/mysql/log/mysqld.err 2>/dev/null | tail -n 10 | tee -a "$LOG"
say "巡检结束"1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
2. 赋予执行权限并手动试跑
bash
sudo chmod +x /usr/local/bin/db_inspect.sh
sudo /usr/local/bin/db_inspect.sh
tail -n 40 /var/log/db_inspect/$(date +%F).log1
2
3
2
3
危险
巡检脚本只做只读操作(SELECT/SHOW/mysqladmin ping),严禁在脚本里加入任何 DELETE、DROP、TRUNCATE 或自动清理逻辑;自动修复类动作必须人工确认。
3. 接入定时任务
bash
sudo crontab -e
# 每天 09:00 巡检
0 9 * * * /usr/local/bin/db_inspect.sh >/dev/null 2>&11
2
3
2
3
4. 关键项异常时告警
bash
# 在脚本中加入阈值判断,超出则输出告警标记,交由监控系统采集
lag=$(mysql -N -e "SHOW REPLICA STATUS\G" 2>/dev/null | awk -F': ' '/Seconds_Behind_Master/{print $2}')
if [[ -n "$lag" && "$lag" -gt 300 ]]; then
echo "ALERT replication_lag=$lag" >> "$LOG"
fi1
2
3
4
5
2
3
4
5
5. 巡检日志轮转与留存
bash
sudo tee /etc/logrotate.d/db_inspect >/dev/null <<'EOF'
/var/log/db_inspect/*.log {
daily
rotate 30
compress
missingok
notifempty
}
EOF1
2
3
4
5
6
7
8
9
2
3
4
5
6
7
8
9
验证
bash
# 脚本可重复执行且不报错
bash -n /usr/local/bin/db_inspect.sh # 语法检查
sudo /usr/local/bin/db_inspect.sh && echo "运行完成"
# 故意制造异常(如在从库 STOP REPLICA)再跑一次,确认能记录到异常
crontab -l | grep db_inspect1
2
3
4
5
6
2
3
4
5
6
常见坑
WARNING
脚本里用明文密码会被 ps 和历史记录看到;使用 ~/.my.cnf(600 权限)或 mysql_config_editor。
WARNING
cron 环境下 PATH 与交互环境不同,mysql 可能找不到;脚本里用绝对路径或显式设置 PATH。
DANGER
巡检脚本若在业务高峰执行带扫描性质的查询(如全表 information_schema 统计)可能加重负载;安排在闲时并控制频率。