本篇文档带来的是数据库每周进行一次全量备份,每天通过binlog日志进行每天的增量备份,当数据库被drop时可以使用备份文件进行恢复数据库,从而实现数据的安全。
一、实现全量备份
通过mysql dump+shell脚本实现对某个库进行备份
需要将下面脚本中的文件名称替换为自己本地存放文件的位置,一定注意文件的创建
#!/bin/bash
# mysql全量备份脚本
# 配置信息
mysql_user="root" # 替换你的用户
mysql_pass="123456" # 替换成你的密码
db_name="test" # 替换你的数据库名称
backup_dir="/opt/q_z_back" #替换为你数据库备份的目录
full_dir="${backup_dir}/full"
log_file="${backup_dir}/log/backup_log_$(date +%y%m%d).log"
# 创建目录(防止目录被误删)
mkdir -p $full_dir $backup_dir/log
# 全量备份文件名(带日期时间,避免覆盖)
full_backup_file="${full_dir}/${db_name}_full_$(date +%y%m%d_%h%m%s).sql"
# 执行全量备份(--flush-logs刷新binlog,--master-data记录binlog位置)
echo "[$(date "+%y-%m-%d %h:%m:%s")] 开始全量备份${db_name}库..." >> $log_file
mysqldump -u$mysql_user -p$mysql_pass --single-transaction --flush-logs --master-data=2 $db_name > $full_backup_file
# 检查备份结果
if [ $? -eq 0 ]; then
gzip $full_backup_file # 压缩备份
echo "[$(date "+%y-%m-%d %h:%m:%s")] 全量备份成功,文件:${full_backup_file}.gz" >> $log_file
find $full_dir -name "${db_name}_full_*.sql.gz" -mtime +30 -delete # (删除30天前的)
else
echo "[$(date "+%y-%m-%d %h:%m:%s")] 全量备份失败!" >> $log_file
fi
脚本解释:备份你的目标库,将备份的文件压缩并存放在指定目录下;使用if判断,如果备份命令执行成功就输出备份成功日志,删除30天前的备份文件防止占用磁盘空间,备份命令执行失败输出备份失败日志
二、实现增量备份
1. 开启binlog日志
需要检查自己的mysql是否开启了binlog日志,mysql8.0默认是开启binlog日志的,你也可以在本地查看一下,(登录mysql 然后执行show variables like '%log_bin%'; 如果binlog是on说明是开启的)要是没有开启binlog日志需要开启binlog日志(可以上网搜索一下如何开启)

2. binlog日志开启之后书写增量备份脚本
先要创建脚本中所需的目录full(全量备份文件存放位置)、log(日志存放位置)、increment(增量备份文件存放位置),需要更换将下面脚本中的文件名称替换为自己本地存放文件的位置
#!/bin/bash
# mysql增量备份脚本(test库)
# 配置信息
mysql_user="root"
mysql_pass="123456" # 替换成你的密码
db_name="test" # 替换为你备份的数据库
backup_dir="/opt/q_z_back" #替换为你的备份目录
incr_dir="${backup_dir}/increment"
full_dir="${backup_dir}/full"
log_file="${backup_dir}/log/backup_log_$(date +%y%m%d).log"
# binlog路径(mysql 8.0默认在/var/lib/mysql/,前缀是binlog)
binlog_dir="/var/lib/mysql"
binlog_prefix="binlog"
# 创建目录
mkdir -p $incr_dir $backup_dir/log
# 找到最新的全量备份文件
latest_full_backup=$(ls -t $full_dir/${db_name}_full_*.sql* 2>/dev/null | head -n 1)
if [ -z "$latest_full_backup" ]; then
echo "[$(date "+%y-%m-%d %h:%m:%s")] 未找到全量备份文件,增量备份失败!" >> $log_file
exit 1
fi
# 从全量备份中提取binlog起始位置
binlog_info=$(grep -e "change master to master_log_file='.*', master_log_pos=[0-9]+" $latest_full_backup | head -n 1)
binlog_file=$(echo $binlog_info | sed -n "s/.*master_log_file='\(.*\)', master_log_pos=[0-9]\+;/\1/p")
binlog_pos=$(echo $binlog_info | sed -n "s/.*master_log_pos=\([0-9]\+\);/\1/p")
# 增量备份文件名
incr_backup_file="${incr_dir}/${db_name}_incr_$(date +%y%m%d_%h%m%s).sql"
# 执行增量备份(解析binlog)
echo "[$(date "+%y-%m-%d %h:%m:%s")] 开始增量备份${db_name}库,从binlog ${binlog_file} 位置${binlog_pos}开始..." >> $log_file
mysqlbinlog --no-defaults -u$mysql_user -p$mysql_pass --database=$db_name --start-position=$binlog_pos $binlog_dir/$binlog_file > $incr_backup_file
# 检查备份结果
if [ $? -eq 0 ]; then
gzip $incr_backup_file # 压缩备份
echo "[$(date "+%y-%m-%d %h:%m:%s")] 增量备份成功,文件:${incr_backup_file}.gz" >> $log_file
find $incr_dir -name "${db_name}_incr_*.sql.gz" -mtime +7 -delete # 保留最近7天的增量备份
else
echo "[$(date "+%y-%m-%d %h:%m:%s")] 增量备份失败!" >> $log_file
fi
三、书写cron定时任务
1. 添加定时任务规则
1. crontab -e 加上 0 0 * * 0 /opt/q_z_back/test_full_backup.sh #这个可执行文件是你的全量备份脚本路径 0 0 * * * /opt/q_z_back/test_increment_backup.sh #这是你增量备份可执行文件路径 # 0 0 * * 0 表示每周六晚上24点或者每周天晚上0点执行这个脚本 # 0 0 * * * 表示每天晚上0点执行这个脚本
2. 检查定时任务规则
2. crontab -l #查看规则 #0 11 * * * /opt/backup/shell/table_student.sh 0 0 * * 0 /opt/q_z_back/test_full_backup.sh 0 0 * * * /opt/q_z_back/test_increment_backup.sh
当把这些配置好之后你的数据库就会被自动备份,但是还是存在风险,比如中午突然数据库出现故障那么早上的数据该怎么修复呢,这时候需要主从复制+高可用来解决这个问题,后续我会带来主从复制、高可用等文档,大家感兴趣的可以自己先去了解。
到此这篇关于mysql数据库全量备份+增量备份的实现的文章就介绍到这了,更多相关mysql 全量备份+增量备份内容请搜索代码网以前的文章或继续浏览下面的相关文章希望大家以后多多支持代码网!
发表评论