首页 > 编程 > Python > 正文

Python备份Mysql脚本

2020-01-04 18:06:45
字体:
来源:转载
供稿:网友
特点是多平台,一个脚本内可以备份多个数据库,并分别打包上传到ftp进行备份。调用了mysqldump及tar来进行数据库dump及打包。 具体参数说明参见源文件
 

 

复制代码代码如下:

#!/usr/bin/python  

import os  
import time  
import ftplib  
import traceback  

#config vars  
systempathchr="/" #路径分割符,*nix用"/" win32用"//"  

dbuser="root" #数据库用户名  
dbpwd="dbpwd" #数据库密码  
dbnamelist=["dbone","dbtwo","dbthree"] #需要备份那些数据库  

workdir="/path/to/backup/" #本地备份文件夹  
errlogfile="databack.log" #错误日志名  
ftp_addr="192.168.0.2" #ftp地址  
ftp_port="2102" #ftp端口  
ftp_user="databack" #ftp用户名  
ftp_pwd="backpwd" #ftp密码  
ftp_path="/" #存放到ftp路径  

ftpqueue=[]  


def ftpstor():  
    #login  
    bufsize=1024  
    ftp=ftplib.FTP()  
    try:  
        ftp.connect(ftp_addr,ftp_port)  
        ftp.login(ftp_user,ftp_pwd)  
        ftp.cwd(ftp_path)  
        for filepath in ftpqueue:  

            #open file for input as binary  
            f=open(filepath,"rb")  
            #store file as binary  
            print getfilename(filepath)  
            ftp.storbinary("STOR "+getfilename(filepath),f,bufsize)  
            f.close()  
        ftp.quit()  
    except:  
        path=os.path.join(workdir,errlogfile)  
        traceback.print_exc(file=open(path,"a"))  

      

def dumpdb(dbname):  
    global ftpqueue  
    timeformat="%Y%m%d"  
    sqlvalformat="mysqldump -u%s -p/"%s/" /"%s/" >/"%s/""  
    tarvalformat="tar --directory=/"%s/" -zcf /"%s/" /"%s/""  
    nowdate=time.strftime(timeformat)  
    dumpfile=os.path.join(workdir,dbname+".dump")  
    zipfile=os.path.join(workdir,dbname+nowdate+".tar.gz")  
    sqlval=sqlvalformat % (dbuser,dbpwd,dbname,dumpfile)  

    result=os.system(sqlval)  
    tarval=tarvalformat % (workdir,zipfile,dbname+".dump")  

    result=os.system(tarval)  
    os.remove(dumpfile)  
    ftpqueue.append(zipfile)  

def getfilename(path):  

    pt=path.rfind(systempathchr)  
    return path[pt+1:]  

def main():  
    for dbname in dbnamelist:  
        dumpdb(dbname)  

    ftpstor()  

main()

没有仔细看,不过下面这两句,推荐看看os.path模块里面的函数,可能就不用针对linux和win分别设定不同的分隔符了 引用   
#config vars 
systempathchr="/" #路径分割符,*nix用"/" win32用"//"   
看到代码里面是用在得到文件名的,可以试试os.path.basename活着os.path.split了 
 
复制代码代码如下:

 >>> import os.path  
  >>> os.path.basename("c://test//aa.txt")  
  'aa.txt'  
  >>> os.path.split("c://test//aa.txt")  
  ('c://test', 'aa.txt')  
  >>> os.path.split("c://test//aa.txt")[-1]  
  'aa.txt'  
  >>> os.path.basename("/home/test/aa.txt")  
  'aa.txt'  
  >>> os.path.split("/home/test/aa.txt")  
  ('/home/test', 'aa.txt')  
  >>> os.path.basename("/home/test/aa.txt")  
  'aa.txt'

发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表