Python腳本實(shí)現(xiàn)自動(dòng)將數(shù)據(jù)庫備份到 Dropbox
最近,正好發(fā)生了一件大事,就是 GitLab 的運(yùn)維同學(xué)不小心刪除了生產(chǎn)的數(shù)據(jù),雖然 GitLab 已經(jīng)駭人聽聞的準(zhǔn)備了五種備份機(jī)制,但是,仍然導(dǎo)致他們丟失了將近 6 個(gè)小時(shí)的用戶數(shù)據(jù),尤其對(duì)他們聲譽(yù)的損失,是根本無法估量的。反思一下,這個(gè)博客 Becomin' Charles,也是沒有完善的備份的,真是冷汗直冒啊,主要考慮到這是我的個(gè)人博客,但是想想已經(jīng)堅(jiān)持了快十年了,如果真的丟了的話,還是非常痛心的。
正好,老婆最近正在學(xué)習(xí)Python 編程,我在教她,其實(shí),我是PHP 程序員,一點(diǎn)也不喜歡 Python,但是說實(shí)在,一個(gè)外行學(xué)編程的話,Python 確實(shí)比PHP 友好太多了,只能推薦她學(xué) Python 了。正好,借著這個(gè)機(jī)會(huì),我決定自己也學(xué)學(xué) Python 編程吧,于是,我決定要用 Python 做一個(gè)數(shù)據(jù)庫的自動(dòng)備份腳本。備份的位置,就用Dropbox 來做吧,因?yàn)槲业姆?wù)器是 Linode 提供的,美國 fremont 機(jī)房,選擇美國的存儲(chǔ)服務(wù),比較合適。以下是我寫得代碼,Python 小白,敬請(qǐng)指教:
#!/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()
簡單描述下這個(gè)代碼的思路,這個(gè)程序應(yīng)該滿足這個(gè)幾個(gè)要求:
- 使用 mysqldump 備份數(shù)據(jù)庫到本地
- 應(yīng)該支持配置文件,允許配置多個(gè)數(shù)據(jù)庫
- 可以上傳到 Dropbox
為了完成這些要求,首先碰到的難題是怎么支持配置文件,一搜,原來 Python 下有個(gè)默認(rèn)的 ConfigParser,可以完成這個(gè)任務(wù),但是正常東西比較惡心的是,配置文件必須是以 [Section] 為單位組織的。其實(shí)我的配置顯然有些全局配置,還有就是數(shù)據(jù)庫的各種信息是多次重復(fù)的,這種配置文件,嵌套能力簡直糟糕,必須兩層的結(jié)構(gòu),就很惡心。于是我去網(wǎng)上搜配置文件的格式,好多文章比較了各種配置文件的優(yōu)劣,其實(shí)這文章挺多的,我想了想,以后或許我也可以寫文章講講我自己的感受了。反正就是很多文章最后都公認(rèn) YAML 是配置文件里最完美的。于是我也決定用這個(gè),果然也有現(xiàn)成的類庫,就是 PyYAML,特方便,就倆函數(shù) load 和 dump,直接就把文件變成 dict 格式了。
第二個(gè)難題,就是上傳 Dropbox,后來發(fā)現(xiàn),官方提供了很豐富的 API,而且直接就有 SDK,(讓我眼紅的是,官方竟然沒有 PHP 的 SDK,這么不受待見么?),研究 SDK 用法,發(fā)現(xiàn)直接就有代碼范例,于是直接抄到我的代碼里,瞬間完成了 50% 的代碼,爽!
整個(gè)代碼完成后,我發(fā)現(xiàn),寫代碼一共也沒花多少時(shí)間,而且,我學(xué)會(huì)的 Python 的方式,我以前一直抱怨 Python 的文檔難用,我發(fā)現(xiàn),其實(shí),最好的方式其實(shí)是在交互式的 Shell 里,用 help 來查詢 API,再輔佐以官方文檔,才是比較正確的方式。這是刷新了一個(gè)我以前的認(rèn)識(shí)的地方。實(shí)踐下來感覺還不錯(cuò)的。Python 的包管理器 pip 也很好用。
pip install PyYAML pip install dropbox
- Python讀寫及備份oracle數(shù)據(jù)庫操作示例
- Python實(shí)現(xiàn)定時(shí)備份mysql數(shù)據(jù)庫并把備份數(shù)據(jù)庫郵件發(fā)送
- Python實(shí)現(xiàn)備份MySQL數(shù)據(jù)庫的方法示例
- python備份文件以及mysql數(shù)據(jù)庫的腳本代碼
- python使用多線程查詢數(shù)據(jù)庫的實(shí)現(xiàn)示例
- Python基于多線程操作數(shù)據(jù)庫相關(guān)問題分析
- Python基于多線程實(shí)現(xiàn)抓取數(shù)據(jù)存入數(shù)據(jù)庫的方法
- python使用多線程備份數(shù)據(jù)庫的步驟
相關(guān)文章
python實(shí)現(xiàn)簡單socket程序在兩臺(tái)電腦之間傳輸消息的方法
這篇文章主要介紹了python實(shí)現(xiàn)簡單socket程序在兩臺(tái)電腦之間傳輸消息的方法,涉及Python操作socket的技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下2015-03-03
python 基于opencv實(shí)現(xiàn)高斯平滑
這篇文章主要介紹了python 基于opencv實(shí)現(xiàn)高斯平滑,幫助大家更好的理解和使用python處理圖片,感興趣的朋友可以了解下2020-12-12
詳談Python3 操作系統(tǒng)與路徑 模塊(os / os.path / pathlib)
下面小編就為大家分享一篇詳談Python3 操作系統(tǒng)與路徑 模塊(os / os.path / pathlib),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2018-04-04
利用Python實(shí)現(xiàn)Markdown文檔格式轉(zhuǎn)換詳解
這篇文章主要介紹了如何利用Python中的MarkItDown庫將多種文件高效轉(zhuǎn)換為Markdown文本,以及如何使用Python-Markdown庫將Markdown文本轉(zhuǎn)換為HTML,需要的可以參考下2025-03-03
利用Hyperic調(diào)用Python實(shí)現(xiàn)進(jìn)程守護(hù)
這篇文章主要為大家詳細(xì)介紹了利用Hyperic調(diào)用Python實(shí)現(xiàn)進(jìn)程守護(hù),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-01-01

