首页 > 数据库 >MySQL日志维护与监控脚本

MySQL日志维护与监控脚本

时间:2023-06-07 09:00:23浏览次数:42  
标签:LOG mysql ERRORLOG FILE MySQL 监控 PATH 日志

MySQL数据库的管理维护过程中,MySQL错误日志(MySQL Error Log)与MySQL慢查询日志(MySQL Slow Log),一般不会自动清理,也不会轮转/切换,这个跟MySQL的二进制日志(binlog)有所不同,所以如果数据库管理员对其不维护的话,这些日志随着时间的推移以及一些特殊原因,一方面日志文件可能会变得非常大(磁盘空间消耗),另外一方面影响一些操作的性能。例如,MySQL慢查询日志如果一直写入一个文件,这个文件会变得非常大, 当你去分析/解析MySQL慢查询日志的时候会影响性能。

这里分享一个之前写的shell脚本,用来轮转/切换MySQL错误日志和MySQL慢查询日志,以及监控MySQL错误日志,具体功能如下:

  1. 错误日志的轮换/切换
  2. 慢查询日志的轮换/切换
  3. 删除N天前的错误日志
  4. 删除N天前的慢查询日志
  5. 错误日志的监控告警
#!/bin/bash
source /etc/profile

#########################################################################################
#                                                                                       #
# This script is used for rotation mysql error log & slow log and monitor the error log #
#   1:错误日志的轮换/切换                                                              #
#   2:如果开启了慢查询日志,慢查询日志的轮换/切换                                      #
#   3:删除N天前的错误日志                                                              #
#   4:删除N天前的慢查询日志                                                            #
#   5: 错误日志的监控告警                                                               #
#                                                                                       #
# #######################################################################################
#                                                                                       #
# ScriptName            :    mysql_log_manage_monitor.sh                                #
# Author                :    潇湘隐者                                                   #
# CerateDate            :    2020-09-03                                                 #
# Blogs                 :    www.cnblogs.com/kerrycode                                  #
# Email                 :    [email protected]                                       #
#***************************************************************************************#
# 参数配置                                                                              #
#---------------------------------------------------------------------------------------#
# 注意,如果维护的MySQL数据库都规范化安装、配置的化,下面很多参数都不需要修改           #
#---------------------------------------------------------------------------------------#
# MYSQL_ERRORLOG_PATH   MySQL错误日志的路径                                             #
# MYSQL_ERRORLOG_FILE   MySQL错误日志文件名                                             #
# ALERT_LOG_PATH        告警日志路径                                                    #
# KEEYP_DAYS            MySQL错误日志/慢查询日志保留天数                                #
# ERROR_FILE_TYPE       错误日志文件格式                                                #
# SLOW_FILE_TYPE        慢查询日志文件格式                                              #
# MAIL_FROM             发件人                                                          #
# MAIL_TO               收件人                                                          #
#***************************************************************************************#
# Version        Modified Date            Description                                   #
#***************************************************************************************#
# V.1.0          2020-09-03              创建此脚本                                     #
# V.1.1          2020-09-23              增加轮转慢查询日志的功能                       #
# V.2.0          2023-06-01              重构此脚本,相关功能模块化                     #
#########################################################################################

SERVER_IP=""  
#LOG_ROTATION_DATE=$(date +%Y_%m_%d)
#轮转日期改为前一天
LOG_ROTATION_DATE=$(date -d yesterday +%Y_%m_%d)
MAIL_FROM="[email protected]"
MAIL_TO="[email protected]"
#default value is /data/mysql/logs
MYSQL_ERRORLOG_PATH=/data/mysql/logs
#default value is mysql_error.log
MYSQL_ERRORLOG_FILE=mysql_error.log
#default value is /data/mysql/slow_logs
SLOW_LOG_PATH=/data/mysql/slow_logs
#default value is mysql_slow.log
SLOW_LOG_FILE=mysql_slow.log
#default value is /mysql_backup/logs
LOG_FILE_PATH=/mysql_backup/logs
#default value is /mysql_backup/logs/mysql_log_manage_monitor.log
LOG_FILE=${LOG_FILE_PATH}/mysql_log_manage_monitor.log
#default value is /mysql_backup/logs/alert_log
ALERT_LOG_PATH=/mysql_backup/logs/alert_log
NEW_SLOW_LOG_FILE=''
HOUR=`date '+%H'`
KEEYP_DAYS=30
ERROR_FILE_TYPE="mysql_error*.log"
SLOW_FILE_TYPE="mysql_slow*.log"
MAIL_SUBJECT=""

#LOG_DATE用`date`替换,以便更精准的记录时间
##LOG_DATE=$(date +%Y_%m_%d_%H_%M_%S)



function check_enviroment(){

if [ ! -d $MYSQL_ERRORLOG_PATH ]; then
  echo "`date`>usage: $MYSQL_ERRORLOG_PATH didn't exists" >> $LOG_FILE
  exit -1
fi

if [ ! -f "$MYSQL_ERRORLOG_PATH/$MYSQL_ERRORLOG_FILE" ] ; then
  echo "`date`>usage: $MYSQL_ERRORLOG_FILE didn't exists" >> $LOG_FILE
  exit -1
fi

if [ ! -d $SLOW_LOG_PATH ]; then
    echo "`date`>usage: $SLOW_LOG_PATH didn't exists" >> $LOG_FILE
    exit -1
fi 

if [ ! -f "$SLOW_LOG_PATH/$SLOW_LOG_FILE" ] ; then
  echo "`date`>usage: $SLOW_LOG_FILE didn't exists" >> $LOG_FILE
  exit -1
fi

if [ ! -d $LOG_FILE_PATH ]; then
    echo "`date`>usage: $LOG_FILE_PATH didn't exists" >> $LOG_FILE
    exit -1
fi

if [ ! -x /bin/mailx ];then
    echo "`date`>usage:mailx did not exists!" >> $LOG_FILE
    exit -1
fi

#ALERT_LOG_PATH目录不存在则创建目录
if [ ! -d $ALERT_LOG_PATH ] ; then
  echo "`date`>the path $ALERT_LOG_PATH didn't exists" >> $LOG_FILE
  mkdir -p $ALERT_LOG_PATH
fi

}

function rotation_mysql_log(){
 
#0点开始轮换/切换前一天的错误日志
if [ $HOUR -eq '00' ]; then
    
    #轮换/切换错误日志
    #注意:赋值的=号前后不要有空格
    NEW_ERRORLOG_NAME=$(basename ${MYSQL_ERRORLOG_PATH}/${MYSQL_ERRORLOG_FILE} .log)
    if [ -f "$MYSQL_ERRORLOG_PATH/${NEW_ERRORLOG_NAME}_${LOG_ROTATION_DATE}.log" ] ; then
        echo "`date`>MySQL的错误日志已经切换(rotation)" >> $LOG_FILE
    else
      cat $MYSQL_ERRORLOG_PATH/$MYSQL_ERRORLOG_FILE > $MYSQL_ERRORLOG_PATH/${NEW_ERRORLOG_NAME}_${LOG_ROTATION_DATE}.log

      #最后运行的命令的结束代码(返回值)
      if [ $? -eq 0 ]; then
        cat /dev/null > $MYSQL_ERRORLOG_PATH/$MYSQL_ERRORLOG_FILE
      else
        echo "`date`>failed to rotate the mysql error file" >> $LOG_FILE
      fi
    fi
    
    #轮换/切换慢查询日志
    NEW_SLOW_LOG_FILE=$(basename ${SLOW_LOG_PATH}/${SLOW_LOG_FILE} .log)
    if [ -f "${SLOW_LOG_PATH}/${NEW_SLOW_LOG_FILE}_${LOG_ROTATION_DATE}.log" ] ; then 
        echo "`date`>MySQL慢查询日志已经切换(rotation)" >> $LOG_FILE
    else
        cat $SLOW_LOG_PATH/$SLOW_LOG_FILE > $SLOW_LOG_PATH/${NEW_SLOW_LOG_FILE}_${LOG_ROTATION_DATE}.log
        #最后运行的命令的结束代码(返回值)
        if [ $? -eq 0 ]; then
          cat /dev/null > $SLOW_LOG_PATH/$SLOW_LOG_FILE
        else
          echo "`date`>failed to rotate the mysql slow file" >> $LOG_FILE
        fi
    fi
fi
}
 
function mysql_error_log_monitor(){

if [ -s "${ALERT_LOG_PATH}/mysql_alert.log" ] ; then

    cat $ALERT_LOG_PATH/mysql_alert.log > $ALERT_LOG_PATH/mysql_alert_old.log
fi

if [ -s "${MYSQL_ERRORLOG_PATH}/${MYSQL_ERRORLOG_FILE}" ] ; then

    egrep -i 'error|warning' $MYSQL_ERRORLOG_PATH/$MYSQL_ERRORLOG_FILE | sort -u > $ALERT_LOG_PATH/mysql_alert.log
fi

# 第一次时,没有生成mysql_alert_old.log,则执行下面逻辑
if [ ! -f "$ALERT_LOG_PATH/mysql_alert_old.log" ] ; then
   if [ -s "$ALERT_LOG_PATH/mysql_alert.log" ] ; then
        MAIL_SUBJECT="Error messages & Warning messages in MySQL Alert Log File on the `hostname` ($SERVER_IP) at `date` "
        mailx -s "${MAIL_SUBJECT}" -r ${MAIL_FROM} ${MAIL_TO} < $ALERT_LOG_PATH/mysql_alert.log
   fi
else

  #diff命令返回值为 0,说明两个文件相同,否则两个文件不相同
  diff $ALERT_LOG_PATH/mysql_alert.log  $ALERT_LOG_PATH/mysql_alert_old.log

  # $?是上一执行命令的返回值
  if [  $? == 0 ]; then
      echo "$LOG_DATE>there is no new error logs and warning logs are generated" >> $LOG_FILE
  else 
    if [ -s "$ALERT_LOG_PATH/mysql_alert.log" ] ; then
        MAIL_SUBJECT="Error messages & Warning messages in MySQL Alert Log File on the `hostname` ($SERVER_IP) at `date` "
        mailx -s "${MAIL_SUBJECT}" -r ${MAIL_FROM} ${MAIL_TO} < $ALERT_LOG_PATH/mysql_alert.log
    fi
  fi
fi
}

function delete_old_mysql_log(){

#删除指定天数前的错误日志文件
find $MYSQL_ERRORLOG_PATH -name ${ERROR_FILE_TYPE} -type f -mtime +$KEEYP_DAYS -delete
#删除指定天数前的慢查询日志文件
find $SLOW_LOG_PATH -name ${SLOW_FILE_TYPE} -type f -mtime +$KEEYP_DAYS -delete

}

function main()
{

echo "`date`>----------------- the mysql_log_manage_monitor.sh start -----------------"  >> $LOG_FILE
#注意,下面命令可能有些Linux平台不支持,请测试验证。这里在RHEL 7.x/RHEL 8下测试均OK
SERVER_IP=$(ip addr | awk '/^[0-9]+: / {}; /inet.*global/ {print gensub(/(.*)\/(.*)/, "\\1", "g", $2)}') 

check_enviroment;
rotation_mysql_log;
mysql_error_log_monitor;
delete_old_mysql_log;
echo "`date`>----------------- the mysql_log_manage_monitor.sh stoped -----------------"  >> $LOG_FILE

return 0;
}

main;

另外,当MySQL错误日志中出现Warning信息或ERROR信息时,发送告警邮件(或者接入公司的告警平台,一般调用相关API,此处略过),如果对于出现的Warning告警信息,不想脚本发送邮件告警的话,调整一下脚本即可。

修改前:

if [ -s "${MYSQL_ERRORLOG_PATH}/${MYSQL_ERRORLOG_FILE}" ] ; then
    egrep -i 'error|warning' $MYSQL_ERRORLOG_PATH/$MYSQL_ERRORLOG_FILE | sort -u > $ALERT_LOG_PATH/mysql_alert.log
fi

修改后(取消过滤的关键字waning即可)

if [ -s "${MYSQL_ERRORLOG_PATH}/${MYSQL_ERRORLOG_FILE}" ] ; then
    egrep -i 'error' $MYSQL_ERRORLOG_PATH/$MYSQL_ERRORLOG_FILE | sort -u > $ALERT_LOG_PATH/mysql_alert.log
fi

另外,这里不考虑MySQL通用查询日志,因为绝大部分环境下和绝大数场景下,都很少开启MySQL通用查询日志,所以这里不予考虑。

最后,上面脚本仅供参考,脚本在一些平台经过多次测试验证,但是不保证所有平台都OK。使用前,请在具体环境下测试验证后使用。

标签:LOG,mysql,ERRORLOG,FILE,MySQL,监控,PATH,日志
From: https://www.cnblogs.com/kerrycode/p/17460496.html

相关文章

  • 如何彻底卸载MySQL 并重装
    一、关闭MySQL服务(1)鼠标右击此电脑-->点击管理 (2)打开“计算机管理”界面,点击“服务和应用程序”-->服务-->MySQL;鼠标右键点击MySQL,点击停止。 二、卸载mysql软件打开【控制面板】,选择【程序和功能】,卸载Mysql相关的软件包。 三、删除MySQL安装目录下相关......
  • 在 MySQL 中,可以通过将插入操作放在事务中并使用 ROLLBACK 语句实现出现异常时全部回
    在MySQL中,可以通过将插入操作放在事务中并使用ROLLBACK语句实现出现异常时全部回滚。示例如下:STARTTRANSACTION;--开始事务INSERTINTOtable_name(column1,column2,...)VALUES(value1,value2,...);INSERTINTOtable_name(column1,column2,...)VALUES(val......
  • MySQL存储引擎
    一:存储引擎概念存储引擎其实就是对于数据库文件的一种存取机制,如何实现存储数据,如何为存储的数据建立索引以及如何更新,查询数据等技术实现的方法。MySQL中的数据用各种不同的方式存储在文件(或内存)中,每一种存储的方式都使用不同的存储机制,索引技巧等,最终提供广泛的不同功能和......
  • RDS 、HDFS、 mapreduce 、spark 、hive、 hbase 、zookeeper 、kafka 、flume、mysql
    这些技术是大数据领域的常用组件,它们之间的配置文件依赖关系如下:RDS是一种关系型数据库,可以独立安装和使用,不需要依赖其他组件。HDFS是Hadoop分布式文件系统,通常与MapReduce一起使用。在Hadoop集群中,HDFS需要配置core-site.xml和hdfs-site.xml两个文件,其中core-site......
  • 日志技术:logback的快速入门
         ......
  • 日志技术:体系结构、Logback日志框架介绍
         ......
  • 202306062001-《远程Linux服务器——安装tomcat8、jdk1.8、mysql5——mysql 用sql建表
    因createtable...提示格式错误,什么NAME啊...,必查了一下,要设置,好多条语句(5条左右),是设置格式的。 但设置完了,说重启mysql,就失效,要重新设置(5条sql重新执行一遍!) 永久有效的解决办法是:修改“my.cnf”,我的修改如下:[client]default-character-set=utf8[mysql]default-......
  • Zabbix监控流程
    明确监控的内容内置模板中是否有内容的实现如果没有,只能自定义编写采集数据的命令程序实现修改agent配置,添加自定义监控项 /etc/zabbix/zabbix_agentd.d/test.conf创建模板在模板上创建监控项、主机上关联模板案例vim/etc/zabbix/zabbix_agentd.d/test.conf#此路......
  • mysql 删除 主从信息
    原来配置的是主主同步,后经调整后配置成主从同步,需要清楚主配置上的同步信息, 进入mysqlmysql>slavestop;mysql>resetslave;mysql>changemastertomaster_user='',master_host='',master_password='';结果报错如下:ERROR1210(HY000):IncorrectargumentstoMASTER_HOS......
  • mysql使用efcore实现乐观并发控制
    为了避免多个用户同时操作同一个资源造成的并发冲突问题,通常需要进行并发控制。并发控制分为:乐观和悲观两策略悲观:悲观并发控制一般采用行锁、表锁等排它销对资源进行锁定,确保一个时间点只有一个用户在操作被锁定的资源。 悲观并发控件的使用比较简单,仅对要进行并发控制的资......