关于RDS MySQL 管理长时间运行查询的说明
发布日期:2015-11-8 14:11:18
关于RDS MySQL 管理长时间运行查询的说明 1. 长时间查询带来的问题: 相对于应用来说,通常没有意义(区别于报表类查询)。 消耗系统资源,比如,多个长时间查询会通常会导致CPU过高、IOPS 打满、连接数打满等问题。 带来系统不稳定的隐患(比如,Innodb引擎表上的长时间查询可能会导致ibdata1 系统文件尺寸的增加)。 2. 出现长时间运行查询的原因: 在使用RDS MySQL 的过程中,由于某些原因,比如SQL执行效率较差、被SQL注入、DDL语句引起表元数据锁等待等等,会出现运行时间很长的查询。 由于SQL执行效率差而导致的长时间查询: 由于被SQL注入而导致的长时间查询: 由于DDL语句引起表元数据锁等待: 注:对于元数据锁等待的问题的处理,请参考:RDS MySQL 表上 Metadata lock 的产生和处理 3.如何避免长时间查询: 应用方面注意防止SQL注入。 尽量在业务低峰期进行索引创建删除、表结构修改、表维护和表删除操作。 在新功能模块上线前,进行压力测试,避免出现执行效率很差的SQL大量执行的情况。 4. 如何处理长时间查询: 通过DMS =》实例信息 =》实例会话 检查实例当前运行的会话,清理长时间的查询。 Kill会话 - 终止选的的会话。 优化 - 给出对选择的会话查询的优化建议。 通过命令 show processlist; 查看当前执行会话,清理长时间查询。 创建MySQL事件,自动清理长时间执行的查询。 比如下面的代码会每5分钟清理一次当前用户运行时间超过1个小时且非锁等待会话。 create event my_long_running_query_monitor on schedule every 5 minute starts '2015-09-15 11:00:00' on completion preserve enable do begin declare v_sql varchar(500); declare no_more_long_running_query integer default 0; declare c_tid cursor for select concat ('kill ',id,';') from information_schema.processlist where time >= 3600 and user = substring(current_user(),1,instr(current_user(),'@')-1) and command not in ('sleep') and state not like ('waiting for table%lock'); declare continue handler for not found set no_more_long_running_query=1; open c_tid; repeat fetch c_tid into v_sql; set @v_sql=v_sql; prepare stmt from @v_sql; execute stmt; deallocate prepare stmt; until no_more_long_running_query end repeat; close c_tid; end; 注:样例仅供参考,请结合应用情况自行调整监控条件和运行间隔。 如问题还未解决,请联系售后技术支持。
|