mysql 8.0.13+ 并非默认支持tde,必须满足版本≥8.0.13、编译启用innodb_encrypt_tables,且select * from information_schema.innodb_encryption不报错;keyring插件须active,early-plugin-load需置顶,keyring_file_data路径权限严格为700,旧密钥文件须清除,encryption='y'触发copy重建并锁表,日志和binlog需单独配置加密。

确认 MySQL 8.0.13+ 是否真支持 TDE
不是所有 8.0 都能开 TDE——必须是 8.0.13 或更高,且编译时启用了 innodb_encrypt_tables。执行 SELECT VERSION(); 后,再运行 SELECT * FROM information_schema.INNODB_ENCRYPTION;;如果报错 Table 'information_schema.INNODB_ENCRYPTION' doesn't exist,说明当前二进制压根没编译 TDE 支持,升级无效,得换官方社区版或企业版。
keyring_file 插件加载失败的典型表现和修复
插件“存在但不生效”是最常卡住的环节。启动后查 SELECT PLUGIN_NAME, PLUGIN_STATUS FROM INFORMATION_SCHEMA.PLUGINS WHERE PLUGIN_NAME LIKE 'keyring%';,若状态不是 ACTIVE,别急着建表:
-
early-plugin-load=keyring_file.so必须写在[mysqld]段最开头,不能被其他plugin_load_add或插件配置挡住 -
keyring_file_data=/var/lib/mysql-keyring/keyring对应目录必须由mysql用户拥有,且权限为700(禁止 group/other 写入) - 路径不能落在
tmpfs、NFS或 SELinux/AppArmor 限制区域(CentOS/RHEL 上常见拦截) - 旧密钥文件残留会导致初始化失败:删掉
keyring文件再重启
对已有表启用 ENCRYPTION='Y' 的实际影响
ALTER TABLE t1 ENCRYPTION='Y' 不是打个标记,而是触发完整表重建(ALGORITHM=COPY),生产迁移后务必评估:
- 锁表时间 = 表大小 × I/O 带宽,期间所有 DML 阻塞
- 磁盘需预留 ≥1.5 倍表空间,否则报错
ERROR 1767 (HY000): Failed to initialize tablespace - 只加密新写入页,老数据仍明文躺在磁盘上,直到被 purge 或 page split 覆盖
- 必须确保该表使用独立表空间:先查
SHOW CREATE TABLE t1;,若没显式指定TABLESPACE,需先执行ALTER TABLE t1 TABLESPACE=innodb_file_per_table;
日志和 binlog 默认不加密,必须单独开启
TDE 只管 InnoDB 数据页,ib_logfile*、binlog、临时表、undo log 默认仍是明文。迁移后若要真正覆盖静态数据泄露面,得额外配:
-
innodb_redo_log_encrypt=ON(MySQL 8.0.17+) -
binlog_encryption=ON(同上版本) - 这两项开启后同样增加 CPU 开销,且
binlog_encryption会影响主从复制兼容性(旧从库无法解析加密 binlog)
加密不是一劳永逸的事——密钥文件路径权限、表重建时机、日志补加密、老数据残留,每一处都可能让“已加密”的假象掩盖真实风险。











