MySQL 表损坏自动检测 + 邮件报警脚本方案
下面是一套MySQL 表损坏自动检测 + 邮件报警脚本方案,适用于 Linux 环境中定期运行 CHECK TABLE 检查数据库中是否有损坏表,一旦发现立即邮件通知。适配 MyISAM + InnoDB 表,支持 Cron 定时调度 和 日志记录。
一、脚本功能简介
- 扫描数据库中的所有表
- 执行
CHECK TABLE检查结构完整性 - 发现损坏表自动记录日志并发送邮件
- 支持按天归档检测日志
- 支持自定义多个数据库 / 排除系统库
二、Shell 脚本示例:mysql_table_check.sh
#!/bin/bash
# === 配置项 ===
MYSQL_USER="root"
MYSQL_PWD="your_password"
MYSQL_HOST="127.0.0.1"
MYSQL_PORT=3306
EMAIL_TO="admin@example.com"
EMAIL_SUBJECT="🔴 MySQL表损坏预警"
TMP_LOG="/tmp/mysql_table_check_$(date +%F).log"
ERROR_LOG="/tmp/mysql_table_error_$(date +%F).log"
# 排除数据库
EXCLUDE_DB="'mysql','performance_schema','information_schema','sys'"
# === 执行表检测 ===
echo "[INFO] 开始 MySQL 表结构检查 $(date)" > "$TMP_LOG"
# 获取用户数据库列表
DBS=$(mysql -u"$MYSQL_USER" -p"$MYSQL_PWD" -h"$MYSQL_HOST" -P"$MYSQL_PORT" -Nse "SELECT schema_name FROM information_schema.schemata WHERE schema_name NOT IN ($EXCLUDE_DB);")
for DB in $DBS; do
echo "[INFO] 检查数据库:$DB" >> "$TMP_LOG"
TABLES=$(mysql -u"$MYSQL_USER" -p"$MYSQL_PWD" -h"$MYSQL_HOST" -P"$MYSQL_PORT" -Nse "SHOW TABLES FROM $DB;")
for TB in $TABLES; do
CHECK_RESULT=$(mysql -u"$MYSQL_USER" -p"$MYSQL_PWD" -h"$MYSQL_HOST" -P"$MYSQL_PORT" -e "CHECK TABLE \`$DB\`.\`$TB\`;" 2>&1 | grep -i -E "error|crash|corrupt")
if [[ -n "$CHECK_RESULT" ]]; then
echo "[ERROR] $DB.$TB 检测异常:" >> "$ERROR_LOG"
echo "$CHECK_RESULT" >> "$ERROR_LOG"
fi
done
done
# === 邮件通知 ===
if [ -f "$ERROR_LOG" ]; then
cat "$ERROR_LOG" | mail -s "$EMAIL_SUBJECT" "$EMAIL_TO"
echo "[ALERT] 表损坏问题已发送邮件通知" >> "$TMP_LOG"
else
echo "[OK] 所有表结构正常。" >> "$TMP_LOG"
fi
# 可选:清理旧日志(保存7天)
find /tmp/ -name "mysql_table_*.log" -mtime +7 -delete
三、配置 Cron 定时任务
编辑定时任务:
crontab -e
添加每日凌晨 3 点检查任务:
0 3 * * * /bin/bash /path/to/mysql_table_check.sh > /dev/null 2>&1
✔ 可改为每小时/每周一次,根据业务重要性设置。
四、启用邮件发送
确保服务器安装了邮件工具(任选一种):
1. mailx(推荐)
sudo apt install mailutils # Ubuntu
sudo yum install mailx # CentOS
配置 /etc/mail.rc 或使用 Gmail SMTP:
set smtp=smtp://smtp.gmail.com:587
set smtp-auth-user=your@gmail.com
set smtp-auth-password=your_password
set smtp-auth=login
五、输出示例(收到的邮件内容)
[ERROR] production.orders 检测异常:
| production.orders | check | error | Table is marked as crashed and should be repaired |
[ERROR] logs.audit_log 检测异常:
| logs.audit_log | check | warning | Table upgrade required. Please do "REPAIR TABLE `audit_log`" |
六、延伸推荐
| 工具 | 说明 |
|---|---|
| Zabbix MySQL Table Health Check | 可通过自定义 Item + Trigger 实现告警 |
Percona Toolkit pt-table-checksum | 用于主从一致性校验 |
| Prometheus + mysqld_exporter | 可加表状态监控指标 |
| 自建状态页 | 使用 Grafana 或 Uptime Kuma 展示 MySQL 健康状况 |
七、安全加固建议
- 不在脚本中明文写密码 ➤ 使用
~/.my.cnf+chmod 600 - 日志文件每日清理,防止空间撑爆
- 检查结果存入日志系统(如 ELK、Graylog)
- 邮件内容附带 SQL 修复建议(可定制)
更多详细内容请关注其他相关文章!