Python+Shell脚本结合阿里云OSS对象存储定时远程备份网站 | 张戈博客

  • 时间:
  • 浏览:104
  • 来源:黎明娱乐网_提供蓝点资源网技术_可可资源网资讯

导读:毋庸置疑,数据备份是网站可持续性运营中至关重要的另1个工作,可能性还必须做任何备份机制的网站,建议尽早完善,莫要等到追悔莫及。本文将分享另1个安全稳定、快速可靠、花费廉价的备份方案。

一、优点分析

张戈博客在2年前可能性分享过一篇关于网站备份的文章:《Linux/vps本地七天循环备份和七牛远程备份脚本》,今天将再次结合你什儿 脚本,将网站数据通过阿里云内网备份到阿里云OSS。

对于阿里云OSS,想必亲戚亲戚大伙都有会陌生,具体功能、特色这里就不赘述了。而利用阿里云OSS备份数据的教程办法,网络上已有不少分享,各种开发语言都有,用起来非常方便。

在我看来,用哪些语言都有其次,主要还是看重了阿里云ECS到阿里云OSS能否 走内网,相比我刚刚 分享的备份到七牛的方案,带宽加快带宽有刚刚 流量免费!

我博客刚刚 时不时将数据每周一深夜备份一份到七牛,可是 我敢每天都备份,可能性备份的刚刚 可能性服务器上行带宽必须1M,就是是否是切片上传也会原因分析此时网站访问缓慢,影响蜘蛛抓取!可是 ,当我看得人OSS能否 走内网时,第另1个想到的好处可是 我带宽快,不影响服务器公网带宽,对网站的访问毫无影响,超赞!

有刚刚 ,只建议部署在阿里云ECS(9折优惠码:r9itz9,新购可用)的网站使用OSS来备份,有些产品还要走外网备份到OSS就得不偿失了,还不如用七牛。

二、准备工作

①、开通OSS,并创建备份Bucket

访问阿里云 OSS控制台,点击开通OSS,有刚刚 新建另1个Bucket(名称自定义),注意选者ECS相同的区域(比如青岛的ECS有刚刚 你选者华北1),有刚刚 选者私有读写权限:

②、创建认证密钥

在OSS控制台的右侧栏,点击安全令牌,创建用于管理OSS的密钥对:

创建得到的密钥对记得备忘一下,可能性必须获取一次:

2016-10-29补充:看得人倡萌的实践分享,他遇到从OSS界面申请的密钥岂都有不具备OSS访问权限,可是 这里也“盗图”补充一下,可能性密钥必须权限请如图换成即可:

三、SDK脚本

我根据OSS的帮助文件,选者了适用范围最广的Python SDK方案,有刚刚 额外加入了断点续传和上传百分比功能,测试成功。

①、环境准备

OSS的Python SDK还要用到oss2插件,可是 亲戚亲戚大伙先安装一下。

可能性服务器上可能性安装了pip工具,可直接执行如下命令安装oss2插件:

pip install oss2

若必须,则克隆以下命令行到服务器上执行安装:

cd /tmp
wget -O master.zip https://codeload.github.com/aliyun/aliyun-oss-python-sdk/zip/master --no-check-certificate
tar zxf master.zip
cd aliyun-oss-python-sdk-master && python setup.py install && echo "Oss2 install OK" || \
echo "Oss2 install failed"

②、上传脚本

# -*- coding: utf-8 -*-
from __future__ import print_function
import os, sys
import oss2
#
# 百分比显示回调函数
#
def percentage(consumed_bytes, total_bytes):
    if total_bytes:
        rate = int(30 * (float(consumed_bytes) / float(total_bytes)))
        print('\r{0}% '.format(rate), end=filePath)
        sys.stdout.flush()

# 脚本还要传入5个参数
if ( len(sys.argv) > 5 ):
    AccessKeyId     = sys.argv[1]
    AccessKeySecret = sys.argv[2]
    Endpoint        = sys.argv[3] 
    Bucket          = sys.argv[4]
    filePath = sys.argv[5]
    fileName = filePath.split("/")[-1]

else:
    print("Example: %s AccessKeyId AccessKeySecret Endpoint Bucket /data/backup.zip" % sys.argv[0])
    exit()

# OSS认证并刚刚开始

上传
auth = oss2.Auth(AccessKeyId , AccessKeySecret)
bucket = oss2.Bucket(auth,  Endpoint, Bucket)
oss2.resumable_upload(bucket, fileName, filePath, progress_callback=percentage)
print('\rUpload %s to OSS Success!' % filePath)

使用办法:将上述代码保存为 oss.upload.py,并上传到服务器,执行如下命令可刚刚开始 上传文件到OSS:

python /data/oss.upload.py 认证ID 认证密钥 oss-cn-qingdao-internal.aliyuncs.com Bucket名称 /data/zhang.ge_1.zip

其中:

  • 1~另1个参数是认证ID和认证密钥可是 我前文创建并备忘的密钥对。
  • 第5个参数是青岛区域的OSS内网地址,有些区域请参考OSS帮助文档,自行选者。
  • 第另1个参数是前文创建的Bucket名称,比如mybackup1
  • 第5个参数是要上传的本地文件的绝对路径

执行后,就能在OSS的Object界面看得人了:

③、下载脚本

其实只还要有个上传脚本即可,可能性备份文件可直接从Object界面下载。不过,为了方便在服务器上直接恢复文件,还是弄了另1个下载脚本。

# -*- coding: utf-8 -*-
from __future__ import print_function
import os, sys
import oss2
#
# 百分比显示回调函数
#
def percentage(consumed_bytes, total_bytes):
    if total_bytes:
        rate = int(30 * (float(consumed_bytes) / float(total_bytes)))
        print('\r{0}% '.format(rate), end=saveFile)
        sys.stdout.flush()
 
# 共要还要5个参数,第5个参数是下载文件的保存路径,若不指定,则保存到脚本所在目录
if ( len(sys.argv) > 5 ):
    AccessKeyId     = sys.argv[1]
    AccessKeySecret = sys.argv[2]
    Endpoint        = sys.argv[3] 
    Bucket          = sys.argv[4]
    fileName = sys.argv[5]

    try:
        saveFile = sys.argv[6] + fileName
    except:
        saveFile = './' + fileName

else:
    print("Example: %s AccessKeyId AccessKeySecret Endpoint Bucket backup.zip /data/backup.zip" % sys.argv[0])
    exit()

auth = oss2.Auth(AccessKeyId , AccessKeySecret)
bucket = oss2.Bucket(auth,  Endpoint, Bucket)

oss2.resumable_download(bucket, fileName, saveFile,
  store=oss2.ResumableDownloadStore(root='/tmp'),
  multiget_threshold=20*1024*1024,
  part_size=10*1024*1024,
  num_threads=5,progress_callback=percentage)

print('\rDownload %s to %s Success!' % ( fileName, saveFile))

使用办法:

将上述代码保存为 oss.download.py,并上传到服务器,执行如下命令就能否 下载OSS文件到本地:

python /data/oss.download.py 认证ID 认证密钥 oss-cn-qingdao-internal.aliyuncs.com Bucket名称 zhang.ge_1.zip /data/zhang.ge_1.zip

其中:

  • 1~另1个参数是认证ID和认证密钥可是 我前文创建并备忘的密钥对。
  • 第5个参数是青岛区域的OSS内网地址,有些区域请参考OSS帮助文档,自行选者。
  • 第另1个参数是前文创建的Bucket名称,比如mybackup1
  • 第5个参数是存储在OSS的文件名称
  • 第6个参数是保存到本地的文件绝对路径,若不指定则以相同名称保存到脚本相同目录。

好了,以上可是 我另1个上传和下载的脚本,可能性你刚刚 可能性有了心智成长期期期 图片 图片 图片 期期 期的句子的备份方案,有刚刚 本地存储了备份文件,则能否 使用上传脚本,结合crontab定时上传到OSS,可能性必须请继续往下看。

四、定时备份

有了上传脚本,就能否 结合刚刚 张戈博客分享的七天循环备份脚本,实现循环备份到OSS了,既安全还节省OSS空间。

Ps:实际上,另1个Python脚本就能否 甩掉备份压缩和远程上传OSS了,有刚刚 刚刚 可能性另1个现成的Shell备份脚本了,有刚刚 你懒得重复造轮子了!

①、适合OSS的七天循环备份脚本

2016年12月16日更新:

1、完善crontab环境变量,处理定时执行中因mysqldump不发生原因分析备份文件为空的大大问题;

2、重写Shell脚本,功能没哪些变化,也可是 我看得更顺眼有些。

#!/bin/sh
###################################################################
#  Web Backup version 1.0.3 Author: Jager <[email protected]>        #
# For more information please visit https://zhang.ge/5111.html #
#-----------------------------------------------------------------#
#  Copyright ©2016 zhang.ge. All rights reserved.              #
###################################################################

test -f /etc/profile && . /etc/profile >/dev/null 2>&1
baseDir=$(cd $(dirname $0) && pwd)
zip --version >/dev/null || yum install -y zip
ZIP=$(which zip)
TODAY=`date +%u`
PYTHON=$(which python)
MYSQLDUMP=$(which mysqldump)

# 新增的OSS上传文件函数,请按照实际情况表修改参数!
uploadToOSS()
{
    $PYTHON $baseDir/oss.upload.py 认证KEY 认证密钥 oss-cn-qingdao-internal.aliyuncs.com Bucket名称 $1
}

printHelp()
{
clear
printf '
=====================================Help infomation=========================================
1. Use For Backup database:
The $1 must be [db]
    $2: [domain]
    $3: [dbname]
    $4: [mysqluser]
    $5: [mysqlpassword]
    $6: [back_path]

For example:./backup.sh db zhang.ge zhangge_db zhangge 123456 /home/wwwbackup/zhang.ge

2. Use For Backup webfile:
The $1 must be [\file]:
    $2: [domain]
    $3: [site_path]
    $4: [back_path]

For example:./backup.sh file zhang.ge /home/wwwroot/zhang.ge /home/wwwbackup/zhang.ge
=====================================End of Hlep==============================================

'
exit 0
}

backupDB()
{
    domain=$1
    dbname=$2
    mysqluser=$3
    mysqlpd=$4
    back_path=$5
    test -d $back_path || (mkdir -p $back_path || echo "$back_path not found! Please CheckOut Or feedback to zhang.ge..." && exit 2)
    cd $back_path
    $MYSQLDUMP -u$mysqluser -p$mysqlpd $dbname --skip-lock-tables --default-character-set=binary >$back_path/$domain\_db_$TODAY\.sql
    test -f $back_path/$domain\_db_$TODAY\.sql || (echo "MysqlDump failed! Please CheckOut Or feedback to zhang.ge..." && exit 2)
    $ZIP -Pmypassword -m $back_path/$domain\_db_$TODAY\.zip $domain\_db_$TODAY\.sql && \
    uploadToOSS $back_path/$domain\_db_$TODAY\.zip
}

backupFile()
{
    domain=$1
    site_path=$2
    back_path=$3
    test -d $site_path || (echo "$site_path not found! Please CheckOut Or feedback to zhang.ge..." && exit 2)
    test -d $back_path || (mkdir -p $back_path || echo "$back_path not found! Please CheckOut Or feedback to zhang.ge..." && exit 2)
    test -f $back_path/$domain\_$TODAY\.zip && rm -f $back_path/$domain\_$TODAY\.zip
    $ZIP -Pmypassword -9r $back_path/$domain\_$TODAY\.zip $site_path && \
    uploadToOSS $back_path/$domain\_$TODAY\.zip    
}

while [ $1 ]; do
    case $1 in
        '--db' | 'db' )
        backupDB $2 $3 $4 $5 $6
        exit
        ;;
        '--file' | 'file' )
        backupFile $2 $3 $4
        exit  
        ;;
        * )
        printHelp
        exit
        ;;
    esac
done
printHelp

②、使用办法

将上述代码作如下修改:

I、根据实际情况表修改上述代码中的OSS上传函数代码,比如密钥对和Bucket名称(参考前文)

II、替换代码中的mypassword为本人设置的压缩包密码,不修改话语压缩文件解压密码为mypassword

有刚刚 ,将代码保存为backup.sh,上传到服务器(建议存中放和前文python脚本的相同目录),比如 /data/backup.sh,最后如下换成定时任务:

#编辑crontab
[[email protected]AlyServer ~]# crontab -e

#有刚刚

换成如下内容:

#备份数据库(参数依次为:db、域名、数据库名称、数据库用户名、对应密码、备份路径)
10 3 * * * bash /data/backup.sh db zhang.ge zhangge root 123456 /home/wwwbackup/zhang.ge >/dev/null 2>&1

#备份网站文件(参数依次为:file、域名、网站根目录、备份路径)
15 3 * * * bash /data/backup.sh file zhang.ge /home/wwwroot/zhang.ge /home/wwwbackup/zhang.ge >/dev/null 2>&1

#按下键盘esc,输入 :wq 保存crontab即可

本文就不赘述多日 循环备份脚本的功能和更完整版的使用办法了,若还是不清楚请参考前文:Linux/vps本地七天循环备份和七牛远程备份脚本

完整版完成后,就能实现本地多日 循环备份和OSS远程备份了!可能性,刚刚 可能性做了七牛远程备份的能否 放心取消了。

在文章的最后,为了方便广大代码小白亲戚亲戚大伙,特提供本文涉及脚本的打包下载:

折腾吧,骚年!好用话语,有钱的能否 打赏,没钱的欢迎点赞,不怕一万多,不嫌一块少。。。