Linux 利用rsync实现全自动增量&&全量备份配置


前情提要:

  项目马上要上线之际,某摸鱼小伙正在和妹子Q在线斗图,突然一只厚重的手搭上了小伙的肩膀,小伙一个机灵,回头看见领导在后面凝视!~

  领导:有空吗?

  小伙:嗯...(OS:他看到了什么?),有空吧~

  领导:好像线上的数据库还没有做备份,你现在有空,就把这个备份做了吧。

  然后通过沟通,小伙确定了备份方案:要保留最近的三个备份,每天增量备份一次,每周全量备份一次

话不多说了,开始干活!

  ps:本次备份只演示在本机上进行备份,需要跨服务器备份的同学可以参考“rsync跨服务器文件同步”相关资料,结合本配置教程完成自动化的操作。

  工具:数据镜像备份工具 rsync + shell脚本 + 定时任务命令 crontab

  本次备份的目标为docker容器中的数据库挂载目录和数据库的docker-compose文件,只需要将包含这两块的整个文件夹备份就可以了。

 

1.shell备份脚本

#!/bin/bash

# 打印脚本开始执行时间
echo `date +"%Y/%m/%d-%H:%M:%S"`

echo "-------Start!--------"

# 获取当前是周几
WEEK_DAY=$(date +%w)
echo '今天星期'$WEEK_DAY

# 判断是否是周日,0就代表周日
if [ $WEEK_DAY -eq 0 ];then
  # 如果是周日,就全量更新,所谓全量备份就是把之前增量备份的文件夹名字换掉
  echo "今天是周天,全量备份数据库"
  # 旧的备份目录名称拼接上时间
  filename=pgback_$(date +%Y%m%d)
  # 修改旧的备份目录名称为filename
  mv /mnt/data/docker/pgback/postgis /mnt/data/docker/pgback/$filename
else
  echo "今天不是周天,增量备份数据库"
fi


#--------开始增量备份(/mnt/data/docker/pgback下没有postgis文件夹话就是全量了)---------

# 语法 rsync -avzP --delete 数据库所在目录 备份所在目录
# 其中 -avzp 和 --delete 的解释如下:
# -a: 归档模式,表示递归传输并保持文件属性
# -v:显示rsync过程中详细信息
# -z: 传输时进行压缩提高效率
# -P:显示文件传输的进度信息
# --delete:当源目录中的文件删除,同步后目标目录中的文件也会被删除
rsync -avzP --delete /mnt/data/docker/postgis /mnt/data/docker/pgback

#--------控制备份个数-------------------------------------------------------------

# 保留文件数,包含文件夹
ReservedNum=3
# 文件所在的上级目录,以下就叫父目录吧
FileDir=/mnt/data/docker/pgback
# 获取父目录中文件的数量
FileNum=$(ls -l $FileDir |sed 1d|wc -l)
# 当文件数量不再大于保留文件数时,结束循环
while (($FileNum > $ReservedNum)); do
  # 获取创建时间最早的文件名称
  OldFile=$(ls -rt $FileDir | head -1)
  # 打印删除文件的信息,日志中可以看
  echo $(date +"%Y/%m/%d-%H:%M:%S") "Delete File:"$OldFile
  # 执行删除
  rm -rf $FileDir/$OldFile
  # 文件数量减1,继续循环判断
  let "FileNum--"
done

#--------控制日志文件个数(命令和控制备份个数一致,不再说明)--------------------------

LogFileDir=/mnt/data/backup_database_log
LogFileNum=$(ls -l $LogFileDir |sed 1d|wc -l)
while (($LogFileNum > $ReservedNum)); do
  LogOldFile=$(ls -rt $LogFileDir | head -1)
  echo $(date +"%Y/%m/%d-%H:%M:%S") "Delete File:"$LogOldFile
  rm -rf $LogFileDir/$LogOldFile
  let "LogFileNum--"
done

 

echo "-------Complete!--------"

以上的脚本解释有明白的地方,可以在评论区留下问题。

2.将脚本添加到系统定时任务列表中

在Linux中执行命令 crontab -e 编辑定时任务列表,在末尾加入:

30 2 * * * 脚本绝对路径 > 日志文件绝对路径 2>&1 &

ps:日志文件的名称最好拼接上时间,方便查看

就代表每天的凌晨2点30分会执行一次脚本,并将执行过程写入到日志文件中。

3.没有了,你已经搞定了,Ohhhhhhhhhhhhhh!

 

 

 


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM