MySQL binlog 自动清理脚本

# vim /data/scripts/delete_mysql_binlog.sh


1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

66

67

68

69

70

71

72

73

74

75

76

77

78

79

80

81

82

83

84

85

86

87

88

89

90

91


#!/bin/bash

#=======================================================================================

#   用于删除 MySQL Master 端已经同步完的 binlog【需在 Master 端运行】,以减少磁盘空间

#   每天凌晨 5:30 分运行一次

#

#   注:需在 Slave 端添加允许 Master 端访问的帐号【帐号:check_binlog,密码:binlog_2356】

#          运行于 MySQL Master 端【目前只用于一主一从的同步模式,对于多从的情况暂时未考虑】

#=======================================================================================

PATH=/sbin:/bin:/usr/sbin:/usr/bin:/usr/local/sbin:/usr/local/bin

      

## Slave端连接信息

SLAVE_ADDR="XXX.XXX.XXX.XXX"

SLAVE_USER="check_binlog"

SLAVE_PWD="binlog_2356"

      

LOGFILE="/data/logs/db_sync_info.log"

PINGFILE="/tmp/mysqlping.log"

      

## MySQL状态信息查看命令

SQLCMD="show slave status"

      

#=======================================================================================

## 检查MySQL是否已经运行

if [[ `ps aux | grep mysql[d] | wc -l` -eq 0 ]]; then

    echo The MySQL is not running at: `date +%F" "%H-%M-%S` >> ${LOGFILE}

    exit 1

fi

      

## 测试Slave端的连通性

nohup mysqladmin -h${SLAVE_ADDR} -u${SLAVE_USER} -p${SLAVE_PWD} ping > ${PINGFILE}

retval=`grep "^error" ${PINGFILE}`

rm -f ${PINGFILE}

if [[ "${retval}X" != "X" ]]; then

    echo The MySQL Slave can not be connected at: `date +%F" "%H-%M-%S` >> ${LOGFILE}

    exit 1

fi

      

## 检查是否合法的Slave

MASTER_ADDR=`mysql -h${SLAVE_ADDR} -u${SLAVE_USER} -p${SLAVE_PWD} -e "${SQLCMD}\G;" | awk ‘$1=="Master_Host:" {print $2}‘`

LOCAL_ADDR=`/sbin/ifconfig eth1 | awk -F ‘:‘ ‘/inet addr/{print $2}‘ | sed ‘s/[a-zA-Z ]//g‘`

if [[ "${MASTER_ADDR}" != "${LOCAL_ADDR}" ]]; then

    echo The MySQL Slave is not lawful at: `date +%F" "%H-%M-%S` >> ${LOGFILE}

    exit 1

fi

      

## 获得Slave端信息,以此来确定是否处于正常同步的情况

IO_STATUS=`mysql -h${SLAVE_ADDR} -u${SLAVE_USER} -p${SLAVE_PWD} -e "${SQLCMD}\G;" | awk ‘$1=="Slave_IO_Running:" {print $2}‘`

SQL_STATUS=`mysql -h${SLAVE_ADDR} -u${SLAVE_USER} -p${SLAVE_PWD} -e "${SQLCMD}\G;" | awk ‘$1=="Slave_SQL_Running:" {print $2}‘`

if [[ "${IO_STATUS}" != "Yes" || "${SQL_STATUS}" != "Yes" ]]; then

    echo The MySQL Replication is not synchronous at: `date +%F" "%H-%M-%S` >> ${LOGFILE}

    exit 1

fi

      

## 再做一次判断,以保证数据同步绝对正常【创建测试数据】

mysql -uroot -e "create database if not exists mytestdb;"

sleep 3

      

retval=`mysql -h${SLAVE_ADDR} -u${SLAVE_USER} -p${SLAVE_PWD} -e "show databases;" | grep mytestdb`

mysql -uroot -e "drop database if exists mytestdb;"

if [[ "${retval}X" = "X" ]]; then

    echo The MySQL Replication is not synchronous at: `date +%F" "%H-%M-%S` >> ${LOGFILE}

    exit 1

fi

      

## 在已经同步的情况,还需要判断当前同步的binlog,以此来确定哪些已经是过期的binlog

SLAVE_BINLOG1=`mysql -h${SLAVE_ADDR} -u${SLAVE_USER} -p${SLAVE_PWD} -e "${SQLCMD}\G;" | awk ‘$1=="Master_Log_File:" {print $2}‘`

SLAVE_BINLOG2=`mysql -h${SLAVE_ADDR} -u${SLAVE_USER} -p${SLAVE_PWD} -e "${SQLCMD}\G;" | awk ‘$1=="Relay_Master_Log_File:" {print $2}‘`

## 获得Master端,当前的binlog文件以及binlog路径

MASTER_BINLOG=`mysql -uroot -e "show master status;" | grep -v ‘^+‘ | tail -1 | awk ‘{print $1}‘`

      

## 主从端已经同步到相同的binlog

if [[ "${SLAVE_BINLOG1}" = "${SLAVE_BINLOG2}" && "${SLAVE_BINLOG1}" = "${MASTER_BINLOG}" ]]; then

    CURR_BINLOG="${MASTER_BINLOG}"

         

## 主从端已经同步,但从端的binlog还没有追赶到主端最新的binlog

elif [[ "${SLAVE_BINLOG1}" = "${SLAVE_BINLOG2}" && "${SLAVE_BINLOG1}" != "${MASTER_BINLOG}" ]]; then

    CURR_BINLOG="${SLAVE_BINLOG1}"

         

## 主从端已经同步,主从端的binlog一致,但relaylog还不一致

elif [[ "${SLAVE_BINLOG1}" != "${SLAVE_BINLOG2}" && "${SLAVE_BINLOG1}" = "${MASTER_BINLOG}" ]]; then

    CURR_BINLOG="${SLAVE_BINLOG2}"

         

else

    echo Has noknown error at:`date +%F" "%H-%M-%S` >> ${LOGFILE}

    exit 1

fi

      

mysql -uroot -e "purge binary logs to ‘${CURR_BINLOG}‘;"

if [[ $? -eq 0 ]]; then

    echo Clear MySQL binlog is ok at: `date +%F" "%H-%M-%S` >> ${LOGFILE}

fi

# crontab -e

30 05 * * * /data/scripts/delete_mysql_binlog.sh >/dev/null 2>&1

时间: 2025-01-31 07:35:55

MySQL binlog 自动清理脚本的相关文章

MySQL bin-log 日志清理方式

MySQL bin-log 作用 1.数据恢复:如果你的数据库出问题了,而你之前有过备份,那么可以看日志文件,找出是哪个命令导致你的数据库出问题了,想办法挽回损失. 2.主从服务器之间同步数据:主服务器上所有的操作都在记录日志中,从服务器可以根据该日志来进行,以确保两个同步. 3.在什么时间会删除过期日志? 每次进行 LOG flush的时会自动删除过期的日志,那么什么时间才能触发log flush,手册上的解释为: 重启 MySQL bin-log 文件大小达到参数 max_binlog_si

mysql数据库自动备份脚本分享

前几篇博客已经相继公开了去转盘网的所有技术细节,如下: 百度网盘爬虫 中文分词算法 邀请好友注册 js分页部分代码 这篇博客我将继续公开数据库自动备份的代码.可以这么说,没有数据库,一切就是个蛋,没有数据库备份,一切还是个蛋,你可以想象数据库备份多么重要.不会linux,不会写shell的朋友麻烦先去补补.不过你说我牛逼,不补也能看懂,那没问题,哈哈,废话不说了.老规矩,上代码: #!/bin/bash time=$(date +"%d-%m-%Y") pre=/home/ubuntu

MySQL主从自动配置脚本

通过yum安装mariadb,并配置MySQL主从服务器主服务器:192.168.10.11从服务器:192.168.10.12 #!/bin/bash #==================================================== # Author: Mr.Song # Create Date: 2019-02-21 # Description: auto config MySQL master&slave #============================

mysql+keepalived主从切换脚本 转

Keepalived MySQL故障自动切换脚本 MySQL架构为master-slave(主从),master故障自动切换到slave上.当然也可以设置为双master,但这里有个弊端:就是当主的压力很大时,从上延时很大,比如落后2000秒,此时主挂了,从接管(VIP漂移到从),用户刚才发表的文章,此时因为同步延时大,还没复制过来,于是用户又发表了一篇文章,当原来的master修好后,因从的IO和SQL线程还在开启状态,还会继续同步刚才没有同步复制完的数据,这时有可能把用户新发表的文章更改掉,

mysql自动安装脚本

为适应自己工作习惯和需要,花一点时间写了一个mysql自动安装脚本,供大家参考学习. 注意: 1.需要先安装cmake 2.数据库版本需要在第二步安装mysql时修改 3.该脚本是以root用户安装并启动 脚本内容如下: ######################################################################## #mysql自动安装脚本,其中变量/mysql_v_dir/和/port/可根据实际需要修改    # #执行脚本命令:sh mys

mysql binlog日志自动清理及手动删除

说明:当开启mysql数据库主从时,会产生大量如mysql-bin.00000* log的文件,这会大量耗费您的硬盘空间.mysql-bin.000001mysql-bin.000002mysql-bin.000003mysql-bin.000004mysql-bin.000005-有三种解决方法:1.关闭mysql主从,关闭binlog:2.开启mysql主从,设置expire_logs_days:3.手动清除binlog文件,> PURGE MASTER LOGS TO 'MySQL-bin

【转载】mysql binlog日志自动清理及手动删除

说明:当开启mysql数据库主从时,会产生大量如mysql-bin.00000* log的文件,这会大量耗费您的硬盘空间.mysql-bin.000001mysql-bin.000002mysql-bin.000003mysql-bin.000004mysql-bin.000005…有三种解决方法:1.关闭mysql主从,关闭binlog:2.开启mysql主从,设置expire_logs_days:3.手动清除binlog文件,> PURGE MASTER LOGS TO ‘MySQL-bin

实战:INNOBACKUPEX for mysql 5.6自动还原脚本

#!/bin/sh # # 使用方法: # ./restore.sh /你备份文件的全路径 #[email protected] INNOBACKUPEX=innobackupex INNOBACKUPEX_PATH=/usr/bin/$INNOBACKUPEX TMP_LOG="/var/log/restore.$$.log" MY_CNF=/usr/local/mysql/my.cnf BACKUP_DIR=/backup # 你的备份主目录 FULLBACKUP_DIR=$BAC

linuxshell 实现自动清理rman备份文件的脚本

rman备份脚本 #! /bin/bash su - oracle <<! rman target /<<EOF backup AS COMPRESSED BACKUPSET   database include current controlfile format'/orabak/db_%d_%T_%s' plus archivelog format'/orabak/arch_%d_%T_%s'  delete allinput; delete noprompt obsolete