Python实现MySQL数据库自动备份至Dropbox的脚本教程

林见深
林见深
发布时间:2026-10-13| 3人浏览过
原创

本文介绍如何使用Python编写脚本,自动执行MySQL数据库备份并上传至Dropbox。通过PyYAML解析配置文件支持多库备份,利用Dropbox SDK实现文件上传,解决运维中数据丢失风险,适合个人博客或小型服务器使用。

近期,GitLab运维团队因误操作删除了生产环境数据。尽管他们部署了五种备份机制,仍导致近6小时的用户数据丢失,其声誉损失难以估量。这一事件引发了对数据备份重要性的深刻反思。以本博客Becomin' Charles为例,此前并未建立完善的备份体系,令人后怕。考虑到该博客已运营近十年,若发生数据丢失将造成巨大遗憾,因此亟需建立可靠的备份方案。

近期,家人开始学习Python编程,作为PHP程序员,我虽对Python并无特别偏好,但客观而言,对于初学者,Python确实比PHP更为友好,因此推荐其学习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格式被广泛认为是配置文件中最优选择,因其结构清晰且无需复杂嵌套。Python中提供了现成的PyYAML库,通过load和dump两个函数即可直接将文件转换为字典格式,使用极为便捷。

第二个难点在于Dropbox的上传功能。官方提供了丰富的API及SDK,相比之下,官方未提供PHP SDK,略显遗憾。通过研究SDK文档,发现其中包含代码范例,直接借鉴即可快速完成约50%的代码编写,效率显著提升。

代码完成后发现,整体开发耗时并不长。在Python学习过程中,我发现最有效的学习方式是在交互式Shell中使用help命令查询API,并结合官方文档进行实践,这刷新了我对Python文档易用性的认知。此外,Python的包管理器pip也提供了极大的便利。

pip install PyYAML
pip install dropbox

免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。

Python 相关产品和应用

全部下载
Selenium

Selenium

4.51.0 · Windows

用于浏览器自动化和 Web 测试的 Python 工具。

scikit-learn

scikit-learn

1.9.1 · Windows

常用 Python 机器学习算法与模型评估工具库。

Black

Black

26.10.1 · Windows

强调一致性的 Python 自动代码格式化工具。

Ruff

Ruff

0.17.1 · macOS

由 Rust 编写的高速 Python 代码检查和格式化工具。

pytest

pytest

9.1.1 · Windows

简洁而强大的 Python 自动化测试框架。

FastAPI

FastAPI

0.146.0 · Windows

高性能 Python API 框架,支持类型提示和自动接口文档。

Flask

Flask

3.1.3 · Windows

轻量灵活的 Python Web 应用框架。

Django

Django

6.1.2 · Windows

成熟的 Python Web 框架,适合构建内容站点和业务系统。

Spyder

Spyder

6.1.7 · Windows

面向科学计算与数据分析的 Python 集成开发环境。

SciPy

SciPy

1.18.1 · Windows

面向科学、工程和技术计算的 Python 算法库。