# vim/data/scripts/delete_mysql_binlog.sh
1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465 6667686970717273747576777879808182838485868788899091 |
#!/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
* * * * */data/scripts/delete_mysql_binlog.sh >/dev/null 2>&1
This article is from the "Target: India" blog, please be sure to keep this source http://shunzi115.blog.51cto.com/5184443/1827022
MySQL Binlog Automatic Cleanup script