【MYSQL】binlog安全清理的两种方法

这篇具有很好参考价值的文章主要介绍了【MYSQL】binlog安全清理的两种方法。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

通常在交付MYSQL数据库前会将日志目录与数据文件分开,为其单独设立一个文件系统,这样便于掌握日志与数据的空间使用情况。如果不是业务突然增长,binlog会按照默认设置的过期时间自动被清理,但是有时候业务量增长是很突然的,比如上线了一个活动等,所以设置binlog自动清理是每个MYSQL管理员必须要做的一件事情。

两种binlog清理方法的选择

按MYSQL8.0官方手册的说法,purge binary log 和 expire_logs_senconds 都可以安全清理binlog文件,那么到底该选择哪一种呢?
1、选择参数expire_logs_senconds。对于大公司、大企业来说,交付的数据库数量较多,数据库通常有统一的部署规范,这种情形就可使用本参数来设置所有的数据库binlog自清理周期,例如本公司大基线要求是7天。
2、选择命令purge binary log。这种方式比较适合临时清理一下的场景,比如自清理脚本。例如某应用binlog文件突增,触发自清理条件就会清理,但不会修改过期参数expire_logs_senconds,当业务量下来是binlog又会保留的久一点。

值得注意的是,官方手册中有一句话 “为了手动清理binlog日志文件,请用 purge binary log 命令

【MYSQL】binlog安全清理的两种方法

清理方法1(purge binary log)

清理时,PURGE BINARY LOGS和PURGE MASTER LOGS这两个命令任选其一即可,PURGE命令会根据mysql-bin.index的内容来确定被清理的binlog日志文件。

The PURGE BINARY LOGS statement deletes all the binary log files listed in the log index file prior to the specified log file name or date. BINARY and MASTER are synonyms. Deleted log files also are removed from the list recorded in the index file, so that the given log file becomes the first in the list.

Examples:

PURGE BINARY LOGS TO 'mysql-bin.010';
PURGE BINARY LOGS BEFORE '2019-04-02 22:46:26';

如果从库正在复制主库binlog的情况下,你执行PURGE命令,这时不会删除正在被占用的binlog日志文件;但时如果主从断掉的情况下,你执行PURGE 命令,就无法自动恢复主从同步。

PURGE BINARY LOGS is safe to run while replicas are replicating. You need not stop them. If you have an active replica that currently is reading one of the log files you are trying to delete, this statement does not delete the log file that is in use or any log files later than that one, but it deletes any earlier log files. A warning message is issued in this situation. However, if a replica is not connected and you happen to purge one of the log files it has yet to read, the replica cannot replicate after it reconnects.

清理方法2(expire_logs_senconds)

当启动数据库服务或者刷新binlog时,MYSQL会根据参数值binlog_expire_logs_seconds(默认30天)自动清理binlog文件。

Binary log files are automatically removed after the server’s binary log expiration period. Removal of the files can take place at startup and when the binary log is flushed. The default binary log expiration period is 30 days. You can specify an alternative expiration period using the binlog_expire_logs_seconds system variable. If you are using replication, you should specify an expiration period that is no lower than the maximum amount of time your replicas might lag behind the source.

自清理脚本(shell)

在这里附上我为本公司编写的binlog自清理脚本,脚本以crontab的形式部署在交付出去的MYSQL服务器上,包括主备机、单机。脚本中的清理命令虽然只有寥寥几行,但是附加的文件系统使用率、空间大小、数据库版本、同步延迟时间等检验条件以及邮件报警却丰富了脚本的多样性。文章来源地址https://www.toymoban.com/news/detail-414940.html

#!/bin/ksh
#本脚本必须使用系统用户执行
#功能:检查所有mysql8.0版本的单机或主库的binlog占用文件系统大小。若达到清理条件则开始执行清理脚本,清理前备份binlog文件,清理完邮件报警给数据库管理员。
#注意:部署时使用sh 脚本名,否则=~符号会报错。
export LC_ALL=C

manageruser=xxxxxx
managerpass=xxxxxx
useage_limited=90
idle_size_limited=10

mysql_host="xxx.xxx.xxx.xxx"
mysql_user=xxxxxx
mysql_pass=xxxxxx

datetime=`date +"%Y%m%d_%H%M%S"`
yesterday=`date '+%Y-%m-%d %H:%M:%S' -d '1 days ago'`
ipaddr=`ifconfig -a|grep inet|grep -v 127.0.0.1|grep -v 0.0.0.0|grep -v inet6|awk '{print $2}'|tr -d "addr:"`

function getFileSystem(){
	F_PATH=/data/mysql_8.0_3306/log/bin_log
	FS_RESULT="/"
	for fs in `df |grep "/"|awk '{print $6}'`
	do
		if [[ $F_PATH/ =~ ${fs}/ ]]; then
			 FS_RESULT=$fs
		fi
	done
	echo $FS_RESULT
}

function get_binlog_useage(){
	useage=`df -h|grep $1|awk '{print $5}'|awk -FG '{print $1}'|awk '{print int($0)}'|sed -n '1p'`
	echo $useage
}

function get_binlog_idle_size(){
	idle=`df -h|grep $1|awk '{print $4}'|awk -FG '{print $1}'|awk '{print int($0)}'|sed -n '1p'`
	echo $idle
}

function get_behind_seconds(){
	standbyip=$(get_standby_ip $ipaddr)
	#echo "${standbyip}"
	if [ ! -n "${standbyip}" ]; then
        echo "单机或者备库[$ipaddr],可直接清理..."
		#echo 0
	else
		SECONDS_BEHIND_MASTER=$(mysql --connect-timeout=5 -h${standbyip} -u${manageruser} -p${managerpass} -e "SHOW SLAVE STATUS\G"| grep "Seconds_Behind_Master" | awk -F": " {' print $2 '})
		echo $SECONDS_BEHIND_MASTER
	fi
}

function get_standby_ip(){
	standby_ip=$(mysql --connect-timeout=5 -h$mysql_host -u$mysql_user -p$mysql_pass  -e "select distinct standby from iomp.ZJFH_MYSQL_LISTS where standby is not null and ip='$1';")
	echo $standby_ip|awk {'print $2'}
}

function backup_binlog_before_clean(){
	mkdir -p /data/mysql_8.0_3306/temp
	mount xxx.xxx.xxx.xxx:/appm/aixinst/mysql_install/Mysqlbinlog /data/mysql_8.0_3306/temp
	iptime="${ipaddr}_${datetime}"
	localdir=/data/mysql_8.0_3306/temp/${iptime}
	mkdir -p $localdir
	chown -R mysql:mysql $localdir
	cd $(find /data -name "bin_log")
	cp mysql-bin.* $localdir
	umount /data/mysql_8.0_3306/temp
	echo "mysqlbinlog backup dir: \\\\xxx.xxx.xxx.xxx\appm\aixinst\mysql_install\Mysqlbinlog\\${iptime}"
	echo
}

function clean_binlog(){
	echo '清理前binlog大小:'
	mysql -u$manageruser -p$managerpass -e "show binary logs;"
	echo
	mysql -u$manageruser -p$managerpass -e "purge binary logs before '${yesterday}';"
	echo '清理后binlog大小:'
	mysql -u$manageruser -p$managerpass -e "show binary logs;"
	
}

function send_mails()
{
	#test url
	#url="http://xxx.xxx.xxx.xxx:8080/iomp/probe/send"
	#production url
	url=http://xxx.xxx.xxx.xxx:8080/xxx/probe/send
	appcode="00000021"
	eagleappno="00000021"
	probetype="01"
	probedes="mysql_binlog_file_has_been_auto_clean[${ipaddr}]."   
	probetime=`date +"%Y%m%d%H%M%S"`    
	subappcode="1"
	echo "probetime:${datetime}, probedes: ${probedes}."
	command="curl $url -X POST -d 'appcode=$appcode&eagleappno=$eagleappno&probetype=$probetype&probetime=$probetime&subappcode=$subappcode' --data-urlencode probedes=$probedes"
    echo $command 
    eval $command
}

#清理条件?binlog使用率大于90或 binlog剩余空间小于10G
fileSystem=$(getFileSystem)
useage=$(get_binlog_useage ${fileSystem})
idle_size=$(get_binlog_idle_size ${fileSystem})
if [ $useage -gt $useage_limited ] || [ $idle_size -lt $idle_size_limited ]; then
	echo "binlog文件系统使用率或剩余大小满足清理条件,开始清理..."
else
	echo "binlog文件系统使用率[$useage]或剩余大小[$idle_size]充足,无需清理。"
	exit 1
fi

#清理内容?binlog时期在1天前的都备份后删除掉,修改binlog_expire_logs_seconds=86400可实现。
. /home/mysql/.profile
version=$(mysql -u$manageruser -p$managerpass  -e "select version();")
echo $version |grep "8.0"
if [ $?==0 ]; then
	echo "mysql版本为8.0,程序继续..."
else
	echo "mysql版本为5.7或5.5, 脚本暂不支持, 程序已退出..."
	exit 1
fi

delaytime=$(get_behind_seconds)
echo "Seconds_Behind_Master:${delaytime}"
if [ $delaytime -gt 86400 ]; then
	echo "主从延迟[$delaytime]超过86400秒(一天),不在本程序处理范围内,程序已停止,请手动处理..."
	exit 1
else
	echo "binlog文件系统使用率或剩余大小满足清理条件,开始清理..."
fi

alertcontent="本次共清理x个mysql-bin文件,空出x空间"
#备份、清理、邮件通知
backup_binlog_before_clean
clean_binlog
send_mails


到了这里,关于【MYSQL】binlog安全清理的两种方法的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

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

    1、查看日志文件的文件名以及在那里 show binary logs; 2、手动清除binlog文件 以文件为参考物 purge master logs to \\\'mysql-bin.009\\\';    ‘mysql-bin.009’之前的全部被清除,不包含mysql-bin.009 以时间为参考物 PURGE MASTER LOGS BEFORE DATE_SUB(CURRENT_DATE, INTERVAL 10 DAY); //删除10天前的MySQL binlog日志 删除所

    2024年02月07日
    浏览(57)
  • 第81讲:清理MySQL Binlog二进制日志的方式

    Binlog日志非常重要,但是占用的磁盘空间也很大,我们也需要定期的去清理二进制日志,在MySQL数据库中,提供了自动清理Binlog日志的参数,根据指定的天数,保留n天内的Binlog日志,也可以手动人为删除。 在手动删除Binlog日志时,要切记不要使用rm -rf直接删除Binlog,会导致主

    2024年02月04日
    浏览(48)
  • 清理构建目标文件夹的两种方式:webpack配置选项 VS clean-webpack-plugin插件

    92. 清理构建目标文件夹的两种方式:webpack配置选项 VS clean-webpack-plugin插件 在 webpack 中, clean: true 是一项配置选项,而 clean-webpack-plugin 是一个插件。它们的作用是清理(删除)构建目标文件夹中的旧文件。 1. clean: true 配置选项: 在 webpack 的配置文件中,你可以使用 clean 配

    2024年02月11日
    浏览(46)
  • MySQL中的两种特殊插入方式

    代码案例 PointMapper.java PointMapper.xml 代码案例 PointMapper.java PointMapper.xml on duplicate key update 和 replace into 是两种处理重复键冲突的方法,但它们具有一些区别 功能不同 on duplicate key update 在插入数据时,如果遇到重复键冲突,会更新已存在的行的值 replace into在插入数据时,如果遇

    2024年02月12日
    浏览(59)
  • 交换排序的两种方法

    C语言实现交换排序的两种方法:冒泡排序和快排。 冒泡排序:冒泡排序十分简单,在这里简要分析: 算法步骤: 比较相邻的元素。如果第一个比第二个大,就交换他们两个。 对每一对相邻元素作同样的工作,从开始第一对到结尾的最后一对。这步做完后,最后的元素会是

    2023年04月24日
    浏览(37)
  • 【MySQL】MySQL版本8+ 窗口函数 Lead 的两种使用

    1709. 访问日期之间最大的空档期 表:UserVisits Column Name Type user_id int visit_date date 该表没有主键,它可能有重复的行 该表包含用户访问某特定零售商的日期日志。 假设今天的日期是 ‘2021-1-1’ 。 编写解决方案,对于每个 user_id ,求出每次访问及其下一个访问(若该次访问是最

    2024年01月22日
    浏览(43)
  • 更改pip源的两种方法

    在使用`pip`安装Python包时,由于网络问题,可能会出现下载速度慢、甚至无法下载的情况。这时可以考虑更改`pip`的镜像源,以加快下载速度。以下是几种更改`pip`镜像源的方法: 1. 使用`pip`命令更改 可以使用`pip`命令更改`pip`的镜像源。以清华大学的镜像源为例,使用以下命

    2023年04月27日
    浏览(39)
  • 链表逆置的两种方法

    原链表图:   方法一:头插法链表 逆置 1.断开头节点与其他节点的连接(提前存好head-next的地址)     Node* p = head-next;     Node* q = p-next;     head-next = NULL; 2. 头插法 在head后面插入p后链表的各个节点     p-next = head-next;     head-next = p; p、q指针往后移     p = q;     if

    2024年02月16日
    浏览(46)
  • qt创建线程的两种方法

    第一种:继承QThread类 方法描述 1。类MyThread继承QThread, 2。重载MyThread中的run()函数,在run()函数中写入需要执行的工作; 3。调用start()函数来启动线程。 不是真的跨线程,子线程ID和主线程ID是同一个 第二种:QObject::moveToThread 这就是我要的子线程 //用于托管我的子线程

    2024年04月27日
    浏览(39)
  • pdf转png的两种方法

    背景:pdf在一般公司,没有办公系统,又不是word/wps/Office系统,读不出来,识别不了,只能将其转化为图片png,因此在小公司或者一般公司就需要pdf转png的功能。本文将详细展开。 1、fitz库(也就是PyMuPDF) 直接pip安装PyMuPDF即可使用,直接使用fitz操作,无需其他库。

    2024年02月04日
    浏览(40)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包