全网整合营销服务商

电脑端+手机端+微信端=数据同步管理

免费咨询热线:400-708-3566

Python脚本实现自动将数据库备份到 Dropbox

最近,正好发生了一件大事,就是 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


# python连接数据库脚本  # python脚本备份数据库  # python  # 数据库脚本  # Python读写及备份oracle数据库操作示例  # Python实现定时备份mysql数据库并把备份数据库邮件发送  # Python实现备份MySQL数据库的方法示例  # python备份文件以及mysql数据库的脚本代码  # python使用多线程查询数据库的实现示例  # Python基于多线程操作数据库相关问题分析  # Python基于多线程实现抓取数据存入数据库的方法  # python使用多线程备份数据库的步骤  # 配置文件  # 的是  # 这是  # 我也  # 就有  # 美国  # 自己的  # 我是  # 几个  # 文档  # 让我  # 是在  # 也有  # 我发现  # 我在  # 有个  # 我以前  # 最好的  # 多个  # 才是 


相关文章: 如何在IIS管理器中快速创建并配置网站?  上海网站制作网站建设公司,建筑电工证网上查询系统入口?  大同网页,大同瑞慈医院官网?  专业网站制作企业网站,如何制作一个企业网站,建设网站的基本步骤有哪些?  香港服务器租用每月最低只需15元?  建站之星如何修改网站生成路径?  青岛网站设计制作公司,查询青岛招聘信息的网站有哪些?  道歉网站制作流程,世纪佳缘致歉小吴事件,相亲网站身份信息伪造该如何稽查?  商务网站制作工程师,从哪几个方面把握电子商务网站主页和页面的特色设计?  jQuery 常见小例汇总  义乌企业网站制作公司,请问义乌比较好的批发小商品的网站是什么?  沈阳个人网站制作公司,哪个网站能考到沈阳事业编招聘的信息?  深圳网站制作公司好吗,在深圳找工作哪个网站最好啊?  建站之星如何通过成品分离优化网站效率?  如何在阿里云域名上完成建站全流程?  高防服务器租用首荐平台,企业级优惠套餐快速部署  建站主机是什么?如何选择适合的建站主机?  如何高效配置IIS服务器搭建网站?  如何快速搭建高效可靠的建站解决方案?  如何快速打造个性化非模板自助建站?  如何在IIS中配置站点IP、端口及主机头?  如何通过万网虚拟主机快速搭建网站?  如何在局域网内绑定自建网站域名?  手机网站制作与建设方案,手机网站如何建设?  建站org新手必看:2024最新搭建流程与模板选择技巧  PHP正则匹配日期和时间(时间戳转换)的实例代码  如何在云主机快速搭建网站站点?  Bpmn 2.0的XML文件怎么画流程图  建站VPS配置与SEO优化指南:关键词排名提升策略  建站主机数据库如何配置才能提升网站性能?  重庆网站制作公司哪家好,重庆中考招生办官方网站?  如何确保西部建站助手FTP传输的安全性?  ,有什么在线背英语单词效率比较高的网站?  建站之星安全性能如何?防护体系能否抵御黑客入侵?  如何获取免费开源的自助建站系统源码?  C#如何使用XPathNavigator高效查询XML  移动端手机网站制作软件,掌上时代,移动端网站的谷歌SEO该如何做?  招贴海报怎么做,什么是海报招贴?    制作网站的网址是什么,请问后缀为.com和.com.cn还有.cn的这三种网站是分别是什么类型的网站?  网站制作专业公司有哪些,如何制作一个企业网站,建设网站的基本步骤有哪些?  建站主机是否等同于虚拟主机?  建站之星价格显示格式升级,你的预算足够吗?  番禺网站制作公司哪家值得合作,番禺图书馆新馆开放了吗?  红河网站制作公司,红河事业单位身份证如何上传?  如何在沈阳梯子盘古建站优化SEO排名与功能模块?  小型网站建站如何选择虚拟主机?  制作证书网站有哪些,全国城建培训中心证书查询官网?  西安制作网站公司有哪些,西安货运司机用的最多的app或者网站是什么?  详解免费开源的.NET多类型文件解压缩组件SharpZipLib(.NET组件介绍之七) 

您的项目需求

*请认真填写需求信息,我们会在24小时内与您取得联系。