基于Cronjob的MySQL数据更新及同步邮件发送需求
实现每分钟执行的MySQL更新+邮件通知Cron任务
我来帮你梳理这个需求的具体实现方案,分步骤来落地:
1. 编写核心处理脚本(Python示例)
首先咱们写一个Python脚本,搞定数据库查询更新和邮件发送的逻辑。这里假设你的表有一个create_time字段(记录数据创建时间),用来判断是否达到1分钟时长;目标是把status从1更新为2,同时给对应email发通知。
先安装依赖包:
pip install mysql-connector-python python-dotenv
然后写脚本update_and_notify.py:
import mysql.connector import smtplib from email.mime.text import MIMEText from dotenv import load_dotenv import os from datetime import datetime # 加载环境变量(建议把敏感信息放.env文件里,不要硬编码) load_dotenv() def connect_db(): """连接MySQL数据库""" try: conn = mysql.connector.connect( host=os.getenv('DB_HOST'), user=os.getenv('DB_USER'), password=os.getenv('DB_PASSWORD'), database=os.getenv('DB_NAME') ) return conn except mysql.connector.Error as err: print(f"数据库连接失败: {err}") return None def send_email(to_email, title): """发送通知邮件""" smtp_server = os.getenv('SMTP_SERVER') smtp_port = int(os.getenv('SMTP_PORT')) smtp_user = os.getenv('SMTP_USER') smtp_password = os.getenv('SMTP_PASSWORD') msg = MIMEText(f"您的记录【{title}】状态已更新!", 'plain', 'utf-8') msg['From'] = smtp_user msg['To'] = to_email msg['Subject'] = "记录状态更新通知" try: with smtplib.SMTP_SSL(smtp_server, smtp_port) as server: server.login(smtp_user, smtp_password) server.sendmail(smtp_user, to_email, msg.as_string()) print(f"邮件已发送至 {to_email}") except Exception as e: print(f"发送邮件失败: {e}") def main(): conn = connect_db() if not conn: return cursor = conn.cursor(dictionary=True) try: # 1. 查询符合条件的记录(创建时长≥1分钟,且status为1) query = """ SELECT id, title, email FROM your_table_name WHERE TIMESTAMPDIFF(MINUTE, create_time, NOW()) >= 1 AND status = 1 FOR UPDATE; -- 加行锁,防止并发重复处理 """ cursor.execute(query) records = cursor.fetchall() if not records: print(f"{datetime.now()}: 没有符合条件的记录") return # 2. 批量更新状态 + 发送邮件 for record in records: # 更新status为2 update_query = """ UPDATE your_table_name SET status = 2 WHERE id = %s """ cursor.execute(update_query, (record['id'],)) conn.commit() # 发送邮件 send_email(record['email'], record['title']) print(f"{datetime.now()}: 成功处理 {len(records)} 条记录") except mysql.connector.Error as err: conn.rollback() print(f"数据库操作失败: {err}") finally: cursor.close() conn.close() if __name__ == "__main__": main()
别忘了创建.env文件存放敏感信息:
# 数据库配置 DB_HOST=localhost DB_USER=your_db_user DB_PASSWORD=your_db_password DB_NAME=your_db_name # 邮件SMTP配置(比如用QQ邮箱的话,SMTP_SERVER是smtp.qq.com,端口465) SMTP_SERVER=smtp.your-email-provider.com SMTP_PORT=465 SMTP_USER=your-email@example.com SMTP_PASSWORD=your-email-auth-code # 注意是授权码不是登录密码
2. 设置Cronjob每分钟执行
接下来配置Cron,让脚本每分钟跑一次:
- 打开Cron编辑界面:
crontab -e
- 添加以下一行(替换成你的脚本路径和Python路径):
* * * * * /usr/bin/python3 /path/to/update_and_notify.py >> /var/log/cron_update_notify.log 2>&1
* * * * *表示每分钟执行一次/usr/bin/python3是你的Python解释器路径(可以用which python3查看)- 后面的日志路径用来记录脚本运行情况,方便排查问题
- 保存退出后,Cron会自动加载新的任务。你可以用
crontab -l查看当前的Cron任务列表。
3. 关键注意事项
- 避免重复处理:脚本里用了
FOR UPDATE加行锁,同时更新后把status改成2,这样下次查询就不会再选中这条记录,防止重复处理。 - 异常处理:脚本里加了数据库连接、操作的异常捕获,还有邮件发送的异常处理,避免因为某一条记录失败导致整个脚本崩溃。
- 日志监控:定期查看
/var/log/cron_update_notify.log,如果有错误及时排查。 - 资源占用:如果数据量很大,建议优化查询语句,或者限制每次处理的记录数量,避免脚本运行时间超过1分钟导致并发问题。
内容的提问来源于stack exchange,提问作者Fat-Bee
相关产品推荐
相关产品推荐

