脚本编程

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

导读:毋庸置疑,数据备份是网站可持续性运营中至关重要的一个工作,如果还没有做任何备份机制的网站,建议尽早完善,莫要等到追悔莫及。本文将分享一个安全稳定、快速可靠、花费廉价的备份方案。 一、优点分析 张戈博客在2年前已经分享过一篇关于网站备份的文章:《Linux/vps本地七天循环备份和七牛远程备份脚本》,今天将再次结合这个脚本,将网站数据通过阿里云内网备份到阿里云OSS。 对于阿里云OSS,想必大家都不会陌生,具体功能、特色这里就不赘述了。而利用阿里云OSS备份数据的教程方法,网络上已有不少分享,各种开发语言都有,用起来非常方便。 在我看来,用什么语言都是其次,主要还是看重了阿里云ECS到阿里云OSS可以走内网,相比我之前分享的备份到七牛的方案,速度更快而且流量免费! 我博客之前一直将数据每周一凌晨备份一份到七牛,也不敢每天都备份,因为备份的时候由于服务器上行带宽只有1M,就算是切片上传也会导致此时网站访问缓慢,影响蜘蛛抓取!所以,当我看到OSS可以走内网时,第一个想到的好处就是速度快,不影响服务器公网带宽,对网站的访问毫无影响,超赞! 因此,只建议部署在阿里云ECS(9折优惠码:r9itz9,新购可用)的网站使用OSS来备份,其他产品还要走外网备份到OSS就得不偿失了,还不如用七牛。 二、准备工作 ①、开通OSS,并创建备份Bucket 访问阿里云 OSS控制台,点击开通OSS,然后新建一个Bucket(名称自定义),注意选择ECS相同的区域(比如青岛的ECS我就选择华北1),并且选择私有读写权限: ②、创建认证密钥 在OSS控制台的右侧栏,点击安全令牌,创建用于管理OSS的密钥对: 创建得到的密钥对记得备忘一下,因为只能获取一次: 2016-10-29补充:看到倡萌的实践分享,他遇到从OSS界面申请的密钥居然不具备OSS访问权限,所以这里也“盗图”补充一下,如果密钥没有权限请如图添加即可: 三、SDK脚本 我根据OSS的帮助文件,选择了适用范围最广的Python SDK方案,并且额外加入了断点续传和上传百分比功能,测试成功。 ①、环境准备 OSS的Python SDK需要用到oss2插件,所以我们先安装一下。 如果服务器上已经安装了pip工具,可直接执行如下命令安装oss2插件: 若没有,则复制以下命令行到服务器上执行安装: ②、上传脚本 使用方法:将上述代码保存为 oss.upload.py,并上传到服务器,执行如下命令可开始上传文件到OSS: 其中: 1~2个参数是认证ID和认证密钥就是前文创建并备忘的密钥对。 第3个参数是青岛区域的OSS内网地址,其他区域请参考OSS帮助文档,自行选择。 第4个参数是前文创建的Bucket名称,比如mybackup1 第5个参数是要上传的本地文件的绝对路径 执行后,就能在OSS的Object界面看到了: ③、下载脚本 其实只需要有个上传脚本即可,因为备份文件可直接从Object界面下载。不过,为了方便在服务器上直接恢复文件,还是弄了一个下载脚本。 使用方法: 将上述代码保存为 oss.download.py,并上传到服务器,执行如下命令就可以下载OSS文件到本地: 其中: 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脚本,功能没什么变化,也就是看得更顺眼一些。 ②、使用方法 将上述代码作如下修改: I、根据实际情况修改上述代码中的OSS上传函数代码,比如密钥对和Bucket名称(参考前文) II、替换代码中的mypassword为自己设置的压缩包密码,不修改的话压缩文件解压密码为mypassword 然后,将代码保存为backup.sh,上传到服务器(建议存放到和前文python脚本的相同目录),比如 /data/backup.sh,最后如下添加定时任务: 本文就不赘述7天循环备份脚本的功能和更详细的使用方法了,若还是不清楚请参考前文:Linux/vps本地七天循环备份和七牛远程备份脚本 全部完成后,就能实现本地7天循环备份和OSS远程备份了!如果,之前已经做了七牛远程备份的可以放心取消了。 在文章的最后,为了方便广大代码小白朋友,特提供本文涉及脚本的打包下载: 折腾吧,骚年!好用的话,有钱的可以打赏,没钱的欢迎点赞,不怕一万多,不嫌一块少。。。
阅读全文
操作系统

Linux系统crontab备份数据库执行不成功?可能是百分号%在作怪!

之前博客分享过一篇《Linux/vps本地七天循环备份和七牛远程备份脚本》,我自己也一直在用。某天检查备份的时候,突然发现数据库的备份的压缩包是空的! 看了下crontab的日志,发现有如下错误: Access denied for user 'dbuser'@'localhost' to database 'db' when using LOCK TABLES 原来,我在计划任务中备份数据库时,用的是普通用户,在凌晨三点备份的时候,可能碰巧网站正在被访问(比如蜘蛛抓取)。由于存在数据查询,所以mysqldump将默认执行锁表机制。 由于普通用户没有锁表权限,从而导致此次备份失败! 我立马更新了该文章,补充了出现这种情况的解决办法: 解决办法: 方法①、修改上面的备份脚本,找到如下行 添加--skip-lock-tables参数即可,即不锁表导出(可能丢失某些正在更新的数据,当然凌晨时候几率很小)。 方法②、使用root帐号执行备份即可: 执行crontab -e 修改Linux计划任务,修改数据库备份计划命令行中的用户名为mysql的root帐号: 个人推荐方法②,最大限度的保证了数据备份的完整度! 我自己用的就是第②种方法,使用mysql的root帐号来备份,我自以为是的以为应该是万无一失的! 今天再次检查备份的时候发现,数据库仍然没有备份!空的压缩包都不存在了! 可是手动执行crontab里面的数据库备份语句又是可以的,真是诡异!! 于是开始debug,设置断点、使用绝对路径,各种方法用尽了,居然还是不行,不过发现当我将数据库备份代码写到另外一个脚本,然后将这个脚本加入到crontab的时候却可以了???这是为毛? 脚本所用的备份代码是: 于是,我修改backup.sh脚本,将里面的$1~$6都输出到日志中,结果让我发现了问题所在!!! 原来问题出在脚本参数上:我的mysql的root密码中含有一个百分号%,直接将上面的代码写到crontab中,这个百分号却无法传递,所以脚本取得的密码就是错误的!从而,备份失败! 经过查询,发现百分号%是crontab中的一个特殊符号!不能直接作为参数传递!!! 解决办法很简单,使用反斜杠\转义即可:\%,假如我的密码是 123456%,那之前脚本的crontab备份代码应该是: 还是经验不足啊!我也确实没在crontab中使用过百分号字眼,这次算是涨姿势了!
阅读全文
脚本编程

Linux/vps本地七天循环备份和七牛远程备份脚本

博客前些时间分享过一次vps远程备份到七牛的工具,全傻瓜式交互操作,但也有一个很大的缺憾,那就是不够灵活,在无人干预的情况下,无法完成对多个站点的远程备份设置。 这次博客搬家到vps后,张戈花了点时间完善了下,实现了多站点,多数据库的本地七天循环备份和同步备份至七牛云存储的脚本。 一、类型说明 ①、七天循环备份 受服务器空间制约,我们不可能在VPS上每天都备份一份新的网站数据,一是没必要,二是占空间。我们折中一下,采用星期命名,每次备份将覆盖上星期同一天的文件。从而只备份7份数据,不至于占用特别大的空间。 如果,你的vps很小家子气或是网站数据太庞大,那还可以再折中一下,仅在星期二、四、六做备份,即总共三份数据。甚至还可以选一个星期的某一天做备份,即一周备份一次,也是可以的。 在空间允许的情况下,个人推荐做7天循环备份,在vps数据全部丢失的时候,能最大程度的容灾,恢复到丢失前一天,甚至是当天凌晨备份的所有数据,非常完美! ②、七牛远程备份 七牛远程备份就是将本地的7天备份的数据每天同步至七牛云存储私人空间,就算整台vps奔溃时,还能从容的恢复数据。相当于双保险,要知道七牛和你的vps同时宕机的几率是非常小的。 二、准备工作 ①、整理vps已有网站对应的数据库用户名和密码(如不清楚可直接用mysql的root帐号); ②、整理vps已有网站的根目录所在路径,比如 /home/wwwroot/zhang.ge ③、想好本地想要存放备份文件的路径,比如/home/wwwbackup ④、还没有七牛帐号的,点此注册一个,然后新建一个私人空间(为了数据安全,请勿使用公开空间,仅恢复数据时临时切换到公开状态即可),记录空间名以及帐号密钥: 三、本地七天备份 ①、登录VPS编写脚本 脚本代码如下: 使用说明: ②、将代码中的2处 mypassword 改成你自定义的压缩密码(确保数据安全),并保存为backup.sh之后,执行chmod +x backup.sh 赋执行权限。 为了避免复制转码问题,下文已打包分享 Ps:下载的代码包没有加密打包,请自行参考上述代码,自行加上【-P密码】参数。 ③、执行./backup.sh --help 可获得如下帮助说明: ④、备份数据库: 命令行示例如下: 命令参数说明: 参数1:db,设置备份类型为数据库 参数2:domain 网站域名,如zhang.ge,用于备份文件命名 参数3:dbname  要备份的数据库名次,如zhangge_db 参数4:mysqluser  mysql用户名,如不清楚可用mysql 的root帐号 参数5:mysqlpassword  mysql密码 参数6:back_path  备份文件存放路径 ⑤ 备份网站文件: 命令行示例: 命令参数说明: 参数1:file,设置备份类型为网站文件 参数2:domain 网站域名,如zgboke.com,同样用于备份文件的命名 参数3:site_path 网站文件的路径,如/home/wwwroot/zgboke.com 参数4:back_path 备份文件存放路径 Tips:为了方便后面的七牛同步,建议将备份文件存放到同一个上级目录,然后以网站域名来命名当前目录,比如,同一个vps的备份数据,我都放到/home/wwwbackup/,然后以各自的网站域名来命名,zhang.ge的数据库和文件我都统一存放到/home/wwwbackup/zhang.ge。 最新补充:2014/10/25日,手动执行命令检查时,发现报如下错误信息: Access denied for user 'dbuser'@'localhost' to database 'db' when using LOCK TABLES 即提示该用户不具备锁表权限,导致数据导出失败!这种情况一般发生在数据库正在执行某个查询动作,此时普通帐号是无法导出备份的! 解决办法: 方法①、修改上面的备份脚本,找到如下行 添加--skip-lock-tables参数即可,即不锁表导出(可能丢失某些正在更新的数据,当然凌晨时候几率很小)。 方法②、使用root帐号执行备份即可: 执行crontab -e 修改Linux计划任务,修改数据库备份计划命令行中的用户名为mysql的root帐号: 个人推荐方法②,最大限度的保证了数据备份的完整度! ⑥、建立七天备份的任务计划 I. 先执行crontab -l 看看命令是否存在,若不存在,请使用  yum -y install vixie-cron crontabs 安装crond II. 确认crond已存在后,请执行/etc/init.d/crond start 确保启动了crond服务,并执行chkconfig crond on设置为开机启动。 III. 执行crontab -e 建立任务计划,如下是我的vps的任务计划,请参考添加: 每个网站2行,第一行备份数据库,第二行备份网站文件。 crontab参数格式为 {分 时...
阅读全文