tidb快照备份并发送企业微信机器人通知

使用的tidb br工具进行快照备份,存储在本地目录
成功和失败的消息样式

具体代码分为三个文件:
1.baktidb.py #用来执行br命令进行快照备份的脚本
2.config.py #用来配置企业微信机器人的配置,config文件可以省略,具体配置直接配置在qiyewx.py里面
3.qiyewx.py #用来发送企业微信消息(markdown格式)

qiyewx.py代码如下

import json
from datetime import datetime
import requests
from config import *    #如果省略config.py,可以注释掉这行

class Qiyewx():

    def __init__(self):
        self.corpid = corpid    # 企业微信CorpID
        self.corpsecret = corpsecret  # 应用的Secret
        self.agentid = agentid   # 应用的AgentID
        self.touser = touser     # 接收提醒的用户账号,多个用户用竖线分隔
        self.token = self.get_access_token()

    def get_access_token(self):
        rep = requests.get(
            f"https://qyapi.weixin.qq.com/cgi-bin/gettoken?corpid={self.corpid}&corpsecret={self.corpsecret}")
        access_token = json.loads(rep.text).get('access_token')
        return access_token

    def send_markdown_msg(self,msg):
        header = {
            "Content-Type": "application/json"
        }
        data = {
            "touser": self.touser,
            "msgtype": "markdown",
            "agentid": self.agentid,
            "markdown": {
                "content": msg
            }
        }
        rep = requests.post(f'https://qyapi.weixin.qq.com/cgi-bin/message/send?access_token={self.token}',
                            headers=header, data=json.dumps(data))
        print(rep.text)

baktidb.py代码如下

import psutil
import os
import subprocess
from datetime import datetime
from qiyewx import Qiyewx
BACKUP_PATH = '/tidb/backup/xxxx-' + datetime.strftime(datetime.now(), '%Y-%m-%d') #更换成自己的存储目录,也可以使用aws的S3


def getsize(top):
    sum_size = 0
    for root, dirs, files in os.walk(top, topdown=False):
        for name in files:
            size = os.path.getsize(os.path.join(root, name))
            sum_size = sum_size + size
    return f"{sum_size / (1024 ** 3):.2f} GB"


bak_command = f"""/root/.tiup/bin/tiup br backup full --pd "PD地址" --storage "local://{BACKUP_PATH}" --ratelimit 120 --log-file {BACKUP_PATH}.log"""  #如果不使用本地存储把local://换成对应存储
try:
  retcode, output = subprocess.getstatusoutput(bak_command)
  e = Qiyewx()
  if retcode != 0:
      msg = f"**数据库备份**\n>备份时间: {datetime.strftime(datetime.now(), '%Y-%m-%d')} \n>备份目录: {BACKUP_PATH}\n>备份结果: <font color =\"warning\">**失败**</font> \n>消息: {output}"
      e.send_markdown_msg(msg)
  elif retcode == 0:
      a = getsize(BACKUP_PATH)
      usage = psutil.disk_usage('/')
      free_disk = f"{usage.free / (1024 ** 3):.2f}GB"
      msg = f"**数据库备份**\n>备份时间: {datetime.strftime(datetime.now(), '%Y-%m-%d')} \n>备份目录: {BACKUP_PATH}\n>数据大小: {a}\n>备份结果: <font color =\"info\">**正常**</font> \n>剩余磁盘空间: {free_disk}"
      e.send_markdown_msg(msg)
except Exception as e:
  msg = f"**数据库备份**\n>备份时间: {datetime.strftime(datetime.now(), '%Y-%m-%d')} \n>备份目录: {BACKUP_PATH}\n>备份结果: <font color =\"warning\">**失败**</font> \n>消息: {e}"
  e.send_markdown_msg(msg)
posted @ 2023-08-22 14:52  橙沉尘衬  阅读(66)  评论(1)    收藏  举报