一、Linux自动打包文件并发送邮件备份 服务器上安装了个密码管理的工具Bitwarden
,为了实现定时备份并发送到我邮箱里,参考网上资料,整理了以下脚本,方便实用,有需要的可以参考。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 #!/bin/bash save_days=7 find /root/Vault*.tar.gz -mtime +$save_days -exec rm -rf {} \; d=`date "+%Y-%m-%d" ` tar -czvPf /root/Vault-$d .tar.gz -C /mnt/bitwarden data title="Vault-Backup-$d " content="Hello,Master!Vault backup has been completed!Backup Time:$d " echo "$content " | mail -s "$title " -a /root/Vault_$d .tar.gz i@iyuren.comexit
注意: linux使用邮件的配置和详细设置请参考《Linux通过配置第三方smtp来发送邮件 》。
注意: 如果需要排除dada目录下某个目录,可以使用–exclude参数,比如要排除data目录下logs目录:
1 tar -czvPf /root/Vault-$d .tar.gz -C /mnt/bitwarden --exclude=data/logs data
排除多个data目录下的多个目录,如logs,ico这两个目录:
1 tar -czvPf /root/Vault-$d .tar.gz -C /mnt/bitwarden --exclude=data/logs --exclude=data/ico data
二、其它参考方案 1.如何实现自动保留最近n次备份记录? 1.1解决方案的实现过程
获取备份文件夹下的所有文件
根据Google爸爸的提示,楼主找到了下面的命令,
1 find 对应目录 -mtime +天数 -name "文件名" -exec rm -rf {} \;
实例命令:
1 find /opt/soft/log/ -mtime +30 -name "*.log" -exec rm -rf {} \;
说明:
将/opt/soft/log/目录下所有30天前带”.log”的文件删除。
具体参数说明如下:
命令/参数
说明
find:
linux的查找命令,用户查找指定条件的文件;
/opt/soft/log/:
想要进行清理的任意目录;
-mtime:
标准语句写法;
+30:
查找30天前的文件,这里用数字代表天数;
“ ×.log”:
希望查找的数据类型,”×.jpg”表示查找扩展名为jpg的所有文件,”×”表示查找所有文件,这个可以灵活运用,举一反三;
-exec:
固定写法;
rm -rf:
强制删除文件,包括目录;
{} ; :
固定写法,一对大括号+空格++;
解决问题的思路:
当然楼主当然不能傻乎乎的将备份目录下的所有文件都删除掉,这样的话,备份不就失去了意义。 所以换一下思路便有了下面的命令
1 find ${BAK_HOME} -mtime +1 -name "*:*" | wc -l
说明:
获取备份目录下所有一天前带”:”的所有文件数量。
1 find ${BAK_HOME} -mtime +1 -name "*:*"
说明:
获取备份目录下所有一天前带”:”的所有文件数量。
到了这里我们的问题差不多就可以解决了。so,请接着往下看:
1.2解决方案的思路及shell脚本的实现
思路
目前解决该问题的方法是在原来部署脚本中添加一段脚本,实现保留最近10次部署的备份记录,超过10次的备份记录将被删除.
shell脚本的实现
逻辑很清晰,思路很明了,我就不在这里接着阐述了,谢谢大家!
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 # !/bin/sh BAK_HOME="/home/saveHistoryData/iam-share-8083" # 保留份数 keepNum=5 # 统计目录下文件个数,赋值给fileNum fileNum=$(find ${BAK_HOME} -mtime +1 -name "*:*" | wc -l) # 显示文件统计数 echo "${fileNum}" for file in $(find ${BAK_HOME} -mtime +1 -name "*:*"); do if test $[fileNum] -gt $[keepNum]; then rm -rf ${file} fileNum=${fileNum}-1 echo "删除多余备份文件" else echo "没有多余备份文件" fi done
2.linux下mysql自动备份及保留最新的n份
2.1 在linux新建文件mysqlbackup.sh
/home/mysqlbackup.sh
文件内容:
1 2 3 4 5 6 7 8 9 10 11 12 # !/bin/bash dbNames=(db1 db2 db3) DATE=`date -d "now" +%Y%m%d_%H%M%S` cd /opt/backup/mysql for dbName in ${dbNames[*]} do #echo $dbName dumpFile=$dbName'_'$DATE.sql.gz #echo $dumpFile mysqldump -uusername -ppassword $dbName | gzip > /opt/backup/mysql/$dumpFile ls -lt $dbName'_'*| awk '{if(NR>7){print "rm "$9}}' | sh done
文件说明:
把 username 替换为实际的用户名;
把 password 替换为实际的密码;
把 DatabaseName 替换为实际的数据库名;
2.2 赋予权限
chmod u+x /home/mysqlback.sh
2.3 加入定时任务
crontab -e
这时就像使用vi编辑器一样,可以对计划任务进行编辑。
输入以下内容并保存:
0 0 * * * /home/mysqlbackup.sh
说明:每天0点执行
3.Linux服务器自动备份数据库 3.1 linux服务器自动备份数据库 1 2 3 环境: 两台linux服务器:Server-A 、Server-B 其中Server-A 上运行mysql
3.2 配置两个服务器免密传输 3.3 准备备份数据库脚本 (1)shell脚本代码
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 # !/bin/bash # 保存备份个数 number=31 # 备份保存路径 backup_dir=/opt/back # 日期 dd=`date +%Y-%m-%d-%H-%M-%S` # 备份工具 tool=mysqldump # 数据库用户名 username=root # 数据库密码 password=root123 # 将要备份的数据库名称 database_name=ammis # 备份服务器ip地址 ip_back_server=192.168.10.130 # 备份服务器文件路径 dir_back_server=/opt/back # 以上变量需要检查 # 如果文件夹不存在则创建 if [ ! -d $backup_dir ]; then mkdir -p $backup_dir; fi # 简单写法 mysqldump -u root -p123456 users > /root/mysqlbackup/users-$filename .sql $ tool -u $username -p$password $database_name > $backup_dir /$database_name -$dd .sql # 写创建备份日志 echo "create $backup_dir/$database_name-$dd.dupm" >> $backup_dir/log.txt # 压缩文件 zip -rm $backup_dir/$database_name-$dd.zip $backup_dir/$database_name-$dd.sql # 将备份数据库文件传至备份服务器 scp $backup_dir/$database_name-$dd.zip root@$ip_back_server:$dir_back_server # 找出需要删除的备份 delfile=`ls -l -crt $backup_dir/*.zip | awk '{print $9 }' | head -1` # 判断现在的备份数量是否大于$number count=`ls -l -crt $backup_dir/*.zip | awk '{print $9 }' | wc -l` if [ $count -gt $number ] then # 删除最早生成的备份,只保留number数量的备份 rm $delfile # 写删除文件日志 echo "delete $delfile" >> $backup_dir/log.txt fi
(2)检查备份服务器上有没有 /opt/back 目录
(3)将mysql_dump.sh (脚本文件名) 脚本文件放到服务器目录/opt/backScript 下
(4)执行命令:chmod +x /opt/backScript /mysql_dump.sh赋予shell脚本执行权限
(5)执行命令:/opt/backScript /mysql_dump.sh测试脚本是否正常运行
3.4 配置定时任务 (1)执行命令crontab -e (2)新增一条定时任务,0 0 * * * [脚本路径]
三、实战案例配置 1.Bitwarden 数据自动打包,保留最新N份,并同步回本地 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 # !/bin/bash # 保存备份个数 number=8 # 日期 dd=`date +%Y%m%d_%H%M%S` # 备份工具 tool=tar oldName="Vaultwarden-DockerData" newName=$oldName'_'$dd.tar.gz # 备份保存路径 backup_dir=/root/rsyncBackup/Vaultwarden # 备份服务器ip地址 ip_back_server=dns.cyida.com # 备份服务器文件路径 dir_back_server=/docker/vaultwarden # 远程同步目录 rsync_dir=xxx@dns.cyida.com::Bitwarden # 以上变量需要检查 # 如果文件夹不存在则创建 if [ ! -d $backup_dir ]; then mkdir -p $backup_dir; fi # 压缩文件 tar -czvPf $backup_dir/$newName -C $dir_back_server data 2>> $backup_dir/log.txt # 写创建备份日志 # echo "create $backup_dir /$newName 并同步完成" >> $backup_dir /log.txt# 找出需要删除的备份 delfile=`ls -l -crt $backup_dir/*.gz | awk '{print $9 }' | head -1` # 判断现在的备份数量是否大于$number count=`ls -l -crt $backup_dir/*.gz | awk '{print $9 }' | wc -l` if [ $count -gt $number ] then # 删除最早生成的备份,只保留number数量的备份 rm $delfile # 写删除文件日志 echo "delete $delfile" >> $backup_dir/log.txt fi # 将备份数据库文件传至备份服务器 rsync -avzu --port=873 $backup_dir/ $rsync_dir --password-file=/etc/rsyncd/rsync.passwd --delete >> $backup_dir/log.txt 2>&1
2.Hexo-blog 定期自动打包,保留最近N份,并同步传回 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 # !/bin/bash # 保存备份个数 number=8 # 日期 dd=`date +%Y%m%d_%H%M%S` # 备份工具 # tool=tar oldName="blog.cyida.com-DockerData" newName=$oldName'_'$dd.tar.gz # 备份服务器ip地址 # ip_back_server=dns.cyida.com # 备份保存路径 backup_dir=/root/rsyncBackup/blog.cyida.com # 备份服务器文件路径 dir_back_server="/docker/hexo blog.cyida.com" # 远程同步目录 rsync_dir=xxxx@dns.cyida.com::Hexo # 以上变量需要检查 # 如果文件夹不存在则创建 if [ ! -d $backup_dir ]; then mkdir -p $backup_dir; fi # 压缩文件 tar -czvPf $backup_dir/$newName -C $dir_back_server 2>> $backup_dir/log.txt # 写创建备份日志 # echo "create $backup_dir /$newName 并同步完成" >> $backup_dir /log.txt# 找出需要删除的备份 delfile=`ls -l -crt $backup_dir/*.gz | awk '{print $9 }' | head -1` # 判断现在的备份数量是否大于$number count=`ls -l -crt $backup_dir/*.gz | awk '{print $9 }' | wc -l` if [ $count -gt $number ] then # 删除最早生成的备份,只保留number数量的备份 rm $delfile # 写删除文件日志 echo "delete $delfile" >> $backup_dir/log.txt fi # 将备份数据库文件传至备份服务器 rsync -avzu --port=873 $backup_dir/ $rsync_dir --password-file=/etc/rsyncd/rsync.passwd --delete >> $backup_dir/log.txt 2>&1
3.Seafile数据库自动打包 保留最(近)新n份,并传回本地 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 # !/bin/bash # 保存备份个数 number=8 # 备份保存路径 backup_dir=/root/backup/seafile-db # 日期 dd=`date +%Y-%m-%d_%H%M%S` # 备份工具 tool=mysqldump # 数据库用户名 username=root # 数据库密码 password=xxxxxx # 将要备份的数据库名称 共3个 # ccnet_db # seafile_db # seahub_db database_name=seafile-db # 备份服务器ip地址 ip_back_server=192.168.199.180 # 备份服务器文件路径 dir_back_server=xxxx@192.168.199.180::backup/Seafile/mysql/ # rsync 密码文件路径 rsync_pw=/root/backup/rsync.passwd # 以上变量需要检查 # 如果文件夹不存在则创建 if [ ! -d $backup_dir ]; then mkdir -p $backup_dir; fi # 简单写法 mysqldump -u root -pxxxx users > /root/mysqlbackup/users-$filename .sql $ tool -u $username -p$password ccnet_db > $backup_dir /ccnet_db_$dd .sql $ tool -u $username -p$password seafile_db > $backup_dir /seafile_db_$dd .sql $ tool -u $username -p$password seahub_db > $backup_dir /seahub_db_$dd .sql # 写创建备份日志 echo "create $backup_dir/$database_name_$dd.dupm" >> $backup_dir/log.txt # 压缩文件 tar -czvf $database_name'_'$dd.tar.gz *.sql --remove-files # 找出需要删除的备份 delfile=`ls -l -crt $backup_dir/*.gz | awk '{print $9 }' | head -1` # 判断现在的备份数量是否大于$number count=`ls -l -crt $backup_dir/*.gz | awk '{print $9 }' | wc -l` if [ $count -gt $number ] then # 删除最早生成的备份,只保留number数量的备份 rm $delfile # 写删除文件日志 echo "delete $delfile" >> $backup_dir/log.txt fi # 将备份数据库文件传至备份服务器 rsync -avu $backup_dir/ $dir_back_server --password-file=$rsync_pw --delete