实践环境:MySQL8 CentOS7
目的:将binlog解码后备份到某特定路径下,备份的文件名沿用binlog的原文件名,以.log后缀作为结尾。
思路:
获取binlog名称列表
1. 命令格式:
mysql -h$dbhost -u$username -p$password -P$port -e 'show binary logs;
复制
2. 上一步获取列表的最后一个binlog不做备份,其他都备份。
3. 对已经备份过的binlog,不做二次备份。
通过文件名来对比是否备份过。
4. Base64解码后,存放为*.log文件。
shell脚本backupBinlog.sh如下:
#!/bin/bash
dbhost="rm-test.mysql.rds.aliyuncs.com"
username="root"
password="rootpw"
port="3306"
backupDir="/backup/dblog/Binlog"
binlogs=`mysql -h$dbhost -u$username -p$password -P$port -e 'show binary logs;' | awk '$1 ~ mysql-bin.*/ {print $1}'`
num=0
for binlog in $binlogs;
do
num=`expr $num + 1`
echo "数据库当前的binlog:"$binlog
done
# 此处获取到binlog的备份文件,过滤掉路径,筛选出文件名
existlogs=`ls -lh $backupDir/mysql-bin.* | awk '{print $9}' | awk -F'/' '{print $5}'`
for existlog in $existlogs;
do
echo "当前的备份有:"$existlog
done
index=0
for binlog in $binlogs;
do
index=`expr $index + 1`
# 如果是最后一个binlog,就不做备份
if [ "$index" == "$num" ];then
echo "No need backup last binlog [$index]:"$binlog
else
backuped=false
for existlog in $existlogs;
do
# 备份的文件名和binlog文件名一致,说明已备份过
if [ "${existlog%.*}" == "$binlog" ];then
backuped=true
break
fi
done
if $backuped;then
echo "No need backup $binlog cause it backuped"
else
echo "Now backup binlog[$index]:$binlog"
#解码后备份到backupDir路径下
mysqlbinlog -u$username -p$password -h$dbhost -P$port --read-from-remote-server -vv --base64-output=decode-rows $binlog > $backupDir/$binlog.log
fi
fi
done
复制
执行结果示例:
第一次执行,备份binlog
[yyxz@test Binlog]$ ./backupBinlog.sh
mysql: [Warning] Using a password on the command line interface can be insecure.
数据库当前的binlog:mysql-bin.000092
数据库当前的binlog:mysql-bin.000093
数据库当前的binlog:mysql-bin.000094
数据库当前的binlog:mysql-bin.000095
ls: cannot access backup/dblog/Binlog/mysql-bin.*: No such file or directory
Now backup binlog[1]:mysql-bin.000092
mysqlbinlog: [Warning] Using a password on the command line interface can be insecure.
Now backup binlog[2]:mysql-bin.000093
mysqlbinlog: [Warning] Using a password on the command line interface can be insecure.
Now backup binlog[3]:mysql-bin.000094
mysqlbinlog: [Warning] Using a password on the command line interface can be insecure.
No need backup last binlog [4]:mysql-bin.000095
复制
- 查看备份结果
[yyxz@test Binlog]$ ll -h
total 356M
-rwxrwxr-x 1 yyxz yyxz 1.2K Dec 2 15:12 backupBinlog.sh
-rw-rw-r-- 1 yyxz yyxz 120M Dec 2 15:13 mysql-bin.000092.log
-rw-rw-r-- 1 yyxz yyxz 43M Dec 2 15:13 mysql-bin.000093.log
-rw-rw-r-- 1 yyxz yyxz 194M Dec 2 15:13 mysql-bin.000094.log
复制
- 第二次备份,可以看到已经备份过的文件不会再备份
[yyxz@test Binlog]$ ./backupBinlog.sh
mysql: [Warning] Using a password on the command line interface can be insecure.
数据库当前的binlog:mysql-bin.000092
数据库当前的binlog:mysql-bin.000093
数据库当前的binlog:mysql-bin.000094
数据库当前的binlog:mysql-bin.000095
当前的备份有:mysql-bin.000092.log
当前的备份有:mysql-bin.000093.log
当前的备份有:mysql-bin.000094.log
No need backup mysql-bin.000092 cause it backuped
No need backup mysql-bin.000093 cause it backuped
No need backup mysql-bin.000094 cause it backuped
No need backup last binlog [4]:mysql-bin.000095
复制
最后,通过设置定时任务也可以每间隔10分钟就做一次定时备份动作
[yyxz@test Binlog]$ crontab -l
*/10 * * * * /backup/dblog/Binlog/backupBinlog.sh
复制
题图:
女儿 海洋 海龟 心桥 数不清的小心心 生日蛋糕 我
文章转载自一一小知,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。
评论
相关阅读
【MySQL 30周年庆】MySQL 8.0 OCP考试限时免费!教你免费领考券
墨天轮小教习
2529次阅读
2025-04-25 18:53:11
MySQL 30 周年庆!MySQL 8.4 认证免费考!这次是认真的。。。
严少安
782次阅读
2025-04-25 15:30:58
【活动】分享你的压箱底干货文档,三篇解锁进阶奖励!
墨天轮编辑部
439次阅读
2025-04-17 17:02:24
MySQL 9.3 正式 GA,我却大失所望,新特性亮点与隐忧并存?
JiekeXu
407次阅读
2025-04-15 23:49:58
3月“墨力原创作者计划”获奖名单公布
墨天轮编辑部
367次阅读
2025-04-15 14:48:05
openHalo问世,全球首款基于PostgreSQL兼容MySQL协议的国产开源数据库
严少安
356次阅读
2025-04-07 12:14:29
记录MySQL数据库的一些奇怪的迁移需求!
陈举超
262次阅读
2025-04-15 15:27:53
MySQL 8.0 OCP 1Z0-908 考试解析指南(二)
JiekeXu
217次阅读
2025-04-30 17:37:37
MySQL 8.4 新特性深度解析:功能增强、废弃项与移除项全指南
JiekeXu
210次阅读
2025-04-18 20:21:32
GreatSQL 新版发布:MySQL 牵手“鸭子”
严少安
147次阅读
2025-04-19 14:57:56