系统上线后,发现数据库慢查询导致整个数据库实例的CPU飙高,优化程序再上线需要一定的时间,无法短时间内解决,这时候应该怎么紧急处理?本文将基于MySQL谈一下慢查询下的应急处理方案。
基于MySQL Query Rewrite
组件
从MySQL 5.7.6
版本开始支持Rewrite Plugin
,可以将符合条件的SQL进行重写。这个特性还是非常有用的,可以根据实际需要去编写符合要求的限制规则。
安装和卸载插件
MySQL的安装目录的share
文件夹下自带install_rewriter.sql
和uninstall_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规则的状态