最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Python腳本實(shí)現(xiàn)自動(dòng)將數(shù)據(jù)庫備份到 Dropbox

 更新時(shí)間:2017年02月06日 08:31:30   作者:sexywp  
本文給大家分享的是作者使用python腳本實(shí)現(xiàn)自動(dòng)備份mysql數(shù)據(jù)庫到的dropbox網(wǎng)盤的代碼,非常的簡單實(shí)用,有需要的小伙伴可以參考下

最近,正好發(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

相關(guān)文章

最新評(píng)論

洮南市| 花莲市| 蕲春县| 山阴县| 伊春市| 文成县| 江安县| 德阳市| 水城县| 绥滨县| 陵川县| 泌阳县| 汨罗市| 黔西县| 邵阳县| 乌苏市| 齐河县| 靖宇县| 南华县| 河南省| 宜良县| 阿拉善盟| 正安县| 五大连池市| 盈江县| 巨鹿县| 吉安市| 大余县| 兖州市| 蒙自县| 个旧市| 洛川县| 木里| 永川市| 郁南县| 普安县| 三台县| 双柏县| 那曲县| 紫金县| 广丰县|