MySQL慢查询影响业务要怎么紧急处理?


系统上线后,发现数据库慢查询导致整个数据库实例的CPU飙高,优化程序再上线需要一定的时间,无法短时间内解决,这时候应该怎么紧急处理?本文将基于MySQL谈一下慢查询下的应急处理方案。

基于MySQL Query Rewrite组件

MySQL 5.7.6版本开始支持Rewrite Plugin,可以将符合条件的SQL进行重写。这个特性还是非常有用的,可以根据实际需要去编写符合要求的限制规则。

安装和卸载插件

MySQL的安装目录的share文件夹下自带install_rewriter.sqluninstall_rewriter.sql。可以通过以下方式来进行安装和卸载:

shell> mysql -u root -p < install_rewriter.sql
Enter password: (enter root password here)

执行后可以通过命令查看:

mysql> SHOW GLOBAL VARIABLES LIKE 'rewriter_enabled';
+------------------+-------+
| Variable_name    | Value |
+------------------+-------+
| rewriter_enabled | ON    |
+------------------+-------+

同样的,卸载命令如下:

shell> mysql -u root -p < uninstall_rewriter.sql
Enter password: (enter root password here)

安装之后可以看到MySQL实例上增加了一个名叫query_rewrite的数据库。

设置重写规则

规则保存在query_rewrite.rewrite_rules表。重写规则可以参照以下例子:

-- 插入替换规则,只要匹配的语句直接替换
INSERT INTO query_rewrite.rewrite_rules
    (pattern, replacement) VALUES(
    'SELECT * FROM appdb.users WHERE id = ?',
    'SELECT * FROM appdb.users WHERE user_id = ?'
    );
-- 插入替换规则,指定数据库匹配的语句直接替换
INSERT INTO query_rewrite.rewrite_rules
    (pattern, replacement, pattern_database) VALUES(
    'SELECT * FROM users WHERE id = ?',
    'SELECT * FROM users WHERE user_id = ?',
    'appdb'
    );
-- 调用存储过程让规则生效
CALL query_rewrite.flush_rewrite_rules();

备注:设置之后一定要执行query_rewrite.flush_rewrite_rules()生效规则,如果没执行可能会导致误以为添加了但是不生效。

设置规则后还可以通过修改规则的启用状态来控制是否生效,如下:

-- enabled有2个值,YES生效,NO禁用
UPDATE query_rewrite.rewrite_rules SET enabled = 'NO' WHERE id = 1;
-- 还是要继续执行
CALL query_rewrite.flush_rewrite_rules();

阿里云SQL限流功能

  • 登录DAS控制台;
  • 在左侧导航栏中单击实例监控;
  • 单击对应的数据库实例名称,进入实例详情页;
  • 进入实例会话页面,具体操作请参见实例会话;
  • 实例会话页面,单击SQL限流
    SQL限流界面
  • SQL限流(过滤)对话框,单击页面左上角创建
    创建限流
  • 在创建SQL限流规则对话框中,填入相应信息,单击创建
    创建限流字段信息
  • SQL限流规则创建完成后,您可以在SQL限流列表查看SQL规则的状态
    限流规则列表

参考资料


文章作者: zzq0324
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 zzq0324 !
  目录