ホームページ  >  記事  >  バックエンド開発  >  データベースを Dropbox に自動的にバックアップする Python スクリプト

データベースを Dropbox に自動的にバックアップする Python スクリプト

高洛峰
高洛峰オリジナル
2017-02-09 17:57:551891ブラウズ

最近、大きな出来事が起こりました。つまり、GitLab の運用保守の学生が誤って本番データを削除してしまいました。GitLab は 5 つの驚くべきバックアップ メカニズムを用意していましたが、それでも 6 時間近くのユーザー データ、特に .彼らの評判へのダメージは計り知れません。よく考えると、このブログ「Becomin' Charles」には完全なバックアップがありません。主に私の個人的なブログであると考えていますが、よく考えてみると、私は 10 年近く続けてきました。本当になくなってしまったのですが、今でもとても悲しいです。

たまたま最近、妻がPythonプログラミングを習っていて、私が教えているんですが、実は私はPHPプログラマーで、Pythonは全く好きではないのですが、正直、素人がプログラミングを学ぶならPythonです。確かに、PHP よりもはるかにフレンドリーなので、彼女に Python を学ぶことをお勧めします。幸い、これを機に自分でも Python プログラミングを勉強してみようと思い、Python を使ってデータベースの自動バックアップ スクリプトを作成することにしました。バックアップの場所については、Dropbox を使用します。私のサーバーは米国のフリーモントのコンピューター室にある Linode によって提供されているため、米国のストレージ サービスを選択する方が適切です。以下は私が書いたコードです。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], &#39;r&#39;))
  
# 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[&#39;databases&#39;] :
  filename = "%s_%s.sql" % (db[&#39;name&#39;], datetime.now().strftime("%Y%m%d-%H-%M-%S")) 
  filepath = "%s/%s" % (conf[&#39;local-backup-path&#39;], filename)
  cmd = "mysqldump -h%s -u%s -p%s -P%s --single-transaction %s > %s" % (
      db[&#39;host&#39;],
      db[&#39;user&#39;], 
      db[&#39;pass&#39;], 
      db[&#39;port&#39;], 
      db[&#39;name&#39;], 
      filepath
      )
  os.system(cmd)
  cmd = "gzip %s" % filepath
  os.system(cmd)
  filepath = filepath + &#39;.gz&#39;
  dbx = dropbox.Dropbox(conf[&#39;dropbox-token&#39;])
  backuppath = "%s/%s/%s/%s" % (
      conf[&#39;remote-backup-path&#39;],    # remote path
      datetime.now().strftime("%Y%m%d"), # date string
      conf[&#39;server-name&#39;],       # server name
      filename + &#39;.gz&#39;)
  with open(filepath, &#39;rb&#39;) 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(&#39;overwrite&#39;))
    except ApiErroras err:
      # This checks for the specific error where a user doesn&#39;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 であり、これでこのタスクを完了できますが、これは通常の動作です。さらに厄介なのは、構成ファイルを [セクション] 単位で編成する必要があることです。実際、私の構成には明らかにグローバル構成があり、データベース内のさまざまな情報が何度も繰り返されます。この種の構成ファイルのネスト機能は単純にひどいものであり、2 層構造が必要であり、うんざりします。そこで、ネットで設定ファイルの形式を検索してみたところ、さまざまな設定ファイルの長所と短所を比較した記事がたくさんあり、自分なりの記事が書けるかもしれません。これからの気持ち。とにかく、多くの記事が最終的に YAML が最も完璧な構成ファイルであることに同意します。そこで、これを使用することにしました。PyYAML という既製のクラス ライブラリがあり、load と dump の 2 つの関数だけでファイルを dict 形式に直接変換できます。

2番目の問題は、Dropboxへのアップロードです。後で、公式が豊富なAPIを提供しており、SDKが直接提供されていることを知りました(私が羨ましいのは、PHP用の公式SDKが利用できないことです。それほど人気が​​ないのですか?) ) で、SDK の使い方を調べたところ、コードサンプルが直接あることを知り、それをコードに直接コピーして、あっという間にコードの 50% が完成しました。

コード全体が完成した後、コードを書くのにそれほど時間はかからなかったことがわかりました。さらに、私が Python を学習したとき、Python のドキュメントは使いにくいと不満を言っていましたが、実際にそうでした。最良の方法は、対話型シェルで行うことです。より正しい方法は、ヘルプを使用して API をクエリし、公式ドキュメントを参照することです。これまでの認識を新たにした場所です。実際に使ってみるとかなりいい感じです。 Python のパッケージ マネージャー pip も非常に便利です。

pip install PyYAML
pip install dropbox

データベースを Dropbox に自動的にバックアップするための Python スクリプトの詳細については、PHP 中国語 Web サイトの関連記事に注目してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。