如何根据 mysqlcheck 输出生成报告

如何根据 mysqlcheck 输出生成报告

我需要根据 MySQL 数据库检查和自动修复的输出生成报告。
但不想每次都得到完整的报告:仅在需要修复的情况下

计划任务(cron)运行mysqlcheck,
我希望通过电子邮件获得最终需要修复、修复成功、修复失败的信息……
但每次都不想收到完整的报告:仅修复

我像这样运行 mysqlcheck:

mysqlcheck --user=myuser --password=mypwd -c --auto-repair dbname > ouput.log

在博客上发现,修复时 mysqlcheck 输出可能如下所示

Repairing tables
dbname.table1
warning  : Number of rows changed from 3 to 1
status   : OK
dbname.table2
warning  : Number of rows changed from 5454 to 5455
status   : OK
dbname.table3
warning  : Number of rows changed from 471859 to 471860
status   : OK

由于我找不到任何关于确切输出的官方文档,我需要帮助来构建一个通过处理 mysqlcheck 的输出生成的报告文本文件。
也许一些正则表达式魔术师可以制作一份报告,提供已修复表的名称、故障通知等。

这是指 Ubuntu 官方存储库中提供的 mysql 服务器
mysql-server 5.7.25-0ubuntu0.18.04.2

答案1

这个简单的脚本正在mysql检查结果并检查输出“修理桌子”。因为只有当表损坏时才会出现此字符串。

如果存在,那么它会向所需的地址发送电子邮件。

#!/bin/bash

result=`mysqlcheck --user=myuser --password=mypass --auto-repair dbname;`

if [[ $result == *"Repairing tables"* ]]; then

  echo $result | mailx -s 'email subject'  [email protected]

fi

答案2

--silent模式

运行时mysqlcheck传递参数-s--silent仅打印错误消息

像这样修改您的命令:

mysqlcheck --user=myuser --password=mypwd -c --auto-repair --silent dbname 

无需将输出重定向到工作文件并对其进行解析。您需要cron设置才能发送电子邮件。摘自此问答:如何设置 Cron 发送电子邮件?

MAILTO="[email protected]"
* * * * * mysqlcheck --user=myuser --password=mypwd -c --auto-repair --silent dbname

答案3

我认为最好的办法是这样设置:

  • crontab -e计划中执行 bashscript,例如:
 - * * * * /bin/bash /root/custom-mysqlrepair.sh
  • 使用类似下面的方法创建这样的脚本:
#!/bin/bash
#hint: adding user and password to .my.cnf should remove the need for user and password in this command
OUTPUT=$((mysqlcheck --user=myuser --password=mypwd -c --auto-repair dbname) 2>&1)
OUTPUT_NO_NEWLINES=`$OUTPUT | tr '\n'`
if [[ $string == *"Number of rows changed from"* ]]; then
  echo $OUTPUT
fi
  • 使脚本可执行并将其放在 /root/

现在会发生什么:

  • cron运行脚本
  • 脚本尝试运行你的命令并将输出保存到变量
  • 如果变量包含你想要的单词,则打印整个输出
  • crontab 应该捕获输出到 MAILTO 输出中并正常发送电子邮件

请注意,这仍然是未经检验的理论,但应该可以让你开始。

相关内容