专注网络安全|安全运维|建站技术|黑客教程|资源分享等综合站长学习平台
老龙博客

网站首页 脚本编程 正文

Python+Shell脚本结合阿里云OSS定时远程备份网站数据

老龙 2021-03-18 脚本编程 76 ℃ 0 评论

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

一、优点分析

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

在我看来,用什么语言都是其次,主要还是看重了阿里云ECS到阿里云OSS可以走内网,相比我之前分享的备份到七牛的方案,速度更快而且流量免费!

我博客之前一直将数据每周一凌晨备份一份到七牛,也不敢每天都备份,因为备份的时候由于服务器上行带宽只有1M,就算是切片上传也会导致此时网站访问缓慢,影响蜘蛛抓取!所以,当我看到OSS可以走内网时,第一个想到的好处就是速度快,不影响服务器公网带宽,对网站的访问毫无影响,超赞!

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

二、准备工作

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

访问阿里云 OSS控制台,点击开通OSS,然后新建一个Bucket(名称自定义),注意选择ECS相同的区域(比如青岛的ECS我就选择华北1),并且选择私有读写权限:Python+Shell脚本结合阿里云OSS对象存储定时远程备份网站

②、创建认证密钥

在OSS控制台的右侧栏,点击安全令牌,创建用于管理OSS的密钥对:Python+Shell脚本结合阿里云OSS对象存储定时远程备份网站

创建得到的密钥对记得备忘一下,因为只能获取一次:Python+Shell脚本结合阿里云OSS对象存储定时远程备份网站

2016-10-29补充:看到倡萌的实践分享,他遇到从OSS界面申请的密钥居然不具备OSS访问权限,所以这里也“盗图”补充一下,如果密钥没有权限请如图添加即可:Python+Shell脚本结合阿里云OSS对象存储定时远程备份网站

三、SDK脚本

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

①、环境准备

OSS的Python SDK需要用到oss2插件,所以我们先安装一下。

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

pip install oss2

若没有,则复制以下命令行到服务器上执行安装:

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

②、上传脚本

# -*- coding: utf-8 -*-from __future__ import print_functionimport os, sysimport oss2## 百分比显示回调函数#def percentage(consumed_bytes, total_bytes):if total_bytes:rate = int(100 * (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~2个参数是认证ID和认证密钥就是前文创建并备忘的密钥对。

  • 第3个参数是青岛区域的OSS内网地址,其他区域请参考OSS帮助文档,自行选择。

  • 第4个参数是前文创建的Bucket名称,比如mybackup1

  • 第5个参数是要上传的本地文件的绝对路径

执行后,就能在OSS的Object界面看到了:Python+Shell脚本结合阿里云OSS对象存储定时远程备份网站

③、下载脚本

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

# -*- coding: utf-8 -*-from __future__ import print_functionimport os, sysimport oss2## 百分比显示回调函数#def percentage(consumed_bytes, total_bytes):if total_bytes:rate = int(100 * (float(consumed_bytes) / float(total_bytes)))print('\r{0}% '.format(rate), end=saveFile)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]fileName = sys.argv[5]try:saveFile = sys.argv[6] + fileNameexcept:saveFile = './' + fileNameelse: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~2个参数是认证ID和认证密钥就是前文创建并备忘的密钥对。

  • 第3个参数是青岛区域的OSS内网地址,其他区域请参考OSS帮助文档,自行选择。

  • 第4个参数是前文创建的Bucket名称,比如mybackup1

  • 第5个参数是存储在OSS的文件名称

  • 第6个参数是保存到本地的文件绝对路径,若不指定则以相同名称保存到脚本相同目录。

好了,以上只是一个上传和下载的脚本,如果你之前已经有了成熟的备份方案,并且本地存储了备份文件,则可以使用上传脚本,结合crontab定时上传到OSS,如果没有请继续往下看。

四、定时备份

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

Ps:实际上,一个Python脚本就可以搞定备份压缩和远程上传OSS了,但是之前已经有一个现成的Shell备份脚本了,我就懒得重复造轮子了!

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

2016年12月16日更新:

1、完善crontab环境变量,解决定时执行中因mysqldump不存在导致备份文件为空的问题;

2、重写Shell脚本,功能没什么变化,也就是看得更顺眼一些。

#!/bin/sh####################################################################  Web Backup version 1.0.3 Author: Jager <im@zhang.ge>        ## 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>&1baseDir=$(cd $(dirname $0) && pwd)zip --version >/dev/null || yum install -y zipZIP=$(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(){clearprintf '=====================================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=$1dbname=$2mysqluser=$3mysqlpd=$4back_path=$5test -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\.sqltest -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=$1site_path=$2back_path=$3test -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 ]; docase $1 in'--db' | 'db' )backupDB $2 $3 $4 $5 $6exit;;'--file' | 'file' )backupFile $2 $3 $4exit  ;;* )printHelpexit;;esacdoneprintHelp

②、使用方法

将上述代码作如下修改:

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

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

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

#编辑crontab[root@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即可

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

全部完成后,就能实现本地7天循环备份和OSS远程备份了!如果,之前已经做了七牛远程备份的可以放心取消了。

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


Tags:阿里云OSS脚本代码Shell脚本

本文暂时没有评论,来添加一个吧(●'◡'●)

欢迎 发表评论:

搜索
最近发布
标签列表
站点信息
  • 文章总数:101
  • 页面总数:3
  • 分类总数:29
  • 标签总数:271
  • 评论总数:4
  • 浏览总数:5277