呓语 | 杨英明的个人博客

专注于c++、Python,欢迎交流

By

搭建网站自动备份机制(crontab+mysqldump+tar+oss)

个人网站在云服务器上部署好了之后,为了防止数据丢失,我们往往需要定期的备份网站的数据。

每次手动去备份太麻烦,我们可以使用 Linux+Python 搭建一个 网站自动备份机制 来自动化、定时的去完成备份工作。

简单来说这个机制可以 定时备份网站数据,并自动将备份文件上传到云上

前言

首先我们要清楚需要备份的网站数据有哪些,对我自己的网站来说,主要是以下两个部分:

  • 网站项目源代码
  • mysql数据库中的数据

这两部分是动态变化的,特别是mysql数据库中的数据,几乎每天都会更新。

为了加强备份,我的 网站自动备份机制 主要完成两个功能:

  • 定时生成备份文件(.sql 和 .tar)
  • 将备份文件上传到OSS中

如此相当于有了双重保险,云服务器端和OSS都存有备份文件。

涉及到的工具主要有:

  • crontab:linux的计划任务功能,可以定时运行程序
  • mysqldump:mysql的备份工具
  • tar:linux的打包工具,用于备份项目源码
  • oss:阿里云的对象存储服务,相当于一个网盘

搭建步骤

下面开始搭建 网站自动备份机制

  • 在工作目录创建备份文件夹 Backup
mkdir Backup
  • 创建两个shell脚本文件:MingBlog_mysql_backup.shMingBlog_src_backup.sh(MingBlog是我的项目名)
    它们功能分别是:
    1.使用mysqldump创建mysql备份文件,并上传到oss中 2.使用tar打包当前项目源码,并上传到oss中 此时目录结构为:

  • 修改mysql配置文件 /etc/mysql/my.cnf,设置mysqldump的默认user和password,否则会提示“密码不能写在命令中”的warnning:
[mysqldump]
quick
quote-names
max_allowed_packet = 1G
user=your_mysql_user
password=your_mysql_password
  • 编写MingBlog_mysql_backup.shMingBlog_src_backup.sh shell代码(设置了my.cnf,sh中使用mysqldump时就不用user和password了):

MingBlog_mysql_backup.sh

#!/bin/sh
# Database info
DBNAME="blog"
BINDIR="/usr/bin"
BCKDIR="/root/workspace/Backup/MingBlog_mysql_backup"
DATE=`date +%Y%m%d_%H%M%S`
FILENAME=mysql_${DBNAME}_bak.$DATE.sql.gz
FILEPATH=$BCKDIR/$FILENAME
# TODO
$BINDIR/mysqldump $DBNAME | gzip > $FILEPATH
/usr/local/sbin/put_oss_backup $FILEPATH Backup/MingBlog_mysql_backup/$FILENAME

MingBlog_src_backup.sh

#!/bin/sh
PRONAME="MingBlog"
PROPATH="/root/workspace/MingBlog"
DATE=`date +%Y%m%d_%H%M%S`
FILENAME=${PRONAME}_bak.$DATE.tar
FILEPATH=/root/workspace/Backup/MingBlog_src_backup/$FILENAME
# TODO
tar czvf $FILEPATH $PROPATH
/usr/local/sbin/put_oss_backup $FILEPATH Backup/MingBlog_src_backup/$FILENAME
  • 创建oss上传脚本 put_oss_backup.py ,编写代码:
#!/usr/bin/python
#coding=utf8
# linux环境oss上传程序
from __future__ import print_function
import oss2
import sys,os

def percentage(consumed_bytes, total_bytes):
    if total_bytes:
        rate = int(100 * (float(consumed_bytes) / float(total_bytes)))
        print('\r{0}% '.format(rate), end='')
        sys.stdout.flush()

def upload(topath,filedata):
    auth = oss2.Auth('your_access_id', 'your_access_key')
    bucket = oss2.Bucket(auth, 'your_endpoint', 'your_bucket_name')
    bucket.put_object(topath, filedata, progress_callback=percentage)


def start(filename,topath):
    curdir_list = os.listdir('.')
    print('\033[1;36;40m',end='')
    print('start uploading [%s]......'%filename)
    print('\033[0m',end='')
    try:
        # 上传文件在当前目录下
        fp = open(filename,'r')
        data = fp.read()
        fp.close()
        upload(topath,data)
        print('\033[0;32;40m',end='')
        print('Upload success.')
        print('\033[0m',end='')
    except Exception,e:
        raise Exception,'%s is not in the current directory,can\'t upload.'%filename

if __name__=='__main__':
    # 获取下载列表
    if len(sys.argv)==1:
        files = raw_input('Please input upload filename : ')
        files = files.strip().split()
    elif len(sys.argv)>=2:
        files = sys.argv[1:]
        filename = files[0]
        topath = files[1]

        print('\033[1;36;40m',end='')
        print ("[1]",end=' ')
        print('\033[0m',end='')
        try:
            start(filename,topath)
        except Exception,e:
            print('\033[0;31;40m',end='')
            print('Upload failed.')
            print('[ERROR]:%s'%e)
            print('\033[0m',end='')

代码写完之后,我们运行cp put_oss_backup.py /usr/local/sbin/put_oss_backup将脚本安装到默认搜索路径下,这样不管在什么目录下都可以运行该脚本。

同时,进入阿里云的OSS后台,创建 Backup 一级目录,并在其中创建两个二级目录 MingBlog_mysql_backupMingBlog_src_backup,分别放置mysql和项目源码的备份文件。

  • 使用crontab设置定时任务,运行crontab -e添加新任务:
0    3 * * *    ~/workspace/Backup/MingBlog_mysql_backup.sh >/dev/null 2>&1
0    4 * * *    ~/workspace/Backup/MingBlog_src_backup.sh >/dev/null 2>&1

好了,到这里整个 网站自动备份机制 已经基本上搭建完成,以上操作主要写了三个脚本,互相搭配使用,它们之间的逻辑关系为:

crontab每天凌晨3点和4点定时执行两个shell脚本,MingBlog_mysql_backup.sh 备份mysql数据并上传到oss,MingBlog_src_backup.sh 打包项目源码并上传到oss。两个sh脚本都使用了 put_oss_backup.py 上传文件到oss。

使用截图

运行MingBlog_mysql_backup.sh

运行MingBlog_src_backup.sh

运行备份脚本之后的目录结构

阿里云OSS后台

mysql备份

项目源码备份

后记

当然网站备份的方式有很多,在这里我只利用手头的工具定期备份了网站的数据库和源码,还有很多可以改进的地方,比如将备份方式改成增量备份,可以节省很多空间。不过对我来说,目前够用就可以。

原创声明

转载请注明:呓语 » 搭建网站自动备份机制(crontab+mysqldump+tar+oss)