mysql 8.0.14+才支持binlog_encryption,低于该版本设了无效;必须在[mysqld]段配置early-plugin-load、keyring_file_data和binlog_encryption=on并重启,且密钥文件损坏将导致加密日志永久不可读。

MySQL 8.0.14+ 才支持 binlog_encryption,低于这个版本设了也白设,日志照样明文。
确认 MySQL 版本和变量是否可用
先查版本:SELECT VERSION(); —— 必须 ≥ 8.0.14。低于该版本(比如 8.0.13 或任何 5.7)压根不识别 binlog_encryption 变量,SHOW VARIABLES LIKE 'binlog_encryption' 要么报错“Unknown system variable”,要么直接没结果。
binlog_encryption 是只读变量,运行时执行 SET GLOBAL binlog_encryption = ON 会报错:Variable 'binlog_encryption' is a read only variable。必须靠配置文件或启动参数启用。
必须在 [mysqld] 段加载 keyring 插件
光写 binlog_encryption=ON 不行,MySQL 启动时找不到密钥环服务,就会静默降级为未加密,并在错误日志里记一条警告:Failed to initialize binlog encryption keyring 或 Keyring service not found。
正确做法是:在 [mysqld] 下同时配置插件加载和路径:
[mysqld] early-plugin-load=keyring_file.so keyring_file_data=/var/lib/mysql/keyring/keyring_file binlog_encryption=ON
注意点:
-
early-plugin-load必须写对插件名,常见的是keyring_file.so(Linux)或keyring_file.dll(Windows) -
keyring_file_data指向的目录需提前创建,且属主为mysql用户,权限建议750 - 不要把这三行写进
[client]或[mysql]段,只认[mysqld]
重启后验证加密是否生效
重启 mysqld 后,登录执行:SELECT @@binlog_encryption; —— 应返回 ON。
再检查错误日志(通常是 /var/log/mysqld.log 或 datadir/hostname.err),确认没有 keyring 相关失败提示。
最后,用 mysqlbinlog 尝试解析最新 binlog 文件:
mysqlbinlog /var/lib/mysql/mysql-bin.000001
如果输出全是乱码、无法识别事件(比如看不到 INSERT INTO 或 UPDATE 的明文 SQL),基本说明加密已起效。但注意:mysqlbinlog 本身不支持解密,它读出来就是加密后的二进制流 —— 这正是你想要的安全效果。
容易被忽略的关键点
加密后的 binlog 文件不能靠常规方式读取或恢复;备份、归档、解析都得走配套流程。比如主从复制仍可正常工作(server 自动解密),但 DBA 想人工审计日志内容,就必须用带密钥环上下文的专用工具,或者临时停库导出明文快照 —— 这些都不是开箱即用的。
更关键的是:密钥文件(keyring_file_data 指向的那个文件)一旦损坏或丢失,所有加密 binlog 将永久不可读。它不是密码,不能重置,也不能从别处恢复。











