데이터베이스를 Dropbox에 자동으로 백업하는 Python 스크립트

高洛峰
풀어 주다: 2017-02-09 17:57:55
원래의
1901명이 탐색했습니다.

최근 큰 일이 일어났습니다. GitLab의 운영 및 유지 관리 학생들이 실수로 프로덕션 데이터를 삭제했다는 것입니다. GitLab은 놀라운 5가지 백업 메커니즘을 준비했지만 여전히 거의 6시간의 데이터가 손실되었습니다. , 특히 그들의 평판은 헤아릴 수 없을 만큼 뛰어납니다. 곰곰이 생각해 보면 이 블로그는 완전한 백업이 되어 있지 않습니다. 주로 제 개인 블로그라는 점을 고려하면 정말 식은땀이 납니다만, 생각해보면 거의 10년 동안 유지해 왔습니다. 정말 사라졌어요. 아직도 매우 슬프네요.

최근 아내가 Python 프로그래밍을 배우고 있는데 제가 아내에게 가르치고 있습니다. 사실 저는 PHP 프로그래머이고 일반인이라면 전혀 좋아하지 않습니다. 프로그래밍을 배우는데, 실제로 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이라는 기성 클래스 라이브러리가 있는데, 이는 매우 편리합니다. 로드와 덤프라는 두 가지 기능만으로 파일을 직접 dict 형식으로 변환할 수 있습니다.

두 번째 문제는 Dropbox에 업로드하는 것입니다. 나중에 공식에서 매우 풍부한 API를 제공하고 SDK가 직접 있다는 것을 알게 되었습니다. (PHP용 공식 SDK를 사용할 수 없다는 점이 부럽습니다. 너무 인기가 없군요. 만나요?) SDK 사용법을 연구하다가 직접 코드 예제가 있다는 걸 발견하고 직접 코드에 복사해서 50%를 순식간에 완성해버렸네요!

전체 코드가 완성된 후에는 코드를 작성하는 데 많은 시간이 걸리지 않는다는 것을 알게 되었습니다. 게다가 Python을 배우면서, Python의 문서가 사용하기 어렵다고 불평하곤 했습니다. 실제로 가장 좋은 방법은 도움말을 사용하여 대화형 셸에서 API를 쿼리한 다음 공식 문서를 지원하는 것입니다. 이곳은 나의 이전 이해를 새롭게 해준 곳이다. 실제로는 꽤 좋은 느낌입니다. Python의 패키지 관리자 pip도 매우 유용합니다.

pip install PyYAML
pip install dropbox
로그인 후 복사

Dropbox에 데이터베이스를 자동으로 백업하는 더 많은 Python 스크립트를 보려면 PHP 중국어 웹사이트에서 관련 기사를 참고하세요!

원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿
회사 소개 부인 성명 Sitemap
PHP 중국어 웹사이트:공공복지 온라인 PHP 교육,PHP 학습자의 빠른 성장을 도와주세요!