利用dropbox自动化备份mysql+wordpress
本文前提:你已经拥有shadowsocks翻墙工具,其次你的vps是墙外(GFW)节点。
首先,dropbox是外国的免费云盘,利用google帐号登录既可,网址:https://www.dropbox.com,需要下载安装客户端。
通常来说,你是无法登录和连接dropbox的,因为GFW进行了DNS和HTTP的双层管制,因此我们必须借助shadowsocks避开HTTP管制,借助dnscrypt避开DNS管制。
首先呢,MAC用户需要保证已经安装了工具brew,它是类似于yum/apt-get的包管理器,这可以访问http://brew.sh/index_zh-cn.html完成下载和安装。
其次,利用brew安装DNSCrypt工具(地址:https://dnscrypt.org/),它在本机启动dnsproxy进程,可以拦截本机53端口的DNS明文请求,通过SSL/TSL加密后转发给墙外(GFW)的opendns开放DNS服务获取真实安全的IP。
不过,我是安装的GUI版本的dnscrypt,地址:https://github.com/alterstep/dnscrypt-osxclient,因此你可以跳过brew的安装。
需要注意,dnscrypt对dns解析速度有较大影响,因为它连接的都是欧美的服务器,因此通常在不使用dropbox期间可以选择关闭它。
检查清单
我在安装dropbox和dnscrypt过程中,折腾了10分钟才最终连接上去,总结下来有这么几个检查点供大家自查:
- dropbox安装后需要挂接到shadowsocks代理上,默认shadowsocks只会修改chrome/safari的代理配置,因此我们需要点击dropbox小图标里的首选项,配置代理如下(照抄既可):
- 找到工具栏里的dnscrypt小图标,点击enable Dnscrypt开启DNS代理。
- 确保你的shadowsocks正常运行,自动代理模式既可。
- 如果dropbox仍旧无法登录,那么找到dropbox小图标退出,重新启动它即可进入帐号输入界面,不出意外你将完成登录。
折腾完成后,dropbox小图标里显示正常同步,在finder左侧可以看到一个挂载的dropbox网盘。
自动上传dropbox
我的目的是备份vps上的wordpress代码以及mysql数据库,所以我需要利用dropbox提供的编程SDK来实现上传功能。
我的vps安装的是centos7.0系统,dropbox的官方开发文档在这里:https://www.dropbox.com/developers,我将采用最熟悉的python SDK来实现,并利用linux crontab定时上传备份到dropbox。
让人庆幸的是,dropbox的python SDK提供了一个完整可用的demo来实现文件上传dropbox,简直不能更省心了,地址:https://github.com/dropbox/dropbox-sdk-python
- 首先登录我的vps,确保你安装了python 2.7+的版本,我这里是python 2.7.5。(全局类工具最好root安装)
12[root@vultr work]# python --versionPython 2.7.5 - 安装dropbox SDK
1[root@vultr work]# pip install dropbox - 申请dropbox开发token:https://www.dropbox.com/developers/apps,点击create app创建一个app,然后下方有一个generate按钮可以生成一个Token,它用于为我们后续的备份脚本做认证用途。
- 拷贝example中backup-and-restore-example.py到本机 ,将token填到TOKEN位置,BACKUPPATH是dropbox上的文件备份路径,LOCALFILE是本机要上传的文件路径;另外,注释掉文件下方的2个多余逻辑:
123456789101112131415161718192021222324252627if __name__ == '__main__':# Check for an access tokenif (len(TOKEN) == 0):sys.exit("ERROR: Looks like you didn't add your access token. Open up backup-and-restore-example.py in a text editor and paste in your token in line 14.")# Create an instance of a Dropbox class, which can make requests to the API.print("Creating a Dropbox object...")dbx = dropbox.Dropbox(TOKEN)# Check that the access token is validtry:dbx.users_get_current_account()except AuthError as err:sys.exit("ERROR: Invalid access token; try re-generating an access token from the app console on the web.")# Create a backup of the current settings filebackup()# Change the user's file, create another backup# change_local_file("updated")# backup()# Restore the local and Dropbox files to a certain revision# to_rev = select_revision()# restore(to_rev)print("Done!") - 现在python backup-and-restore-example.py 运行脚本,可以看到命令行成功打印done:
1234[work@vultr crontab]$ python backup.pyCreating a Dropbox object...Uploading /home/work/crontab/yuerblog.tar.gz to Dropbox as /yuerblog.tar.gz...Done!
与此同时,MAC上方的dropbox小图标提示有新的文件上传,大功告成。
定时备份
因为我要上传mysql和wordpress两个压缩文件,因此呢我还需要对之前的backup.py脚本稍作改造,让它从命令行读取要上传的文件名称。
这样,我就可以通过shell实现2个压缩文件的打包->上传工作了,脚本这样稍作改造既可:
1 2 |
BACKUPPATH = sys.argv[1] #mark LOCALFILE = os.path.split(os.path.realpath(sys.argv[0]))[0] + BACKUPPATH #mark |
然后编写一个shell脚本,先把我的wordpress上传上去再研究mysql好了,整个脚本和目录结构如下:
1 2 3 4 5 6 7 8 9 10 11 12 |
[work@vultr crontab]$ ll 总用量 44204 -rw-rw-r-- 1 work work 3830 11月 4 07:51 backup.py -rw-rw-r-- 1 work work 133 11月 4 07:52 backup.sh -rw-rw-r-- 1 work work 45253163 11月 4 07:52 wordpress.tar.gz [work@vultr crontab]$ cat backup.sh #!/bin/bash tar czvf /home/work/crontab/wordpress.tar.gz /home/work/wordpress python /home/work/crontab/backup.py /wordpress.tar.gz [work@vultr crontab]$ pwd /home/work/crontab |
在任意目录运行sh backup.sh,就可以完成wordpress打包压缩+上传啦~~~~
现在,执行crontab -e,添加一个每天凌晨00:05分执行的定时任务,让它运行这个脚本既可:
1 |
5 0 * * * /bin/bash /home/work/crontab/backup.sh |
Mysql怎么备份
官方的Mysqldump是能支持在线热备的(不停读/写),但是在数据量较大情况下性能堪忧,因此更多的会使用免费的Xtrabackup来取代。
安装方法:
1 |
[root@vultr work]# yum install xtrabackup |
使用方法(一次性全量备份,我的wordpress数据库太小了):
1 2 |
innobackupex --slave-info --safe-slave-backup --no-timestamp --socket=/var/lib/mysql/mysql.sock --user=你的帐号 --password=你的密码 /home/work/crontab/mysqldump |
这样备份数据将进入mysqldump目录,这条命令需要访问mysql的一些文件,因此我用root才能正常执行。
现在,我将mysql备份命令加到之前的backup.sh脚本中:
1 2 3 4 5 6 7 8 9 10 11 12 |
[work@vultr crontab]$ cat backup.sh #!/bin/bash # 备份wordpress tar czvf /home/work/crontab/wordpress.tar.gz /home/work/wordpress python /home/work/crontab/backup.py /wordpress.tar.gz # 备份mysql rm -rf /home/work/crontab/mysqldump innobackupex --slave-info --safe-slave-backup --no-timestamp --socket=/var/lib/mysql/mysql.sock --user=你的帐号 --password=你的密码 /home/work/crontab/mysqldump tar czvf /home/work/crontab/mysqldump.tar.gz /home/work/crontab/mysqldump python /home/work/crontab/backup.py /mysqldump.tar.gz |
因为需要root用户执行mysql备份的原因,我干脆将之前work用户的crontab配置到root用户下好了。
其实vps平台也提供了虚拟机镜像备份服务:1美金/月,通过这么几步就可以省下8块钱,还能顺便了解点东西算是超值了!
如果文章帮助您解决了工作难题,您可以帮我点击屏幕上的任意广告,或者赞助少量费用来支持我的持续创作,谢谢~

1
1