shell脚本:定时备份你的网站、数据库到OSS

作者环境CentOS 7,其他Linux系统可能需要微调

blog已经迁移到新的杭州机房了,从宝塔面板换成了docker(啊,调了一晚上nginx的我太难了)

迁移之后首要的就是写一个自动备份的脚本啦,数据是最重要的嘛。

这里分享一下刚写的备份shell(今天刚学的,写的菜别喷我哈哈哈),我把整个备份流程分成:压缩网站、压缩数据库、上传OSS&清理压缩包。

准备工作

首先创建一个可执行脚本backup.sh,之后给backup.sh增加可执行权限

1
chmod u+x cron.sh

同时导出数据库用的是mysqldump,需要先装一下工具。

1
2
# 安装
yum install mysql -y

定义配置

先在backup.sh里定义一些配置项,可以参照本小节末尾的说明理解。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#!/bin/bash

web_folder="/mnt/www/" #网站群根目录
backup_folder="/mnt/backup/" #临时存储的目录
backup_db=('db1') #需要备份的数据库

mysql_host='127.0.0.1'
mysql_port='3306'
mysql_user='root'
mysql_pass='123456'

oss_endpoint='oss-cn-city-internal.aliyuncs.com'
oss_access_key='LT**********************'
oss_access_key_secret='******************************'
oss_folder='oss://backup-foo/backup/'

# 备份目录不存在则创建
if [ ! -d $backup_folder ];
then
mkdir $backup_folder
fi
  • web_folder

有多个站点时,只需要配置存放网站的根目录地址即可(绝对路径)

1
2
3
# 下列情况时,只需要填写 /mnt/www/ 即可
/mnt/www/site1
/mnt/www/site2
  • backup_folder

临时存放备份压缩包的根目录(绝对路径)

  • backup_db

需要备份的数据库

因为找不到mysqldump如何遍历数据库的命令,就只能在这里填写数据库名称了
注意shell的数组是空格分隔,如 backup_db=(‘db1’ ‘db2’)

  • mysql_host、mysql_port、mysql_user、mysql_pass

mysql的连接信息

  • oss_endpoint

阿里云节点域名,推荐使用同城内网的oss域名地址,会比外网上传快超级多。

如何查看:点击 对象存储-Bucket名称-概述,就能看到对应的三个end-point地址

  • oss_access_key、oss_access_key_secret

OSS子账号的key和secret。在RAM中创建

  • oss_folder

对应OSS的目录地址,比如我的Bucket名称为backup-foo,那么我的OSS地址就是oss://backup-foo/

如果我想让备份文件存入bar文件夹里,则地址就是oss://backup-foo/bar/

压缩网站

这一步把网站目录压缩成网站目录名_yyyymmdd_HHMMSS.tar.gz,放到临时存储目录中

1
2
3
4
5
6
7
8
# 遍历网站目录
for file in `ls -F $web_folder`
do
str_length=${#file}-1
backFile=$backup_folder${file:0:str_length}'_'$(date +"%Y%m%d_%H%M%S")'.tar.gz'
tar_folder=$web_folder$file
tar -cvf $backFile $tar_folder
done

如果$web_folder内有不希望被打包的目录,可以在do中添加判断

1
2
3
4
5
6
7
8
9
10
11
12
13
# 遍历网站目录
for file in `ls -F $web_folder`
do
# 不备份localhost目录
if [ $file == 'localhost/' ];
then
continue
fi
str_length=${#file}-1
backFile=$backup_folder${file:0:str_length}'_'$(date +"%Y%m%d_%H%M%S")'.tar.gz'
tar_folder=$web_folder$file
tar -cvf $backFile $tar_folder
done

压缩数据库

这一步把数据库压缩成数据库名_mysql_yyyymmdd_HHMMSS.sql.gz,放到临时存储目录中

1
2
3
4
5
for db in $backup_db
do
backFile=$backup_folder$db'_mysql_'$(date +"%Y%m%d_%H%M%S")'.sql.gz'
mysqldump -h$mysql_host -u$mysql_user -P$mysql_port -p$mysql_pass $db | gzip > $backFile
done

上传OSS&清理压缩包

1
2
3
4
5
6
7
8
9
10
11
12
13
#如果当前目录下不存在oss上传工具,则下载
if [ ! -e 'ossutil64' ];
then
wget https://gosspublic.alicdn.com/ossutil/1.7.1/ossutil64 && chmod 755 ossutil64 && ./ossutil64 config -e $oss_endpoint -i $oss_access_key -k $oss_access_key_secret -L CH --config-file ./config
fi

# 开始遍历上传
for file in `ls $backup_folder`
do
./ossutil64 cp $backup_folder$file $oss_folder$file --config-file ./config
rm $backup_folder$file
done
echo "备份成功"

完整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
54
55
56
#!/bin/bash

web_folder="/mnt/www/" #网站群根目录
backup_folder="/mnt/backup/" #临时存储的目录
backup_db=('db1') #需要备份的数据库

mysql_host='127.0.0.1'
mysql_port='3306'
mysql_user='root'
mysql_pass='123456'

oss_endpoint='oss-cn-city-internal.aliyuncs.com'
oss_access_key='LT**********************'
oss_access_key_secret='******************************'
oss_folder='oss://backup-foo/backup/'

# 备份目录不存在则创建
if [ ! -d $backup_folder ];
then
mkdir $backup_folder
fi

# 遍历网站目录
for file in `ls -F $web_folder`
do
# 不备份localhost目录
if [ $file == 'localhost/' ];
then
continue
fi
str_length=${#file}-1
backFile=$backup_folder${file:0:str_length}'_'$(date +"%Y%m%d_%H%M%S")'.tar.gz'
tar_folder=$web_folder$file
tar -cvf $backFile $tar_folder
done

# 压缩数据库
for db in $backup_db
do
backFile=$backup_folder$db'_mysql_'$(date +"%Y%m%d_%H%M%S")'.sql.gz'
mysqldump -h$mysql_host -u$mysql_user -P$mysql_port -p$mysql_pass $db | gzip > $backFile
done

#如果当前目录下不存在oss上传工具,则下载
if [ ! -e 'ossutil64' ];
then
wget https://gosspublic.alicdn.com/ossutil/1.7.1/ossutil64 && chmod 755 ossutil64 && ./ossutil64 config -e $oss_endpoint -i $oss_access_key -k $oss_access_key_secret -L CH --config-file ./config
fi

# 开始遍历上传
for file in `ls $backup_folder`
do
./ossutil64 cp $backup_folder$file $oss_folder$file --config-file ./config
rm $backup_folder$file
done
echo "备份成功"

上号测试,成功把备份上传到了OSS、清理了临时目录的压缩包,开始添加定时任务。

添加定时任务

我设置为每天早上3点备份,输入以下内容

1
2
3
4
5
6
7
# 创建
[root@localhost ~] crontab -e
# 输入任务内容
0 3 * * * /xxx/backup.sh
# 保存后 查看任务是否创建
[root@localhost ~] crontab -l
0 3 * * * /xxx/backup.sh #出现这样的记录就表示任务创建成功了

如果想设置其他时间/频率可以参考这篇文章:如何在Linux中加入cron任务


评论区