Linux服务器下Python执行多MySQL存储过程并异常邮件告警方案咨询
实现多MySQL存储过程调用+错误邮件告警+每日定时执行
没问题,我帮你一步步搞定这个需求!咱们分三个核心部分来落地:批量调用存储过程、捕获错误并发送告警邮件、配置每日自动执行的定时任务。
1. 批量调用多个MySQL存储过程
你现在的脚本只能执行单个存储过程,其实扩展起来很简单——把要执行的存储过程名放进一个列表,然后循环逐个执行就行。如果存储过程涉及写操作,记得执行后提交事务;要是只读的话,也可以根据业务调整是否需要提交。
2. 错误捕获与邮件告警
我们用Python的try-except块覆盖所有可能的异常场景(数据库连接失败、存储过程执行报错等),把错误详情收集起来后,用smtplib发送告警邮件。你需要提前准备好邮箱的SMTP配置(比如用163/QQ邮箱,记得开启SMTP服务并获取授权码,不是登录密码哦)。
3. 配置Linux每日定时任务
最后用Linux自带的crontab来设置脚本每日自动运行,这是服务器上最常用的定时任务工具,配置起来很方便。
完整示例脚本
#!/usr/bin/python import MySQLdb import smtplib from email.mime.text import MIMEText from email.header import Header # 核心配置信息,替换成你自己的实际内容 DB_CONFIG = { 'host': 'localhost', 'user': 'your_username', 'password': 'your_password', 'db': 'bddname' } # 按执行顺序列出所有要运行的存储过程 PROCEDURES = ['proc_order_stat', 'proc_user_clean', 'proc_data_sync'] # 邮件告警配置 EMAIL_CONFIG = { 'smtp_server': 'smtp.163.com', # 示例为163邮箱SMTP服务器,其他邮箱自行替换 'smtp_port': 465, 'sender': 'your_alert_email@163.com', 'sender_password': 'your_email_auth_code', # 邮箱SMTP授权码 'receivers': ['ops_team@example.com', 'your_personal_email@xxx.com'] # 告警收件人列表 } def send_alert_email(error_content): """封装发送告警邮件的逻辑""" msg = MIMEText(error_content, 'plain', 'utf-8') msg['From'] = Header("MySQL存储过程执行告警", 'utf-8') msg['To'] = Header("运维负责人", 'utf-8') msg['Subject'] = Header("【紧急】每日存储过程执行失败", 'utf-8') try: # 建立SSL加密的SMTP连接 smtp_client = smtplib.SMTP_SSL(EMAIL_CONFIG['smtp_server'], EMAIL_CONFIG['smtp_port']) smtp_client.login(EMAIL_CONFIG['sender'], EMAIL_CONFIG['sender_password']) smtp_client.sendmail(EMAIL_CONFIG['sender'], EMAIL_CONFIG['receivers'], msg.as_string()) print("告警邮件发送成功") except smtplib.SMTPException as e: print(f"邮件发送失败: {str(e)}") def run_procedures(): db_conn = None cursor = None error_list = [] try: # 初始化数据库连接 db_conn = MySQLdb.connect(**DB_CONFIG) cursor = db_conn.cursor() # 循环执行每个存储过程 for proc_name in PROCEDURES: try: print(f"开始执行存储过程: {proc_name}") # 如果存储过程需要参数,改成 CALL {proc_name}(%s, %s) 并传入参数元组 cursor.execute(f"CALL {proc_name}()") db_conn.commit() # 有写操作必须提交事务 print(f"存储过程 {proc_name} 执行完成") except MySQLdb.MySQLError as e: db_conn.rollback() # 出错后回滚事务 err_msg = f"存储过程 {proc_name} 执行失败: 错误码[{e.args[0]}],错误信息:{e.args[1]}" error_list.append(err_msg) print(err_msg) except MySQLdb.MySQLError as e: err_msg = f"数据库连接失败: 错误码[{e.args[0]}],错误信息:{e.args[1]}" error_list.append(err_msg) print(err_msg) except Exception as e: err_msg = f"未知异常: {str(e)}" error_list.append(err_msg) print(err_msg) finally: # 无论成功失败,都要关闭游标和连接 if cursor: cursor.close() if db_conn: db_conn.close() # 收集到错误就发送告警邮件 if error_list: full_error = "\n\n".join(error_list) send_alert_email(full_error) if __name__ == "__main__": run_procedures()
脚本使用步骤
- 替换配置:把脚本里的
DB_CONFIG、PROCEDURES、EMAIL_CONFIG换成你自己的实际信息。 - 添加执行权限:给脚本加可执行权限:
chmod +x your_script.py - 手动测试:先手动运行脚本验证功能:
python your_script.py,检查存储过程是否正常执行,错误场景下是否能收到告警邮件。
配置每日定时任务(crontab)
- 打开crontab编辑界面:
crontab -e - 添加一行定时规则,比如每天凌晨1点执行脚本:
0 1 * * * /usr/bin/python3 /absolute/path/to/your_script.py >> /absolute/path/to/script_run.log 2>&1
- 规则解释:
0 1 * * *代表每天凌晨1点执行;/usr/bin/python3是你的Python解释器路径(可以用which python3查看);/absolute/path/to/your_script.py是脚本的绝对路径;>> /absolute/path/to/script_run.log 2>&1是把脚本的输出和错误日志写入指定文件,方便后续排查问题。
- 保存退出后,crontab会自动生效,用
crontab -l可以查看已设置的定时任务。
注意事项
- 确保服务器能访问邮箱的SMTP服务器(比如开放465/587端口)。
- 如果存储过程需要传入参数,修改
cursor.execute的语句,比如cursor.execute(f"CALL {proc_name}(%s, %s)", (param1, param2))。 - 定期检查脚本日志,确保定时任务正常运行。
内容的提问来源于stack exchange,提问作者user8772487
相关产品推荐
相关产品推荐

