MySQL 表损坏自动检测 + 邮件报警脚本方案
                           
天天向上
发布: 2025-07-06 14:08:37

原创
284 人浏览过

下面是一套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 修复建议(可定制)

更多详细内容请关注其他相关文章!

发表回复 0

Your email address will not be published. Required fields are marked *