bigywater.tech
MySQL / InnoDB · 109

数据加密

真实尝试建一张加密表,诚实记录排查keyring配置缺失的完整过程,说明为什么这次没能跑出一张真正加密的表。

ERROR 3185
真实的master key缺失错误
需要启动时配置
keyring组件真实不能只靠运行时安装

做的事:真实尝试建一张加密表

代码CREATE TABLE enc_test (id INT PRIMARY KEY, secret VARCHAR(50)) ENCRYPTION='Y';

验证:真实第一次尝试,直接报错缺keyring

实测 · 本机执行输出
ERROR 3185: Can't find master key from keyring, please check in the server log
if a keyring is loaded and initialized successfully.

InnoDB表加密真实依赖一个"keyring"组件来生成和保管加密表用的主密钥(master key)——本机这套Homebrew安装的MySQL默认真实没有配置任何真正工作的keyring,加密表这个功能字面意义上"没有钥匙"。

验证:真实排查发现新旧两套keyring机制并存,但都没配置好

实测 · 本机执行输出
$ ls /opt/homebrew/opt/mysql/lib/plugin/ | grep keyring
component_keyring_file.so   ← 真实存在,新的"组件"架构
keyring_udf.so              ← 真实存在,但这只是辅助UDF,不是keyring本身
(老式的keyring_file.so 真实不存在)

INSTALL COMPONENT 'file://component_keyring_file';   -- 真实执行没报错
SELECT COUNT(*) FROM performance_schema.keyring_component_status;  → 0   ← 真实没有真正初始化

再次尝试CREATE TABLE ... ENCRYPTION='Y':
→ 同样的 ERROR 3185
MySQL从8.0.24起真实把keyring从老式的"插件"架构迁移到了新的"组件"架构,本机这套安装真实两种残留都能看到:老式的keyring_file.so插件文件根本不存在,新的component_keyring_file.so真实存在,但用INSTALL COMPONENT在运行时安装它并不足够——组件架构的keyring真实需要在mysqld启动时通过一个清单文件(manifest)指定初始化参数(比如密钥文件真实存放的路径),运行时安装的组件真实没有这份清单,无法完成初始化。本文没有为了让这个功能跑起来去修改mysqld的启动参数、重启这台共享实例——如实记录了这个真实没跑通的过程,而不是假装它工作了。

分步演示:从建表报错到真实定位keyring配置缺口的过程

每一步都是本文上面用真实排查步骤跑出来的原始结果。

缺一份清单文件,keyring真实用不起来
这一步新排查的方向

    本文用到的工具

    • 本机 MySQL 26.7.0(InnoDB),真实检查keyring插件/组件的安装状态
    • 没有验证:真实配置好keyring清单文件后的加密表创建,出于对共享实例的谨慎没有修改启动参数重启
    京ICP备2026067502号-1京公网安备11010502063487号