mysql 8.0的rewriter插件不能通过my.cnf配置启用,必须用sql命令install plugin或官方install_rewriter.sql脚本安装,并调用flush_rewrite_rules()刷新规则缓存才生效。

my.cnf里不能直接配查询重写插件
MySQL 8.0 的 rewriter 插件不支持通过 my.cnf 的配置项启用或禁用——它没有类似 query_cache_type 那样的系统变量。试图在配置文件里加 rewriter_enabled=ON 或 plugin-load-add=rewriter 不会生效,也不会报错,但插件始终不会加载。
必须通过 SQL 命令显式安装,且安装后需手动刷新规则缓存才能生效。常见错误现象包括:
- 执行
SHOW VARIABLES LIKE 'rewriter%'查不到任何结果 → 插件根本没装 - 查到了
rewriter_enabled=ON,但 SQL 没被改写 → 忘了调用CALL query_rewrite.flush_rewrite_rules() - 规则插入后立即测试失败 → 规则
enabled字段默认是'YES',但未刷新缓存,规则不在内存中
INSTALL PLUGIN + install_rewriter.sql 二选一即可
两种方式都能完成插件初始化,但推荐用官方脚本,避免漏建表或函数:
- 用脚本(最稳妥):
mysql -u root -p (路径按实际 MySQL 安装目录调整) - 手动安装(需补全依赖):
INSTALL PLUGIN rewriter SONAME 'rewriter.so';,然后手动建query_rewrite.rewrite_rules表、创建load_rewrite_rules函数和flush_rewrite_rules存储过程
验证是否成功:SELECT PLUGIN_NAME, PLUGIN_STATUS FROM INFORMATION_SCHEMA.PLUGINS WHERE PLUGIN_NAME = 'rewriter';,状态必须为 ACTIVE;再查 SHOW GLOBAL VARIABLES LIKE 'rewriter_enabled';,值应为 ON。
插入规则时占位符 ? 的行为很关键
? 是唯一合法的通配符,但它只匹配字面量(literal),不匹配列名、表名、关键字或带引号的字符串。很多规则失效是因为误用了它:
- ✅ 正确:
INSERT INTO query_rewrite.rewrite_rules (pattern, replacement) VALUES('SELECT * FROM users WHERE id = ?', 'SELECT id, name FROM users WHERE id = ?');(?匹配123或'abc'这类值) - ❌ 错误:
WHERE status = '?'(单引号把?变成普通字符,不再通配) - ❌ 错误:
SELECT ? FROM ?(?不能匹配标识符,语法解析直接失败) - ⚠️ 注意:
pattern中的空格、换行、大小写都必须和实际 SQL 完全一致,否则不匹配
测试必须用新连接,且不能带客户端缓存
规则只对新建立的连接生效,已存在的连接不会自动加载更新后的规则。更隐蔽的问题是 MySQL 客户端(如 mysql CLI)自带语句缓存,连续执行相同 SQL 可能返回旧结果,造成“没生效”的错觉:
- 插入规则并执行
CALL query_rewrite.flush_rewrite_rules();后,开一个全新终端连接 MySQL 再测 - 避免用 phpMyAdmin 或某些 ORM 自动拼接的 SQL(比如加了额外注释或空格),先用原生
mysql命令行验证 - 简单验证法:
SELECT 1;改写为SELECT 1 + 1;,执行两次,看结果是不是2
真正容易被忽略的是:插件一旦安装,即使所有规则 enabled='NO',也会带来轻微解析开销;如果线上实例 QPS 极高且无明确改写需求,别装它。











