zoukankan      html  css  js  c++  java
  • linux shell:mysql bin_log定期清理脚本

    需求:
    1、自动处理mysql bin日志脚本
    2、输出可读log
    3、保留1周的日志
    4、对所有数据库统一处理。
     
    实现过程描述:
     
    思路:两种方式实现
    1、mysql目录通过ls获取bin日志目录并通过命令删除。
    2、通过mysql命令获取bin日志,并通过命令删除。
     
    相比较来说第二种更加容易实现。
     
    功能语句:
    mysql -h192.168.1.2 -uroot -pXXXXX < /home/GC_Tools/housekeeping/mysql_bin_log/bin/Getlog.sql > /home/GC_Tools/housekeeping/mysql_bin_log/bin/templog.txt
     
    以上命令输出格式如下:
    mysql-bin.001021        1073742032
    mysql-bin.001022        1073742579
    mysql-bin.001023        1073742818
    mysql-bin.001024        1073741920
    mysql-bin.001025        1073741915
    mysql-bin.001026        790706635
    第一列是日志名称,第二列是日志大小。
    以上是截取的一部分内容,我们需要的数据是倒数第七天的日志名称。
    通过mysql清理日志的命令去清理它之前的所有日志。

    直接获取倒数第七行的数据:
    tac templog.txt | sed -n 7p | awk -F ' ' '{print $1}'

    以下给出简略版本,只实现功能:删除指定数据库的bin日志,保留七天日志。
    #####################################
    #!/bin/bash
    TIME=`date +%Y%m%d%H%M%S`
    BINPATH="/home/GC_Tools/housekeeping/mysql_bin_log"
    SQLPARAM="mysql -h192.168.1.6 -uroot -pXXXXX"

    echo $TIME "start clean" >> $BINPATH/log/clean.log
    $SQLPARAM < $BINPATH/bin/Getlog.sql > templog.txt
    BinLog=`tac templog.txt | sed -n 7p | awk -F ' ' '{print $1}'`
    echo "Get the log's name is" \"$BinLog\" >>$BINPATH/log/clean.log
    echo "purge binary logs to '$BinLog';" > temp.sql
     
    $SQLPARAM < $BINPATH/bin/temp.sql >> $BINPATH/log/clean.log

    #############################################
    简略版本完成,功能测试正常。
     
    接下来需要实现功能:
    1、部署路径不要求,自适应。
    2、读取数据库IP配置文件,并循环处理。
     
    完整版本:
     
    #!/bin/bash
    #动态获取脚本路径
    DIR="$( cd "$( dirname "$0"  )" && pwd  )"
    BINPATH=`echo $DIR | sed -e 's/\/bin//'`
    #获取当前系统时间
    TIME=`date +%Y%m%d%H%M%S`

    #while do 循环处理配置文件
    while read LINE
    do
    #输出日志
    echo $TIME >>$BINPATH/log/clean.log
    echo $LINE >>$BINPATH/log/clean.log
    #获取数据库ip
    CHOST=`echo $LINE | awk -F ':' '{print $2}'`
    #拼写数据库连接sql
    SQLPARAM="mysql -h$CHOST -uroot -pXXXXX"
    #查询当前连接数据库的日志信息列表
    $SQLPARAM < $DIR/Getlog.sql > $DIR/templog.txt
    #获取倒数七天的日志名称
    BinLog=`tac $DIR/templog.txt | sed -n 7p | awk -F ' ' '{print $1}'`
    #拼写清理日志sql,并保存在临时文件
    echo "purge binary logs to '$BinLog';" > $DIR/temp.sql
    #执行sql,清理mysql日志
    $SQLPARAM < $DIR/temp.sql >>$BINPATH/log/clean.log
    rm -rf $DIR/templog.txt
    rm -rf $DIR/temp.sql
    #循环读取配置文件内容
    done<$BINPATH/etc/clean.conf

    ps:配置文件实例
    clean.conf
    DB2:192.168.1.3
    DB4:192.168.1.4
    DB5:192.168.1.5
    DB6:192.168.1.6

    再再PS:
    程序功能说明:
      定期(每周六晚)清理mysql的binlog,保留七天的日志,其余日志删除。
    使用说明:
    1、只需要在/etc配置文件内配置数据库名称与IP即可,不需要增加其他配置。

    2、脚本本身没有检测数据库是否连接正常的功能,默认连接正常,如果数据库异常最好不要配置,不然会连接超时。

    PS:写完之后发现,mysql其实有相应的配置项可以设置binlog的数量,汗颜....,不过脚本的功能和逻辑是想通的,也不算是完全没有价值和收获,当然有些大神直接一行shell命令就可以解决这个需求,我目前还在努力向这个方向迈进。

  • 相关阅读:
    唯品会面经
    动态代理两种实现方式
    腾讯运营开发面经
    MySQL一些中重要命令
    金山wps面经
    三七互娱面经
    排序算法之快速排序(Quicksort)解析
    全排列算法分析(原创方法/一般方法/字典序法)
    WinForm如何去掉右边和下边的白边
    Java异常处理机制的秘密
  • 原文地址:https://www.cnblogs.com/liujian001/p/5015986.html
Copyright © 2011-2022 走看看