菜鸟笔记
提升您的技术认知

python定时备份为知笔记数据

前两篇文章讲解了python的定时任务框架apscheduler基础用法和为知笔记的部署。

今天讲一下如何让服务器定时备份数据。

为了防止意外,数据最好是每天都备份,并且最好备份到另外的硬盘上(可以买一块云硬盘,挂载到服务器上(我是在腾讯云做活动买的,15块钱买了100G3年))。

但是每天都人工备份的话,可行性较低。所以计划用APScheduler框架定时触发备份任务。

任务目标:

1、每隔2小时定时备份为知笔记的文件目录数据

2、发送备份成功还是失败的结果

先看效果图:

步骤:

1、新建一个文件pybak_1.py,用于触发备份命令。

import os
import time
import smtplib
from email.mime.text import MIMEText
from email.mime.multipart import MIMEMultipart
from email.utils import formataddr
import sys


def mail_sender(info_msg, to_mail):
    # 定义邮件
    my_sender = 'XXX@qq.com' #发送邮箱,这里是以QQ邮箱为例
    my_pass = 'XXXXXXXXXXXX'  # 这个授权码,是在qq邮箱里账户设置里设置的三方授权码。用pop3,就是Python脚本中登录邮箱时的密码,而不是你平时登录邮箱时的那个密码
    receiver = [formataddr(('cx', to_mail))]
    server = smtplib.SMTP_SSL("smtp.qq.com", 465)
    # 设置邮件内容
    # MIMEMultipart类可以放任何内容
    msg = MIMEMultipart()
    content = info_msg
    # 把内容加进去
    msg.attach(MIMEText(content, 'plain', 'utf-8'))
    # 设置邮件主题
    msg['Subject'] = info_msg
    server.login(my_sender, my_pass)
    server.sendmail(my_sender, receiver, msg.as_string())
    server.quit()


source = ['/data/wizdata/'] # 为知笔记所在的目录
target_dir = '/data1/wiz_bak/' # 要备份到哪里
today = target_dir + time.strftime('%Y%m%d')
now = time.strftime('%H%M%S')
if not os.path.exists(today):
    os.mkdir(today)
    print('Successfully created directory'), today
target = today + os.sep + now + '.zip'
zip_command = "zip -qr '%s' %s" % (target, ' '.join(source))
print(zip_command)

suc_msg = 'wiz笔记备份成功' + time.strftime('%Y%m%d%H%M')
error_msg = 'wiz笔记备份失败' + time.strftime('%Y%m%d%H%M')

try:
    if os.system(zip_command) == 0:
        print('Successful backup to', target)
        mail_sender(suc_msg, 'XXXX@qq.com') # 这里改成接受邮箱
    else:
        print('Failed backup to', target)
        mail_sender(error_msg, 'XXXX@qq.com') # 这里改成接受邮箱
except:
    print("备份失败")
    print(sys.exc_info())
    mail_sender(error_msg, 'XXXX@qq.com') # 这里改成接受邮箱

这里做了几件事:

1.1、定义了一个发送邮件的函数

1.2、用python执行备份命令

1.3、触发备份命令,并发送邮件

2、创建APScheduler框架的定时任务文件:t_apscheduler.py

import os
from apscheduler.schedulers.blocking import BlockingScheduler
from datetime import datetime, date


# os.system : Execute the command in a subshell
def execute():
    os.system('python pybak_1.py')


scheduler = BlockingScheduler()
scheduler.add_job(execute, 'interval', hours=2)
# interval-------------minutes,seconds,hours,days
# scheduler.add_job(execute, 'interval', seconds=1)
scheduler.start()

把参数设置成每隔两小时执行一次:hours=2

3、将文件传到服务器上。

4、在服务器上执行命令

sudo nohup python t_apscheduler.py &

5、tail -f 查看执行结果。

6、检验备份文件,并对比被备份的目录。发现一致。

 并且也正常发送了邮件提醒。

目标达成,结束。