如何编写Python脚本终止超过阈值时长的Mongo查询?
如何编写Python脚本终止运行时长超过阈值的Mongo查询
要终止运行时间超过设定阈值的MongoDB查询,核心是利用MongoDB的currentOp()获取当前运行操作,筛选出超时的用户查询后调用killOp()终止。以下是实现该功能的Python函数:
from pymongo import MongoClient def terminate_long_running_queries(threshold_minutes=15): # 连接MongoDB(根据实际部署调整连接参数,比如添加认证、集群地址) client = MongoClient("mongodb://localhost:27017/") admin_db = client.admin # 获取当前所有运行中的操作 current_ops = admin_db.command("currentOp")["inprog"] threshold_microsecs = threshold_minutes * 60 * 1000000 # 转换为微秒 for op in current_ops: # 过滤出符合条件的超时查询: # 1. 属于用户查询类操作(query/find/aggregate) # 2. 运行时长超过阈值 # 3. 排除系统内部操作与admin库的系统任务 if ( op.get("op") in ["query", "find", "aggregate"] and op.get("microsecs_running", 0) > threshold_microsecs and not op.get("ns", "").startswith("admin.") and not op.get("desc", "").startswith("rsSync") # 排除副本集同步操作 ): op_id = op["opid"] run_time = op["microsecs_running"] / (1000000 * 60) print(f"终止超时查询:OPID {op_id},运行时长 {run_time:.2f} 分钟") # 执行终止操作 admin_db.command("killOp", opid=op_id) if __name__ == "__main__": terminate_long_running_queries(threshold_minutes=15)
关键说明
- 权限要求:执行脚本的MongoDB账号必须拥有
clusterAdmin或hostManager角色权限,否则无法调用killOp命令。 - 过滤规则:示例中的条件可根据业务调整,比如通过
ns字段指定监控特定数据库/集合,或通过client字段定位特定客户端的查询。 - 时间转换:MongoDB返回的
microsecs_running是操作已运行的微秒数,需转换为分钟与阈值对比。 - 安全验证:测试阶段建议先注释
killOp调用,仅打印符合条件的操作,确认无误后再执行终止。
扩展建议
可以将该脚本配置为定时任务(如Linux cron),定期自动检查并终止超时查询,无需手动执行。
内容的提问来源于stack exchange,提问作者Marcus
相关产品推荐
相关产品推荐

