必须使用component_keyring_file(社区版)或keyring_encrypted_file(企业版),禁用已弃用的keyring_file插件;需确认mysql版本≥8.0.34、区分社区/企业版;通过manifest文件加载组件;密钥路径须显式配置且目录安全;主密钥须手动预置合法json结构,否则静默失败。

必须用 component_keyring_file(社区版)或 keyring_encrypted_file(企业版),不能用已弃用的 keyring_file 插件——8.0.34+ 版本中该插件仅兼容,官方明确标记为“deprecated”,后续版本将移除。
确认 MySQL 版本与可用密钥组件
先查清你手头的 MySQL 实际版本和发行版类型:
- 运行
SELECT VERSION(), @@version_comment;,重点看是否 ≥ 8.0.34; - 执行
SHOW VARIABLES LIKE 'version_compile_os';和SELECT @@license;判断是社区版(GPL)还是企业版(Commercial); - 社区版只带
component_keyring_file,路径通常在@@plugin_dir下可列出:ls -l $(mysql -Nse "SELECT @@plugin_dir;")/component_keyring_file.*。
加载 component_keyring_file 组件(社区版必需步骤)
MySQL 8.0.16+ 起,密钥管理改用 component 模型,INSTALL PLUGIN 不再生效。必须通过 manifest 文件声明加载:
- 找到
mysqld可执行文件所在目录:dirname $(which mysqld); - 在此目录下创建
mysqld.my(注意无扩展名),内容为 JSON 格式:{ "components": "file://component_keyring_file" }; - 权限必须严格:
chown root:mysql mysqld.my && chmod 644 mysqld.my(MySQL 进程用户只能读,不能写); - 配置文件中无需再写
early-plugin-load,该参数对 component 无效。
配置 component_keyring_file 的密钥存储路径
组件本身不自动创建密钥文件,需显式指定其读写位置,并确保路径安全:
- 在
@@plugin_dir目录下(如/usr/lib64/mysql/plugin/)新建配置文件:component_keyring_file.cnf; - 内容为纯 JSON,不可有注释或多余空格:
{ "path": "/var/lib/mysql-keyring/keyring", "read_only": false }; -
path对应的目录必须由mysql用户可读写:mkdir -p /var/lib/mysql-keyring && chown mysql:mysql /var/lib/mysql-keyring; - 该路径不能是
/tmp、/dev/shm或符号链接,否则组件启动失败且无明确报错。
主密钥不能依赖自动生成
MySQL 启动时若发现 keyring 文件不存在,会生成一个随机 master key 并写入——但这个 key 不可导出、不可备份、不可迁移。一旦文件损坏,所有加密表永久失效(查询返回空或乱码,SHOW CREATE TABLE 却仍显示 ENCRYPTION='Y')。
- 务必手动预置:用
openssl rand -hex 32生成 64 字符 hex 密钥; - 构造合法 JSON 写入
/var/lib/mysql-keyring/keyring(注意不是.cnf文件):{ "key": "a1b2c3d4...", "id": "master-key-1", "type": "AES" }; -
id必须全局唯一、不含空格或特殊字符; - 验证是否生效:
SELECT * FROM performance_schema.keyring_keys;应返回一行,KEY_ID为master-key-1。
最容易被忽略的是:密钥文件路径由组件配置文件控制,而非 my.cnf;主密钥内容必须是完整 JSON 结构,少一个引号或换行都会导致组件静默失败——错误日志里只有 “Failed to initialize keyring” 这类模糊提示,不会指出哪一行 JSON 错了。











