MySQL 8.0 TDE 不是配置重启即生效,必须同时满足版本真实支持(查 INNODB_ENCRYPTION 表和 innodb_encrypt% 变量)、keyring_file 插件 ACTIVE 且配置合规(early-plugin-load 位置正确、目录权限700、路径非受限区域)、表为独立表空间三条件,缺一则 .ibd 仍明文。

MySQL 8.0 的 TDE 不是“配完重启就生效”的功能,必须确认版本真实支持、keyring 插件真正 ACTIVE、表空间满足独立条件,三者缺一,ENCRYPTION='Y' 就只是语法通过,.ibd 文件依然明文落盘。
确认 MySQL 是否真支持 TDE(不是看版本号就信)
执行 SELECT VERSION(); 返回 8.0.34 不代表能用 TDE。社区版默认不编译加密模块,企业版也需对应小版本明确支持。必须验证:
- 运行
SELECT * FROM information_schema.INNODB_ENCRYPTION;—— 若报错Table 'information_schema.INNODB_ENCRYPTION' doesn't exist,说明二进制压根没 TDE 支持 - 执行
SHOW VARIABLES LIKE 'innodb_encrypt%';,至少应返回innodb_encrypt_tables等变量;若无输出,同样不支持 - 企业版用户请核对官网发行说明中该版本是否标注 “TDE support”;社区版用户建议改用官方提供的 MySQL 8.0.34+ 企业试用版验证
加载 keyring 插件的硬性要求(插件状态为 DISABLED 是常态)
插件“存在但未初始化”是最常见卡点。关键不是加没加配置,而是细节是否合规:
-
early-plugin-load=keyring_file.so必须写在[mysqld]段最开头,不能带路径(如/usr/lib/mysql/plugin/keyring_file.so会直接导致 mysqld 启动失败) -
keyring_file_data=/var/lib/mysql-keyring/keyring对应目录需由mysql用户完全拥有,权限严格为700;755或777均触发Plugin 'keyring_file' init function returned error - 该路径不能位于
tmpfs、NFS、/run或 SELinux/AppArmor 限制区域;CentOS/RHEL 上可用ausearch -m avc -ts recent查拦截原因 - 启动前务必清空旧密钥文件:
rm -f /var/lib/mysql-keyring/keyring,MySQL 首次启动时会自动创建并初始化
让一张已有 InnoDB 表真正加密的实操步骤
ALTER TABLE t1 ENCRYPTION='Y' 不是加个标记,而是触发全表重建(ALGORITHM=COPY),老数据不会自动重写:
- 先确认表用独立表空间:执行
SHOW CREATE TABLE t1;,若无TABLESPACE = innodb_file_per_table且非显式指定共享表空间,才满足前提;否则需先执行ALTER TABLE t1 TABLESPACE=innodb_file_per_table; - 执行
ALTER TABLE t1 ENCRYPTION='Y';—— 单引号不能省,值只能是'Y'或'N',ON/TRUE会报错ERROR 1064 - 验证是否生效:查
SELECT NAME, ENCRYPTION_TYPE FROM INFORMATION_SCHEMA.INNODB_TABLESPACES WHERE NAME LIKE '%t1%';,返回AES表示已加密
容易被忽略的加密边界(日志、binlog、undo 等仍明文)
TDE 只作用于 InnoDB 独立表空间(.ibd),其他关键落盘文件默认仍是明文:
-
ib_logfile*(redo log)需额外配innodb_redo_log_encrypt=ON(MySQL 8.0.17+) -
binlog需额外配binlog_encryption=ON(同上版本),但开启后旧从库无法解析,主从兼容性断裂 - undo log、临时表、查询缓存、客户端传输过程均不加密,TDE 本身不解决这些面
- 密钥文件
keyring存于本地磁盘,未做密钥分离或 KMS 托管,不符合等保/PCI DSS 对密钥管理的强要求


















