如何为 MySQL 状态/复制创建一个 bash 脚本,每小时仅通知一次故障?

如何为 MySQL 状态/复制创建一个 bash 脚本,每小时仅通知一次故障?

我正在使用 CentOS 6.2。

我按照 Alex Williams 的指南通过 HAProxy 配置 MySQL这里

我没有让 HAProxy 检查 MySQL 和复制的状态,而是让脚本在 crontab 中每分钟运行一次。如果其中任何一个失败,我会让它们将失败信息回显到文本文件 /opt/repl.txt 或 /opt/mysql.txt。

我有一个脚本,用于检查这些文件是否存在,如果存在,则发送电子邮件通知相关人员发生故障。该脚本也在 crontab 中配置为每分钟运行一次。

基本上,我想实现的是:我希望脚本只在最初发生故障时发送电子邮件,之后每小时发送电子邮件一次,直到问题解决。我不太确定如何使用 bash 脚本来实现这一点。上次发生故障时,它每分钟发送一封电子邮件,这绝对不是我希望发生的事情。任何帮助都将不胜感激。

答案1

修改您的脚本,使其在发送电子邮件时触碰文件,并且如果文件已存在的时间少于 1 小时,则不发送电子邮件。

答案2

我用pt-表校验和来自 Percona.com 来执行此操作。

  1. 在主服务器上执行 pt-table-checksum
  2. 使用文档中提供的脚本检查副本上的表pt-表校验和。此查询仅在出现错误时才返回输出,并且我将此输出定向到文件。
  3. 如果有输出,则发送电子邮件。否则,保持安静。

以下是缩写代码:

mysql-checksum () {
OUTFILE=/tmp/outfile
mysql --execute "SELECT db, tbl, chunk, this_cnt-master_cnt AS cnt_diff, \
        this_crc <> master_crc OR ISNULL(master_crc) <> ISNULL(this_crc) AS crc_diff \
        FROM test.checksum \
        WHERE master_cnt <> this_cnt OR master_crc <> this_crc OR ISNULL(master_crc) <> ISNULL(this_crc);" > $OUTFILE
# Print a status message.
# Any output from above command is bad.
if [ -s $OUTFILE ]; then
        # List out the bad tables.
        BADTABLES=`tail +2 $OUTFILE | cut -f1,2 | tr '\t' '.' | tr '\n' ','`

        echo "ERROR: Bad checksum on these tables [$BADTABLES]. For details see $HOST:$OUTFILE." | mail -s "mysql checksum error" [email protected]
        return 1
fi
}

相关内容