Linux文件和MYSQL数据库自动打包备份并发送同步回本地方案

一、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

#删除指定目录中大于指定时间的.tar.gz文件(用以删除上次打包的备份)
find /root/Vault*.tar.gz -mtime +$save_days -exec rm -rf {} \;

#构建数据库文件名称
d=`date "+%Y-%m-%d"`

#注意-c参数,到/mnt/bitwarden目录下打包data文件夹,并将打包的文件保存到/root/目录下
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"

#用自带的mail发邮件,需要配置/etc/mail.rc,在最后添加smtp信息,需要使用25端口
echo "$content" | mail -s "$title" -a /root/Vault_$d.tar.gz i@iyuren.com

#退出当前脚本
exit

注意: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