当前位置: 主页 > 日志 > Python >

我的Linux数据库+文件备份脚本

前几天我的Linux VPS出了问题(一个挂载点变成只读的了,无法修改权限,不能写入、删除,让机房技术处理,结果被告知重启后系统挂了。至今我还没弄清到底是怎么回事。),机房的技术告知只能重做系统了,而且数据无法恢复了,无语啊。

后来重装系统竟然花了3天时间,再次对四博互联无语。

四博互联的VPS稳定性实在不行,几乎每个月都要出一次问题,比linode.com的云VPS差太远了,linode.com用了也快一年了,几乎没出过问题。

 

之前幸好数据做了备份,不然就真的彻底杯具了。

 

下面分享一下我的备份脚本:

该脚本采用Python编写(Linux自带Python解释器),支持将数据库和本地文件打包并上传到指定的FTP。

 

先看配置文件:

setting.ini

[setting]
ftp_host=***
ftp_user=***
ftp_pass=***
bak_dirs=/data/wwwroot(如果有多个,用分号";"隔开)
mysql_user=root
mysql_pass=***
mysql_dbs=rediceblog;sitedigger;snyongli;webscraping(如果有多个,用分号";"隔开)

备份脚本:

linux_baker.py

# linux_baker.py
# by redice 2011.08.27

import os
import ConfigParser
import shutil
from datetime import datetime
from ftplib import FTP

# path of mysqldump
MYSQLDUMP = '/usr/bin/mysqldump'

class Baker:
    def __init__(self):
        # read ftp and mysql parameters
        cfg = ConfigParser.ConfigParser()
        cfg.read('setting.ini')
        
        self.ftp_host = self.__read_conf('ftp_host', cfg)
        self.ftp_user = self.__read_conf('ftp_user', cfg)
        self.ftp_pass = self.__read_conf('ftp_pass', cfg)
        self.bak_dirs = self.__read_conf('bak_dirs', cfg)
        self.mysql_user = self.__read_conf('mysql_user', cfg)
        self.mysql_pass = self.__read_conf('mysql_pass', cfg)
        self.mysql_dbs = self.__read_conf('mysql_dbs', cfg)
        
        self.tmp_dir = os.path.join(self.__path(), 'tmp')
            
    def __read_conf(self, field, cfg):
        try:
            return cfg.get('setting', field)
        except Exception, e:
            pass
        
    def __path(self):
        return os.path.dirname(__file__)
    
    def __date(self):
        return datetime.now().strftime('%Y%m%d')
        
    def bak(self):
        """Baking mysql and dirs
        """
        # clear old files
        if os.path.exists(self.tmp_dir):
            shutil.rmtree(self.tmp_dir)
        os.mkdir(self.tmp_dir)
            
        # dumping all mysql_dbs
        if self.mysql_user and self.mysql_dbs:
            for db in self.mysql_dbs.split(';'):
                print 'dumping %s.' % db
                os.system('%s -u %s -p%s %s > %s' % (MYSQLDUMP, self.mysql_user, self.mysql_pass, db.strip(), \
                        os.path.join(self.tmp_dir, '%s_%s.sql.bak' % (db, self.__date()))))

        # zip all dirs
        if self.bak_dirs:
            for _dir in self.bak_dirs.split(';'):
                print 'zip %s.' % _dir
                os.system('tar zcvf %s %s' % (os.path.join(self.tmp_dir, '%s_%s.tar.gz' % (_dir.replace('/', '_'), self.__date())), _dir))
        
    def upload(self):
        """Uploading files onto ftp.
        """
        if self.ftp_host:
            ftp = FTP(self.ftp_host)
            try:
                ftp.login(self.ftp_user, self.ftp_pass)
                print ftp.getwelcome()
                for root, _, files in os.walk(self.tmp_dir):
                    for f in files:
                        print 'uploading %s to %s.' % (f, self.ftp_host)
                        ftp.storbinary('STOR %s' % f, open(os.path.join(root, f), 'rb'))
                ftp.quit()
            except Exception, e:
                print str(e)
        
if __name__ == '__main__':
    baker = Baker()
    baker.bak()
    baker.upload()
    print 'baking finished.'

添加到计划任务:

每周一晚0点执行备份操作。

crontab -e
0 0 * * 1 /usr/local/bin/python2.5 /data/Python/linux_baker/linux_baker.py

 

[日志信息]

该日志于 2011-08-27 23:51 由 redice 发表在 redice's Blog ,你除了可以发表评论外,还可以转载 “我的Linux数据库+文件备份脚本” 日志到你的网站或博客,但是请保留源地址及作者信息,谢谢!!    (尊重他人劳动,你我共同努力)
   
验证(必填):   点击我更换验证码

redice's Blog  is powered by DedeCms |  Theme by Monkeii.Lee |  网站地图 |  本服务器由西安鲲之鹏网络信息技术有限公司友情提供

返回顶部