Python脚本实现自动将数据库备份到 Dropbox
作者:sexywp 发布时间:2024-01-20 09:56:45
最近,正好发生了一件大事,就是 GitLab 的运维同学不小心删除了生产的数据,虽然 GitLab 已经骇人听闻的准备了五种备份机制,但是,仍然导致他们丢失了将近 6 个小时的用户数据,尤其对他们声誉的损失,是根本无法估量的。反思一下,这个博客 Becomin' Charles,也是没有完善的备份的,真是冷汗直冒啊,主要考虑到这是我的个人博客,但是想想已经坚持了快十年了,如果真的丢了的话,还是非常痛心的。
正好,老婆最近正在学习Python 编程,我在教她,其实,我是PHP 程序员,一点也不喜欢 Python,但是说实在,一个外行学编程的话,Python 确实比PHP 友好太多了,只能推荐她学 Python 了。正好,借着这个机会,我决定自己也学学 Python 编程吧,于是,我决定要用 Python 做一个数据库的自动备份脚本。备份的位置,就用Dropbox 来做吧,因为我的服务器是 Linode 提供的,美国 fremont 机房,选择美国的存储服务,比较合适。以下是我写得代码,Python 小白,敬请指教:
#!/usr/bin/python
#coding:utf-8
import sys
import os
from yamlimport load
from datetime import datetime
import dropbox
from dropbox.filesimport WriteMode
from dropbox.exceptions import ApiError, AuthError
if len(sys.argv) < 2:
print >>sys.stderr, "Usage: %s <config_file>" % sys.argv[0]
sys.exit(0)
conf = load(file(sys.argv[1], 'r'))
# config file is a YAML looks like
# ---
# server-name: 127.0.0.1
# local-backup-path: /tmp
# remote-backup-path: /backup
# dropbox-token: jdkgjdkjg
# databases:
# - host: localhost
# port: 3306
# user: user
# pass: password
# name: database1
# charset: utf8
# - host: localhost
# port: 3306
# user: user2
# pass: password2
# name: database2
# charset: utf8
for dbin conf['databases'] :
filename = "%s_%s.sql" % (db['name'], datetime.now().strftime("%Y%m%d-%H-%M-%S"))
filepath = "%s/%s" % (conf['local-backup-path'], filename)
cmd = "mysqldump -h%s -u%s -p%s -P%s --single-transaction %s > %s" % (
db['host'],
db['user'],
db['pass'],
db['port'],
db['name'],
filepath
)
os.system(cmd)
cmd = "gzip %s" % filepath
os.system(cmd)
filepath = filepath + '.gz'
dbx = dropbox.Dropbox(conf['dropbox-token'])
backuppath = "%s/%s/%s/%s" % (
conf['remote-backup-path'], # remote path
datetime.now().strftime("%Y%m%d"), # date string
conf['server-name'], # server name
filename + '.gz')
with open(filepath, 'rb') as f:
time = datetime.now().strftime("%Y-%m-%d %H:%M:%S ")
print(time + "Uploading " + filepath + " to Dropbox as " + backuppath)
try:
dbx.files_upload(f.read(), backuppath, mode=WriteMode('overwrite'))
except ApiErroras err:
# This checks for the specific error where a user doesn't have
# enough Dropbox space quota to upload this file
if (err.error.is_path() and
err.error.get_path().error.is_insufficient_space()):
sys.exit("ERROR: Cannot back up; insufficient space.")
elif err.user_message_text:
print(err.user_message_text)
sys.exit()
else:
print(err)
sys.exit()
简单描述下这个代码的思路,这个程序应该满足这个几个要求:
使用 mysqldump 备份数据库到本地
应该支持配置文件,允许配置多个数据库
可以上传到 Dropbox
为了完成这些要求,首先碰到的难题是怎么支持配置文件,一搜,原来 Python 下有个默认的 ConfigParser,可以完成这个任务,但是正常东西比较恶心的是,配置文件必须是以 [Section] 为单位组织的。其实我的配置显然有些全局配置,还有就是数据库的各种信息是多次重复的,这种配置文件,嵌套能力简直糟糕,必须两层的结构,就很恶心。于是我去网上搜配置文件的格式,好多文章比较了各种配置文件的优劣,其实这文章挺多的,我想了想,以后或许我也可以写文章讲讲我自己的感受了。反正就是很多文章最后都公认 YAML 是配置文件里最完美的。于是我也决定用这个,果然也有现成的类库,就是 PyYAML,特方便,就俩函数 load 和 dump,直接就把文件变成 dict 格式了。
第二个难题,就是上传 Dropbox,后来发现,官方提供了很丰富的 API,而且直接就有 SDK,(让我眼红的是,官方竟然没有 PHP 的 SDK,这么不受待见么?),研究 SDK 用法,发现直接就有代码范例,于是直接抄到我的代码里,瞬间完成了 50% 的代码,爽!
整个代码完成后,我发现,写代码一共也没花多少时间,而且,我学会的 Python 的方式,我以前一直抱怨 Python 的文档难用,我发现,其实,最好的方式其实是在交互式的 Shell 里,用 help 来查询 API,再辅佐以官方文档,才是比较正确的方式。这是刷新了一个我以前的认识的地方。实践下来感觉还不错的。Python 的包管理器 pip 也很好用。
pip install PyYAML
pip install dropbox
来源:https://sexywp.com/use-python-to-backup-database-to-dropbox.htm
猜你喜欢
- 版本说明Python 3.0在设计的时候没有考虑向较早版本相容Python 2.6作为一个过渡版本,基本使用了Python 2.x的语法和库
- 引言在刚入门python时,模块化编程、模块、类库等术语常常并不容易理清。尤其是Modules(模块)和Packages(包),在impor
- 今天的问题是请问以下 alert 弹出值分别是什么?var f = function f2()&nb
- 1 plot 函数语法plot:绘制二维线图NO.1 绘制横轴为X,竖轴为Y二维线图,Y值与X值一一对应。plot(X,Y)如果 X 和 Y
- 之前有个程序,里面有个时间部分是按照国内时区,也就是东八区,来写的,程序中定义了北京时间2点到八点进行检查;后面程序在国外机器上,例如说韩国
- 最近学习了python基础,写一下3大排序练练手:'''Created on 2013-8-23@author: c
- 第一步:字母转数字英文字母转对应数字相对简单,可以在命令行输入一行需要转换的英文字母,然后对每一个字母在整个字母表中匹配,并返回相应的位数,
- 很多新手刚开始学习python的时候经常会看到python 中__name__ = \'__main__\' 这样的代码,可
- 句柄(handle)是C++程序设计中经常提及的一个术语。它并不是一种具体的、固定不变的数据类型或实体,而是代表了程序设计中的一个广义的概念
- 从这一章开始进入正式的算法学习。首先我们学习经典而有效的分类算法:决策树分类算法。1、决策树算法决策树用树形结构对样本的属性进行分类,是最直
- 不过首先你会发现,你在不同的地区或者不同的网络(电信、联通、移动)的情况下,转换后的IP地址很可能是 不一样的,这首先涉及到负载均衡的第一步
- insert 存在即不插入语法介绍三种方式第一种:replace intoreplace into table(id, name) valu
- 这篇文章主要介绍了python基于property()函数定义属性,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价
- List:1. 什么叫商品评论?2. 评论体系的存在意义3. 评论体系的现状4. 都有哪些元素5. 该如何设计?6. 评论体系之外1.什么叫
- 我的mysql版本 MYSQL V5.7.9,旧版本请使用:UPDATE mysql.user SET Password=PASSWORD(
- 本文实例为大家分享了python实现简易聊天室的具体代码,供大家参考,具体内容如下群聊聊天室1.功能:类似qq群聊功能1.有人进入聊天室需要
- Tqdm库比较常用,用于显示进度条。简单用法:from tqdm import tqdmfor i in tqdm(range(2)):
- 因AJAX接受数据时服务器默认是采用UTF-8的编码形式进行传送,所以在很多GB2312中文网页中应用AJAX回传数据经常会发生中文乱码。解
- Python字典的key都可以是什么答一个对象能不能作为字典的key,就取决于其有没有__hash__方法。所以所有python自带类型中,
- 在我发表上一篇《Zen Coding: 一种快速编写HTML/CSS代码的方法》之后,有网友表示不知道怎么在Dreamweaver上使用ze