必须先确认表空间是否启用加密,再同步keyring_file文件。执行SELECT TABLE_SCHEMA, TABLE_NAME, CREATE_OPTIONS FROM INFORMATION_SCHEMA.TABLES WHERE CREATE_OPTIONS LIKE '%ENCRYPTION="Y"%'和SELECT NAME, ENCRYPTION, STATE FROM INFORMATION_SCHEMA.INNODB_TABLESPACES WHERE NAME LIKE 'db_name/%'验证加密状态;keyring_file_data路径、权限(600)、属主(mysql:mysql)、内容哈希四者必须完全一致,且early-plugin-load=keyring_file.so须置于my.cnf[mysqld]段最开头。

迁移前必须确认表空间是否启用加密
直接执行 mysqldump 或拷贝 .ibd 文件却没查加密状态,是多数失败的起点。MySQL 不会在导出时提示“该表已加密”,也不会拒绝导出——但恢复后会报 Tablespace is encrypted but encryption plugin is not active。
- 先运行:
SELECT TABLE_SCHEMA, TABLE_NAME, CREATE_OPTIONS FROM INFORMATION_SCHEMA.TABLES WHERE CREATE_OPTIONS LIKE '%ENCRYPTION="Y"%' - 再确认表空间级加密是否生效:
SELECT NAME, ENCRYPTION, STATE FROM INFORMATION_SCHEMA.INNODB_TABLESPACES WHERE NAME LIKE 'db_name/%' - 若
ENCRYPTION='Y'且STATE='active',说明该表空间确为加密状态,不能跳过 keyring 同步
keyring_file 必须原路径、原权限、原内容同步
MySQL 加载 keyring_file 插件时,校验的是文件路径、属主、权限、内容哈希四重一致性。任意一项不匹配,插件初始化失败,但日志里可能只写 Failed to load keyring file,不提具体原因。
-
keyring_file_data配置路径必须完全一致:比如源库是/var/lib/mysql-keyring/keyring,目标库my.cnf中也得写这个绝对路径,不能只复制文件再改配置 - 文件权限必须是
600,属主必须是运行mysqld的用户(通常是mysql:mysql),否则插件加载静默失败 - 严禁用文本编辑器打开修改
keyring文件:JSON 格式稍有空格或换行,MySQL 启动时就会报Keyring file is corrupted - 若用了
keyring_encrypted_file,还得一并迁移其解密密码(通过keyring_encrypted_file_password配置项传入)
物理迁移时必须停写 + 显式刷新表空间
直接 cp 正在写的 .ibd 文件,极易导致页加密状态不一致。Buffer pool 中缓存的页可能未落盘,或加密密钥版本尚未同步,恢复后首次查询就报 Encrypted tablespace page decryption failed。
- 单表迁移:执行
FLUSH TABLES tbl_name FOR EXPORT,再拷贝.ibd和.cfg - 全库迁移:先
FLUSH TABLES WITH READ LOCK,再FLUSH ENGINE LOGS,确保所有脏页刷盘、加密元数据固化 - 拷贝前检查
.ibd文件大小是否稳定(ls -l多次观察无变化),避免截断 - 目标实例启动前,确认
early-plugin-load=keyring_file.so在my.cnf的[mysqld]段最开头,不能被其他插件配置覆盖
AES 字段加密与表空间加密不能混为一谈
很多人把 AES_ENCRYPT() 字段级加密和 innodb_encrypt_tables=ON 表空间加密当成一回事,结果在迁移中同时处理两套逻辑,反而互相干扰。
-
AES_ENCRYPT()是应用层逻辑,密文存在VARBINARY或BLOB字段里,迁移只需保证密钥、模式、填充、字符集一致;而表空间加密是 InnoDB 层透明加解密,密钥由 keyring 管理,与字段内容无关 - 如果一张表既启用了表空间加密,又对某些字段做了
AES_ENCRYPT(),迁移时要分别验证:keyring 是否加载成功 +AES_DECRYPT()是否返回明文 - 常见误操作:用
mysqldump导出加密表空间的表,再导入到未启用 keyring 的实例——dump 文件本身不包含加密密钥,导入后表能建,但无法打开数据页
0、early-plugin-load 写错位置,都会让 MySQL 静默跳过解密流程,直到你第一次 SELECT 才暴露问题。这些点没有报错日志兜底,只能靠迁移前逐项核对。


















