• 1
  • 2
  • 3
  • 4
  • 5
mysql数据库问题 首 页  »  帮助中心  »  数据库  »  mysql数据库问题
关于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;

  注:样例仅供参考,请结合应用情况自行调整监控条件和运行间隔。

  如问题还未解决,请联系售后技术支持。