python数据库自动备份

sqlserver数据库备份Python脚本

import pymssql
import sys
import os
import time
import datetime
import TuiSong



#备份文件夹集合
dir_list =list()
dir_path_root=r"E:\每周数据库备份"

__conn_path = {
               'host':"",
               'user':"sa",
               'password':"xgkj@20181011",
               'database':'master'
        }

content_str=""
title_str="标题"

def get_database_name_all():
    """获取所有数据库名称"""
    connect=None
    cursor=None
    global content_str
    try:
        connect = pymssql.connect(**__conn_path)
        #获取游标
        cursor = connect.cursor()
        cursor.execute("SELECT Name FROM Master..SysDatabases ORDER BY Name")
        name_list=cursor.fetchall()
    except :
        print("——————>error:数据库操作异常!")
        content_str+=("\n time:"+time.strftime('%Y-%m-%d-%H-%M-%S')
                      +"——————>error:查询全部数据库名异常!\n SELECT Name FROM Master..SysDatabases ORDER BY Name")
    finally:
        if connect:
            connect.close()
            if cursor:
                cursor.close()
    return name_list


def join_sql(database_name):
    """拼接备份sql
        return:sql
    """
    global content_str
    sql=""
    #获取本机此刻时间
    nowtime = time.strftime('%Y-%m-%d-%H-%M-%S',time.localtime(time.time())) + ""
    #print("------->操作时间",nowtime)
    try:
        #print("------->检查数据库备份文件夹是否存在....")
        if os.path.exists(dir_path_root+"\\"+database_name):
            #print("------->数据库备份文件夹已存在,开始备份数据库: %s"%database_name)
            if dir_path_root+"\\"+database_name not in dir_list:
                dir_list.append(dir_path_root+"\\"+database_name)#添加目录
        else:
            content_str+=("\n time:"+time.strftime('%Y-%m-%d-%H-%M-%S')+"——————>数据库备份文件夹不存在....开始自动创建")
            #print("------->数据库备份文件夹不存在....")
            os.mkdir(dir_path_root+"\\"+database_name)
            dir_list.append(dir_path_root+"\\"+database_name)#添加目录
            content_str+=("\n time:"+time.strftime('%Y-%m-%d-%H-%M-%S')+"——————>创建成功,开始备份数据库: %s"%database_name)
            #print("------->数据库备份文件夹创建成功,开始备份数据库: %s"%database_name)
        #拼接数据库备份sql
        sql=r"""BACKUP DATABASE ["""+database_name+"""] 
            TO DISK = N'"""+dir_path_root+"""\\"""+database_name+"""\\"""+database_name+"""_""" + nowtime + """.bak'
            WITH NOFORMAT,
            NOINIT,
            NAME = N'"""+database_name+"""-完整 数据库 备份',
            SKIP,
            NOREWIND,
            NOUNLOAD,
            STATS = 10 """
    except Exception as  ex:
        content_str+=("\n time:"+time.strftime('%Y-%m-%d-%H-%M-%S')+"——————>error:"+ex)
        print(ex)
    
    return sql


def backups_database(sql,name_data):
    #建立数据库链接connect
    connect=None
    cursor=None
    global content_str
    try:
        connect = pymssql.connect(**__conn_path)
        #设置自动提交
        connect.autocommit(True)
        #获取游标
        cursor = connect.cursor()
        cursor.execute(sql)
        content_str+=("\n time:"+time.strftime('%Y-%m-%d-%H-%M-%S')+"——————>备份成功:"+name_data)
        #print("------->备份成功")
        connect.autocommit(False)
    except Exception as ex:
        print("--------------->error:",ex)
    finally:
        if connect:
            connect.close()
            if cursor:
                cursor.close()
                #print("关闭成功")
    
def del_time_file(folder_path):
    """删除过期文件"""
    global content_str
    try:
        files=os.listdir(folder_path)
        now_time_file=time.strftime('%Y%m%d')
        for x in files:
            file_time=time.strftime('%Y%m%d',time.localtime(os.path.getatime(folder_path+"\\"+x)))
            if int(now_time_file)-int(file_time)>=30:#大于三十天的备份删除
                os.remove(folder_path+"\\"+x)
                #print("------->已删除30天过期文件:",x)
                content_str+=("\n time:"+time.strftime('%Y-%m-%d-%H-%M-%S')+"——————>已删除30天过期文件:"+x)
    except Exception as ex:
        print("------->检查30天过期文件操作失败",ex)
        content_str+=("\n time:"+time.strftime('%Y-%m-%d-%H-%M-%S')+"——————>error:检查30天过期文件操作失败"+ex)
        
    
def main():
    global content_str
    backups_time= datetime.datetime.now().strftime("%Y-%m-%d-%H-%M-%S")
    while True:
        
        now_time=datetime.datetime.now().strftime("%Y-%m-%d-%H-%M-%S")
        if backups_time<=now_time:
            print("\n------------->开始数据库备份操作")
            backups_time=(datetime.datetime.now()+datetime.timedelta(days=1)).strftime("%Y-%m-%d-%H-%M-%S")
            database_names=get_database_name_all()
            for name in database_names:
                if name[0] == "tempdb":
                    continue
                sql= join_sql(name[0])
                if sql!="":
                    backups_database(sql,name[0])
                else:
                    print("------------->error:sql拼接出现异常")
                    content_str+=("\n time:"+time.strftime('%Y-%m-%d-%H-%M-%S')+"——————>error:sql拼接出现异常")
            else:
                print("--------------->数据库备份成功\n",database_names,
                      "\n下次备份时间:",backups_time)
                content_str+=("\n time:"+time.strftime('%Y-%m-%d-%H-%M-%S')+"——————>数据库备份成功\n"+"下次备份时间:"+backups_time)
                TuiSong.tuisong_main(title_str,content_str)
                print(content_str)
                content_str=""
        for file in dir_list:
            del_time_file(file)
        print("--------------->时间:",datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S"),"\r",end="")
        time.sleep(1)

if __name__ == "__main__":
    sys.exit(int(main() or 0))

邮箱推送

import smtplib
from email.mime.text import MIMEText

'''
email模块,
email模块用来构造邮件和解析邮件内容,构造一
个邮件就是创建一个Message对象
MIMEText对象就表示构造一个纯文本的邮件,
MIMEImage对象表示构造了一个作为附件的图片。
如果把多个对象组合起来,用到
MIMEMultipart对象email模块下有多个类包括
Message、MIMEBase、MIMEText、MIMEAudio、MIMEImage和MIMEMultipart
'''

SMTP_SERVER = "smtp.163.com"
SMTP_PORT = 25


def send_mail(user,pwd,to,subject,text):
    """邮箱发送"""
    msg = MIMEText(text)#发送文本消息对象
    msg['From'] = user#发送者邮箱
    msg['To'] = to#接收者
    msg['subject'] = subject#邮箱主题
    
    smtp_server = smtplib.SMTP(SMTP_SERVER,SMTP_PORT)
    print('连接到邮件服务器。')
    try:
        smtp_server.ehlo()
        smtp_server.starttls()
        smtp_server.ehlo()
        print('Logging Info Mail Server')
        smtp_server.login(user,pwd)
        smtp_server.sendmail(user,to,msg.as_string())
    except Exception as err:
        print('Sending Mail faild:{0}'.format(err))
    finally:
        smtp_server.quit()
        
def main():
    send_mail(发件人邮箱,密码,收件人邮箱,邮件主题,邮件内容)

if __name__ == '__main__':
    main()

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值