一 场景分析

这个应用场景是很多小企业或者个人开发者建站后,为保证数据安全,通常都会定时备份我们线上平台的重要数据,但是这个数据备份了后会越来越多,在有限的ECS存储空间中用这种备份文件来消耗是在是有些浪费,所以建议是直接将备份好的文件上传到OSS存储,OSS的单价相对ECS上硬盘的单价要便宜。

二 实施步骤

1 环境介绍

在聊实施步骤之前我们先来看看我的应用环境:

  • 所在平台:Aliyun ECS 云服务器,CentOS 7.5 。只有40GB的硬盘,空间非常局限
  • 所安装的MYSQL 5.7,是直接建在阿里云的ECS上
  • 云端存储采用阿里云OSS,直接买40GB一年的存储包,9元钱。但是需要注意因为只买了存储包,在使用中还要注意会产生流量,具体收费已阿里云平台为主。
  • 使用到的工具有 MYSQL client端、linux压缩工具gzip、阿里云OSS命令行工具Ossutil

2 操作步骤

2.1 本地备份mysql数据库

本地备份mysql数据库是非常简单的mysql命令,随便百度一大把教程,我就不多说了直接上代码:

mysqldump -u root -p123456 sys > /data/mysqlbackup/sys.sql

mysqldump是mysql备份命令;
-u表示指定用户名,如:-uscott 表示指定用户名为scott,当然mysql没有scott用户,scott是Oracle的用户;
-p表示指定密码,如-p123456,表示该用户的密码为123456;
sys表示的是数据库名称,这里使用的是users数据库,如果要备份其他数据库请将sys换成对应名称即可;
> /data/mysqlbackup/sys.sql 表示指定将备份文件存放在/data/mysqlbackup/文件夹内,命名为sys.sql
如图:

mysql 备份 压缩命令
mysql 备份 压缩命令

一般情况备份后产生的

.sql

文件比较大,占用空间多,所以建议进行压缩,方便传输,下面介绍试一下使用的压缩命令和解压缩命令:

gzip sys.sql        # 压缩sys.sql 文件为.gz 格式
gunzip zxvf sys.sql.gz # 解压缩 sys.sql.gz

从上图中可以看出在sys.sql文件没有压缩之前有276K,在使用gzip压缩后生成的.gz压缩文件只有21K;

2.2 使用shell脚本实现mysql备份

shell 脚本是在linux 上强大的执行语言,我们要将刚刚在上面执行的备份语句、压缩语句 形成一个shell脚本,执行xxx.sh即可把备份、压缩自动执行完成;
下面贴出我自己写的执行脚本如下:

#!/bin/bash

#备份保存路径
backup_dir=~/Downloads/mysqlbackup/
#日期
dd=`date +%Y-%m-%d-%H-%M-%S`
#备份工具
tool=mysqldump
# 主机
host=127.0.0.1
#用户名
username=root
#密码
password=root
#需要备份的数据库
database_name=sys

#判断文件夹不存在则创建
if [ ! -d $backup_dir ]; 
then     
    mkdir -p $backup_dir; 
fi
#将备份文件压缩  mysqldump -uroot -proot sys | gzip > ~/Downloads/mysqlbackup/sys-$filename.sql
$tool -h$host -u$username -p$password $database_name | gzip > $backup_dir/$database_name-$dd.sql.gz

echo "文件备份 $backup_dir/$database_name-$dd.sql.gz 成功!!!"
#将备份日志写入log文件
echo "create $backup_dir/$database_name-$dd.dump " >> $backup_dir/$database_name.log
echo "$backup_dir/$database_name-$dd.sql.gz 已将该次操作日志记录到$database_name.log文件!!!"

将以上脚本内容创建到.sh文件中,如我创建在mysqldump.sh 文件中,由于权限问题,该脚本不具有执行权限,所以还需要先改权限:

sudo chmod 755 mysqldump.sh

如下图修改文件权限效果:


调整完该文件权限后开始执行该脚本:

./mysqldump.sh

执行完成后查看是否已生成对应的文件,然后解压后使用mysql的source命令导入数据库验证是否正常:


查看上传我执行的情况可以看出数据库sys已备份成功,并且解压后能倒入mysql数据库(这步就不演示了),查看sys.log可以看出日志已记录成功!如图:


接下来我们介绍一下ossutil工具。

2.3 将本地文件上传到oss

ossutil工具的详细介绍直接去找马爸爸,我给你们电话,哦不给你们地址:ossutil详细介绍请点此
介绍一下安装ossutil,从官网文档中介绍了如何安装试用oss,这里我简单介绍一下:

第一步:下载ossutil
下载ossutil,使用:

curl -o ossutilmac64 http://gosspublic.alicdn.com/ossutil/1.6.6/ossutilmac64  # 不同平台对应不同的下载方式,请自行查看官网文档

我这是将文档下载到/tmp 文件夹中并修改文件名称为ossutil,如下图:


下载完成后需要修改文件为可以执行权限,并

创建软连接到/usr/local/bin目录

中,以方便在命令行能直接只用ossutil命令:

sudo chmod 755 ossutil 

第二步:配置ossutil
配置ossutil,在官方文档中有详细介绍,如下操作:

./ossutil64 config
该命令将创建一个配置文件,在其中存储配置信息。 请输入配置文件路径(默认为:/home/user/.ossutilconfig,回车将使用默认路径。如果用户设置为其它路径,在使用命令时需要将--config-file选项设置为该路径): 
未输入配置文件路径,将使用默认配置文件:/home/user/.ossutilconfig。 
对于下述配置,回车将跳过相关配置项的设置,配置项的具体含义,请使用"help config"命令查看。 
请输入endpoint:http://oss-cn-shenzhen.aliyuncs.com 
请输入accessKeyID:yourAccessKeyID 
请输入accessKeySecret:yourAccessKeySecret
请输入stsToken: 
  • endpoint:填写Bucket所在地域的域名信息,可参考访问域名和数据中心。
  • accessKeyID:查看方式请参考创建AccessKey。
  • accessKeySecret:查看方式请参考创建AccessKey。
  • stsToken:非必配项,若采用STS临时授权方式访问OSS需要配置该项,否则置空即可。stsToken生成方式参考临时访问凭证。

个人建议不要修改.ossutilconfig文件的存储路径!
配置完成后尝试使用cp命令推送一张图片到oss中,关于cp命令请查看官方文档

ossutil cp ~/Downloads/mysqlbackup/sys.log oss://hyooss/test/      # 将~/Downloads/mysqlbackup目录下的sys.log文件上传到oss的Bucket为 hyooss的test文件夹下

对应oss中的文件如图:


第三步:删除oss上的指定文件
说的再多都没用,因为现在的年轻人都没啥耐心!🔥

ossutil rm  oss://hyooss/test/sys.log 

rm命令的详细操作建议想了解更多的同学

上官网去了解

,这就不多介绍了!

以上三步就基本满足今天咱们要用的内容了,要了解更多建议上阿里云官网了解ossutil官方文档!

2.4 使用shell将已备份的mysql文件上传到oss,删除oss上的制定文件

结合2.2中介绍的使用shell脚本备份压缩mysql脚本,现在我们也创建一个备份上传到oss的脚本。
首先创建一个.sh文件用于将shell命令整理好;
其次将ossutil的cp操作命令写入.sh文件后将文件改为可执行文件;
第三执行该.sh文件,查看执行效果,检查oss上是否已有上传的文件;
第四在该.sh文件中加入删除云端oss上指定文件的命令,执行该.sh脚本,查看执行效果。
完事(so easy 🥰)!!!

三 经验总结与效果展示

建议大家手动的将第二大点中的内容整理后形成一个完成的.sh文件,实现一键上传的功能,我这不建议直接把源码贴出来,毕竟希望大家能自己学习总结,如果有同学需要看完成的.sh文件内容,请直接发邮件到我邮箱,我将会吧该.sh文件回复给各位需要的朋友👬!
好吧,下面直接看看我这边执行完整脚本的情况:

加料区:
通常在我们写好sh脚本后都会在linux建立定时任务,定时执行该备份文件,如下图查看我的linux上已有的定时任务:


要增加定时任务直接使用

crontab —e

,在该界面加入要定时执行的命令即可~