|
我们新IM项目在运营环境中的Mysql Master 的binlog是非常多的,特别是在并发量非常大的情况下!这些binlog占用空间比较大,如果长时间不做清理工作,可能导致Master 和slave 同步阻塞而同步失败!或者其它报错原因引起业务系统不可用!所以在部属前freeke在Google中找了所有关于MYSQL复制可能会出现的问题和别人遇到的问题来总结,包括优化方法在部属时一并做到位。非常担心在运行过程中遇到同步相关的问题!引起实时业务中断和影响!以至于天天早上五点就睡不着啦!
-rw-rw---- 1 mysql mysql 1074006749 Aug 27 08:46 mysql-bin.000001
-rw-rw---- 1 mysql mysql 71416149 Aug 27 09:03 mysql-bin.000002
-rw-rw---- 1 mysql mysql 1073741965 Aug 28 10:43 mysql-bin.000003
-rw-rw---- 1 mysql mysql 1073741891 Aug 30 03:53 mysql-bin.000004
-rw-rw---- 1 mysql mysql 499047762 Sep 2 18:06 mysql-bin.000005
如果有几百个bin log文件那磁盘空间马上就会报警了!
我们需要使用一些方法来自动清理bin log文件,在CU查了一下,有以下几种方法:
1、shell 清理
#!/bin/sh
## 2007-11-6
DELLOG="/usr/local/logs/del-sqlbin.log.`date +%d`"
DELTMP="/usr/local/logs/del-sqlbin.tmp"
MAIL_ADDR="xxx@xxx.xx"
exec &>$DELLOG
DT=`date +'%Y-%m-%d %T'`
SINGLE=0
sleep 30
hostname
echo `date +'%Y-%m-%d %T'`
echo "EXEC>>"
echo "URGE MASTER LOGS BEFORE '$DT';"
echo "PURGE MASTER LOGS BEFORE '$DT';" >$DELTMP
mysql -uroot -pxxx <$DELTMP
if [ $? = 0 ];then
echo "Purge master logs sucess!"
else
echo "Purge master logs failure!"
SINGLE=1
fi
echo "--------------------------------"
echo
if [ $SINGLE = 1 ];then
mail -s "Purge_master_logs_err" $MAIL_ADDR <$DELLOG
fi
2、MYSQL自动删除(只保留多少天的日志文件)
mysql有一个参数expire_logs_days ,即保留多长时间的binlog
set @expire_logs_days=xxx;
flush logs;
【msyqld】
expire_logs_day=20
3、shell 清理多少天前的日志文件
01 06 * * * find /var/lib/mysql/ -type f -name "mysql-bin.000*" -atime +7 -exec rm -f {} \;
4、将多少天前的日志文件自动压缩(写个shell crontab),该压缩文件可以放到MYSQL备份使用的NAS上去保留二年时间。
5、使用shell 监控master 、slave 之间同步是否成功,如果不成功短信报警和MSN报警、邮件报警
6、在使用第2种方法时,可能我清楚slave何时会处理完日志同步,所以写一个脚本实现连接到slave去检测是否同步完成,如果同步完成,就连接到master清除旧的日志文件,或者调用压缩脚本来SCP到NAS上去。
MySQL Replication Log PurgingMySQL master servers won't remove their logs automatically when slaves are done with them. You can set expire_logs_days to remove them after a certain number of days. But, you are not assured that a slave is done with the logs. So, we wrote a script to connect to slaves and then purge logs on the master servers. It works for us. Your mileage may vary.
flush_mysql_master.php.gz |
|