Maison  >  Article  >  développement back-end  >  Script Python pour sauvegarder automatiquement la base de données sur Dropbox

Script Python pour sauvegarder automatiquement la base de données sur Dropbox

高洛峰
高洛峰original
2017-02-09 17:57:551934parcourir

Récemment, une chose importante s'est produite, c'est-à-dire que les étudiants en exploitation et maintenance de GitLab ont accidentellement supprimé les données de production. Bien que GitLab ait préparé cinq mécanismes de sauvegarde étonnants, ils ont quand même perdu près de 6 heures de données. , et surtout leur réputation, est tout simplement incommensurable. À la réflexion, ce blog, Becomin' Charles, n'a pas de sauvegarde complète. J'ai vraiment des sueurs froides, surtout en considérant qu'il s'agit de mon blog personnel, mais en y réfléchissant, j'ai persisté pendant près de dix ans. c'est vraiment perdu, toujours très triste.

Il se trouve que ma femme apprend récemment la programmation Python et que je lui enseigne. En fait, je suis un programmeur PHP et je n'aime pas du tout Python. Mais pour être honnête, si je suis un profane. apprend la programmation, Python est en effet bien plus convivial que PHP. Trop, je ne peux que lui recommander d'apprendre Python. Heureusement, profitant de cette opportunité, j'ai décidé d'apprendre moi-même la programmation Python, j'ai donc décidé d'utiliser Python pour créer un script de sauvegarde automatique de la base de données. Pour l'emplacement de sauvegarde, utilisez simplement Dropbox, car mon serveur est fourni par Linode, qui est situé dans la salle informatique de Fremont aux États-Unis. Il est plus approprié de choisir le service de stockage aux États-Unis. Voici le code que j'ai écrit, novice Python, merci de me donner quelques conseils :

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

Décrivez brièvement l'idée de ce code, ce programme doit répondre à ces exigences :

Utiliser La base de données de sauvegarde mysqldump sur

locale doit prendre en charge les fichiers de configuration, permettant la configuration de plusieurs bases de données

peut être téléchargée sur Dropbox

Afin de répondre à ces exigences, qu'est-ce que Le premier problème rencontré ? Prise en charge des fichiers de configuration. Après recherche, il s'avère qu'il existe un ConfigParser par défaut sous Python, qui peut effectuer cette tâche. Mais ce qui est plus dégoûtant dans les choses normales, c'est que les fichiers de configuration doivent être organisés dans [Section]. unités. En fait, ma configuration a évidemment des configurations globales, et diverses informations dans la base de données sont répétées plusieurs fois. La capacité d'imbrication de ce type de fichier de configuration est tout simplement terrible et nécessite une structure à deux couches, ce qui est dégoûtant. Je suis donc allé en ligne pour rechercher des formats de fichiers de configuration. Il y avait de nombreux articles comparant les avantages et les inconvénients de différents fichiers de configuration. En fait, j'y ai réfléchi, et je pourrais peut-être écrire un article sur le mien. sentiments dans le futur. Quoi qu’il en soit, de nombreux articles s’accordent enfin sur le fait que YAML est le fichier de configuration le plus parfait. J'ai donc décidé de l'utiliser. Effectivement, il existe une bibliothèque de classes prête à l'emploi, à savoir PyYAML, qui est très pratique. Seules deux fonctions, charger et vider, peuvent directement convertir le fichier au format dict.

Le deuxième problème est le téléchargement vers Dropbox. Plus tard, j'ai découvert que le logiciel officiel fournit une API très riche et qu'il existe directement un SDK (ce qui me rend jaloux, c'est que le SDK officiel pour PHP n'est pas disponible. C'est tellement impopulaire. À bientôt ?), j'ai étudié l'utilisation du SDK et j'ai découvert qu'il existe directement des exemples de code, donc je l'ai copié directement dans mon code et j'ai complété 50 % du code en un instant.

Une fois l'intégralité du code terminée, j'ai constaté qu'il ne fallait pas beaucoup de temps pour écrire le code. De plus, la façon dont j'ai appris Python, je me plaignais du fait que la documentation de Python était difficile à utiliser. qu'en fait, la meilleure façon, en fait, la plus correcte est d'utiliser l'aide pour interroger l'API dans un Shell interactif, puis d'aider avec les documents officiels. C’est un endroit qui a rafraîchi ma compréhension précédente. Cela fait du bien en pratique. Le gestionnaire de packages pip de Python est également très utile.

pip install PyYAML
pip install dropbox

Pour plus de scripts Python permettant de sauvegarder automatiquement la base de données sur Dropbox, veuillez faire attention au site Web PHP chinois pour les articles connexes !

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn