最后更新于 .

yunbk 是我前段时间用python写的一个备份插件,取中文谐音云备份的意思,你可以很方便的用这个插件来备份mysql、redis、mongodb、乃至各种media目录,等等。 安装可以直接用pip执行:

pip install yunbk

github地址如下:

https://github.com/dantezhu/yunbk

而用法也非常简单,比如要备份mysql,则代码如下:

from yunbk import YunBK
from yunbk.backend.local import LocalBackend

import sh

backend = LocalBackend('/data/backup')

with YunBK('mysql', [backend]) as ybk:
    sh.mysqldump(u='root',
                 all_databases=True,
                 _out="dump.sql")
    ybk.backup()

怎么样,简单吧! 上面的代码会将mysql的所有数据库dump下来之后,保存到本地的 /data/backup 目录,并且按照分类和日期命名。除了保存到本地之外,yunbk还提供了 ftp, sftp, 百度的bcs,阿里的oss等多种备份方式. 简单讲一下yunbk的设计原理:

在上面的代码中,用with语句进入了yunbk指定的一个默认临时目录,此时所有的文件写入都会在这个目录里。 当调用backup的时候,yunbk会调用[backend] 中每个backend的upload方法,将数据备份起来 当with结束的时候,yunbk创建的临时目录会自动删除,即不会留下任何痕迹

需要特别说明的是,yunbk是受 bakthat 这个插件启发而来,只是他默认使用亚马逊作为备份方式,在天朝你懂得,另外还有一些实现方式觉得不是特别好,代码有些冗余,所以就自己实现了一个。 废话就不多少了,列一下常用的几种被封方式的示例:

FTP备份

from yunbk import YunBK
from yunbk.backend.ftp import FTPBackend

import sh

backend = FTPBackend('127.0.0.1', 'user', 'passwd', '/data/backup')

with YunBK('mysql', [backend]) as ybk:
    sh.mysqldump(u='root',
                 all_databases=True,
                 _out="dump.sql")
    ybk.backup()

阿里OSS备份

from yunbk import YunBK
from yunbk.backend.ali_oss import OSSBackend

import sh

backend = OSSBackend('127.0.0.1', 'access_id', 'secret_access_key', 'backup_my_data')

with YunBK('mysql', [backend]) as ybk:
    sh.mysqldump(u='root',
                 all_databases=True,
                 _out="dump.sql")
    ybk.backup()

sftp 和 百度bcs 就不写啦,大家应该已经能够自己写出来啦 另外,推荐结合定时执行的库: APScheduler 一起使用,很方便:

# -*- coding: utf-8 -*-

import datetime
from apscheduler.scheduler import Scheduler
from apscheduler.events import EVENT_JOB_ERROR, EVENT_JOB_MISSED
import logging

from yunbk.yunbk import YunBK
from yunbk.backend.local import LocalBackend


logger = logging.getLogger('default')
logger.addHandler(logging.StreamHandler())
logger.setLevel(logging.DEBUG)

sched = Scheduler(daemonic=False)


def err_listener(ev):
    if ev.exception:
        logger.fatal('%s error.', str(ev.job), exc_info=True)
    else:
        logger.info('%s miss', str(ev.job))


@sched.cron_schedule(second='1')
def job():
    logger.debug(datetime.datetime.now())
    backend = LocalBackend('/data/release/backup/')
    with YunBK('ybk', [backend]) as ybk:
        f = open('t2.txt', 'w')
        f.write('ok')
        f.close()
        ybk.backup()


if __name__ == '__main__':
    sched.add_listener(err_listener, EVENT_JOB_ERROR | EVENT_JOB_MISSED)
    sched.start()

好啦,就到这里,希望对大家有用:) 另外无意中发现博客的pr又变成4了,自己好久没更新居然还能回到4,看来主要是大家评论的功劳啊,在此多谢啦

Pingbacks

Pingbacks已打开。

Trackbacks

引用地址

评论

  1. pigman

    pigman on #

    对于网站的备份方便 谢谢分享~

    Reply

    1. Dante

      Dante on #

      客气 :)

      Reply

  2. aaa

    aaa on #

    <img src="http://img.t.sinajs.cn/t35/style/images/common/face/ext/normal/ac/smilea_org.gif" />

    Reply

  3. 大CC

    大CC on #

    请问import sh 为什么不可行;sh库是指的python系统的库吧?哪个版本的python里有?我使用2.7和3.4都没有

    Reply

    1. Dante

      Dante on #

      pip install sh

      Reply

发表评论