最近、大きな出来事が起こりました。つまり、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], '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 にアップロードできる
pip install PyYAML pip install dropbox