Linux-Shell:mysql的bin_log日志清理

本文提供了一个自动清理MySQL Binlog日志的Shell脚本,该脚本能够定期清理日志,保留最近一周的日志,并支持自适应路径和循环处理多个数据库。脚本功能包括获取日志列表、筛选倒数第七天的日志、生成清理命令,并执行清理操作。
需求:
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 < $BINPATH/bin/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命令就可以解决这个需求,我目前还在努力向这个方向迈进。

services: tender-management: restart: unless-stopped image: tender-management:latest container_name: tender-management build: context: . dockerfile: Dockerfile ports: - "8080:8080" - "5005:5005" environment: - TZ=Asia/Shanghai volumes: - ./data/tender-management-logs:/var/log healthcheck: test: [ "CMD-SHELL", "wget --spider http://localhost:8080/health || exit 1" ] interval: 10s timeout: 5s retries: 10 start_period: 40s depends_on: mysql: condition: service_healthy minio: condition: service_healthy minio-init: condition: service_completed_successfully mysql: container_name: mysql restart: unless-stopped image: 'mysql:8.0-debian' environment: - MYSQL_DATABASE=tender - MYSQL_ROOT_PASSWORD=yijiupi - TZ=Asia/Shanghai security_opt: - seccomp:unconfined ports: - "127.0.0.1:3306:3306" volumes: - ./data/mysql:/var/lib/mysql healthcheck: test: [ "CMD-SHELL", 'mysqladmin ping -h "localhost" -u "root" -pyijiupi' ] interval: 10s timeout: 5s retries: 40 start_period: 30s minio: image: minio/minio:RELEASE.2025-04-22T22-12-26Z container_name: minio restart: unless-stopped environment: - MINIO_ROOT_USER=minio_admin - MINIO_ROOT_PASSWORD=minio_admin - TZ=Asia/Shanghai ports: - "127.0.0.1:9001:9001" - "127.0.0.1:9002:9002" volumes: - ./data/minio/data:/data - ./data/minio/config:/root/.minio/ command: server --address :9001 --console-address :9002 /data healthcheck: test: [ "CMD", "curl", "--fail", "http://localhost:9001/minio/health/live" ] interval: 10s timeout: 5s retries: 10 start_period: 40s minio-init: image: minio/mc:latest container_name: minio-init depends_on: minio: condition: service_healthy entrypoint: > /bin/sh -c " mc alias set tender http://minio:9001 minio_admin minio_admin && mc admin user add tender x-tender x-tender-password && mc admin policy attach tender readwrite --user x-tender && echo 'MinIO initialization completed' "
最新发布
06-30
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值