Python实现MySQL数据库自动备份至Dropbox的脚本教程
本文介绍如何使用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
本站声明
本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。













