Heim  >  Artikel  >  Backend-Entwicklung  >  Python-Skript zum automatischen Sichern der Datenbank in Dropbox

Python-Skript zum automatischen Sichern der Datenbank in Dropbox

高洛峰
高洛峰Original
2017-02-09 17:57:551892Durchsuche

Kürzlich passierte etwas Großes: Die Betriebs- und Wartungsstudenten von GitLab löschten versehentlich die Produktionsdaten. Obwohl GitLab erstaunliche fünf Sicherungsmechanismen vorbereitet hatte, verloren sie dennoch fast 6 Stunden an Daten , und insbesondere ihr Ruf, ist einfach unermesslich. Wenn ich darüber nachdenke, gerät ich nicht wirklich ins Schwitzen, wenn man bedenkt, dass es sich um meinen persönlichen Blog handelt, aber ich habe fast zehn Jahre lang daran festgehalten Es ist wirklich verloren, aber immer noch sehr traurig.

Zufälligerweise lernt meine Frau seit Kurzem Python-Programmierung und ich unterrichte sie. Tatsächlich bin ich PHP-Programmiererin und mag Python überhaupt nicht, aber um ehrlich zu sein, wenn ich ein Laie bin lernt Programmieren, Python ist in der Tat viel benutzerfreundlicher als PHP. Ich kann ihr nur empfehlen, Python zu lernen. Glücklicherweise nutzte ich diese Gelegenheit und beschloss, selbst die Python-Programmierung zu erlernen, also beschloss ich, Python zu verwenden, um ein automatisches Sicherungsskript für die Datenbank zu erstellen. Als Backup-Speicherort verwende ich einfach Dropbox, da mein Server von Linode bereitgestellt wird, der sich im Computerraum von Fremont in den USA befindet. Es ist sinnvoller, den Speicherdienst in den USA zu wählen. Das Folgende ist der Code, den ich geschrieben habe, Python-Neuling, bitte geben Sie mir einige Ratschläge:

#!/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()

Beschreiben Sie kurz die Idee dieses Codes. Dieses Programm sollte diese Anforderungen erfüllen:

Verwenden Die Sicherung der mysqldump-Datenbank auf lokal

sollte Konfigurationsdateien unterstützen, die die Konfiguration mehrerer Datenbanken ermöglichen

kann auf Dropbox hochgeladen werden

Um diese Anforderungen zu erfüllen, was ist Das erste aufgetretene Problem? Nach der Suche stellt sich heraus, dass es unter Python einen Standard-ConfigParser gibt, der diese Aufgabe erledigen kann. Das Ekelhafte an normalen Dingen ist jedoch, dass die Konfigurationsdateien in [Abschnitts]-Einheiten organisiert sein müssen . Tatsächlich hat meine Konfiguration offensichtlich einige globale Konfigurationen, und verschiedene Informationen in der Datenbank werden viele Male wiederholt. Die Verschachtelungsfähigkeit dieser Art von Konfigurationsdatei ist einfach schrecklich und erfordert eine zweischichtige Struktur, was widerlich ist. Also habe ich online nach Konfigurationsdateiformaten gesucht. Es gab viele Artikel, in denen die Vor- und Nachteile verschiedener Konfigurationsdateien verglichen wurden, und vielleicht kann ich einen Artikel über meine eigenen schreiben Gefühle in der Zukunft. Wie auch immer, viele Artikel stimmen schließlich darin überein, dass YAML die perfekteste Konfigurationsdatei ist. Deshalb habe ich mich dafür entschieden, dass es eine vorgefertigte Klassenbibliothek gibt, nämlich PyYAML, die mit nur zwei Funktionen, Laden und Dump, die Datei direkt in das Diktatformat konvertieren kann.

Das zweite Problem ist das Hochladen auf Dropbox. Später habe ich herausgefunden, dass die offizielle API eine sehr umfangreiche API bereitstellt und es direkt ein SDK gibt. (Was mich neidisch macht, ist, dass das offizielle SDK für PHP nicht verfügbar ist. Es ist so unbeliebt. Ich habe die Verwendung von SDK untersucht und festgestellt, dass es direkt Codebeispiele gibt, also habe ich es direkt in meinen Code kopiert und 50 % des Codes im Handumdrehen fertiggestellt.

Nachdem der gesamte Code fertiggestellt war, stellte ich fest, dass das Schreiben des Codes nicht viel Zeit in Anspruch nahm. Außerdem beschwerte ich mich darüber, dass die Dokumentation von Python meiner Meinung nach schwierig zu verwenden war Das ist in der Tat der beste und korrektere Weg, die API mithilfe von Help in einer interaktiven Shell abzufragen und dann mit offiziellen Dokumenten zu helfen. Dies ist ein Ort, der mein bisheriges Verständnis aufgefrischt hat. In der Praxis fühlt es sich ziemlich gut an. Der Paketmanager pip von Python ist ebenfalls sehr nützlich.

pip install PyYAML
pip install dropbox

Weitere Python-Skripte zum automatischen Sichern der Datenbank in Dropbox finden Sie auf der chinesischen PHP-Website für verwandte Artikel!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn