禁用插件前须确认必要性:validate_password、mysqlx、keyring_file可按需禁用,而binlog、innodb、performance_schema为核心功能不可禁用;federated、archive、blackhole、myisam仅在无依赖时方可安全禁用,需通过show plugins和information_schema.tables验证,并使用disabled_storage_engines(5.7.28+/8.0.19+有效)或注释plugin-load配置,且必须重启生效。

禁用插件前先确认是否真有必要
不是所有插件都适合禁用。MySQL 8.0 默认加载的插件中,validate_password、mysqlx、keyring_file 等属于“按需启用”,而 binlog、innodb、performance_schema 是核心功能,禁用会导致服务无法启动或系统表不可用。真正可安全禁用的通常是:FEDERATED、ARCHIVE、BLACKHOLE、MyISAM(仅当确认无依赖时)。
执行 SHOW PLUGINS; 查看当前状态,重点关注 ACTIVE 且业务未使用的插件;再查 SELECT table_schema, table_name, engine FROM information_schema.tables WHERE engine IN ('FEDERATED', 'ARCHIVE'); 确认无实际表依赖。
用 disabled_storage_engines 禁用存储引擎(MyISAM/ARCHIVE等)
这个配置项只在 MySQL 5.7.28+ 和 8.0.19+ 有效,8.0.45 支持,但 8.0.16 不支持——先用 SELECT VERSION(); 确认版本。写错版本会直接导致 mysqld 启动失败,报错类似 unknown variable 'disabled_storage_engines'。
- 必须放在
[mysqld]段内,不能用SET GLOBAL动态设置 - 值必须是英文双引号包裹的字符串,逗号分隔:
disabled_storage_engines = "MyISAM,ARCHIVE,FEDERATED,BLACKHOLE" - 漏掉引号、用单引号、或多加空格都会静默失效(
mysqld不报错但不生效) -
CREATE TABLE t2 AS SELECT * FROM t1会绕过该限制:如果t1是 MyISAM 表,t2仍会被建为 MyISAM,必须显式写ENGINE=InnoDB
用 plugin-load 卸载非存储引擎类插件(如 mysqlx、validate_password)
对非存储引擎插件(比如 mysqlx、validate_password、keyring_file),disabled_storage_engines 不起作用,得靠配置文件注释或显式禁用。
在 [mysqld] 段中,找到类似 plugin-load = mysqlx.so 或 plugin-load-add = validate_password.so 的行,直接注释掉:
# # plugin-load = mysqlx.so # plugin-load-add = validate_password.so
注意:plugin-load 是覆盖式加载,plugin-load-add 是追加式;两者都注释才彻底禁用。改完必须重启 mysqld,否则无效。
某些插件(如 keyring_file)若已加载,还需在启动前删掉对应 keyring 文件(如 /var/lib/mysql/keyring/keyring_file_data),否则重启时可能因残留数据报错。
禁用后必须验证是否真正生效
重启后别急着认为完事了。几个关键检查点:
- 运行
SHOW PLUGINS;,确认目标插件状态为DISABLED或根本不出现在列表里(取决于禁用方式) - 查
SELECT ENGINE FROM information_schema.TABLES WHERE TABLE_SCHEMA NOT IN ('mysql', 'information_schema', 'performance_schema');,确保无残余 MyISAM/ARCHIVE 表 - 执行
mysql_upgrade前务必临时移除disabled_storage_engines配置——它会在升级过程中尝试建 MyISAM 临时表,直接卡在ERROR 3161 - 备份恢复时,SQL 文件里若含
ENGINE=MyISAM,即使禁用了也会建表成功,这是设计行为,不是 bug
最常被忽略的是:禁用插件 ≠ 禁用功能入口。比如禁用了 mysqlx 插件,但客户端仍可能尝试连 X Protocol 端口(33060),只是连接后立刻断开——这种“静默失败”容易误判为网络问题。











