#### 17.3.2.3二进制日志主密钥旋转

启用二进制日志加密后，您可以在服务器运行时随时通过发出[`ALTER INSTANCE ROTATE BINLOG主密钥`](alter-instance.html#alter-instance-rotate-binlog-master-key)。当使用此语句手动旋转二进制日志主密钥时，新文件和后续文件的密码将使用新的二进制日志主密钥加密，现有加密二进制日志文件和中继日志文件的文件密码也将使用新的二进制日志主密钥重新加密，因此加密将完全更新。您可以定期旋转二进制日志主密钥，以符合组织的安全策略，如果您怀疑当前或以前的任何二进制日志主密钥可能已被泄露，也可以这样做。

手动旋转二进制日志主密钥时，MySQL服务器会按顺序执行以下操作：

1.  新的二进制日志加密密钥将使用下一个可用序列号生成，存储在密钥环上，并用作新的二进制日志主密钥。

2.  二进制日志和中继日志文件在所有通道上旋转。

3.  新的二进制日志主密钥用于加密新二进制日志和中继日志文件以及后续文件的文件密码，直到密钥再次更改。

4.  服务器上现有加密二进制日志文件和中继日志文件的文件密码依次使用新的二进制日志主密钥重新加密，从最新的文件开始。跳过所有未加密的文件。

5.  从密钥环中删除重新加密过程后不再用于任何文件的二进制日志加密密钥。

    这个[`BINLOG_加密_管理`](privileges-provided.html#priv_binlog-encryption-admin)需要特权才能发布[`ALTER INSTANCE ROTATE BINLOG主密钥`](alter-instance.html#alter-instance-rotate-binlog-master-key)，并且如果[`binlog_加密`](replication-options-binary-log.html#sysvar_binlog_encryption)系统变量设置为`关`.

    作为二进制日志主密钥旋转过程的最后一步，所有不再应用于任何保留的二进制日志文件或中继日志文件的二进制日志加密密钥都将从密钥环中清除。如果无法初始化保留的二进制日志文件或中继日志文件进行重新加密，则不会删除相关的二进制日志加密密钥，以防将来可以恢复这些文件。例如，如果二进制日志索引文件中列出的文件当前不可读，或者通道无法初始化，则可能会出现这种情况。如果服务器UUID发生更改，例如，因为使用MySQL Enterprise backup创建的备份用于设置新副本，则[`ALTER INSTANCE ROTATE BINLOG主密钥`](alter-instance.html#alter-instance-rotate-binlog-master-key)在新服务器上，不会删除任何包含原始服务器UUID的早期二进制日志加密密钥。

    如果无法正确完成二进制日志主密钥旋转过程的前四个步骤中的任何一个，将发出一条错误消息，解释二进制日志文件和中继日志文件的加密状态的情况和后果。以前加密的文件始终处于加密状态，但它们的文件密码可能仍然使用旧的二进制日志主密钥加密。如果您看到这些错误，请首先通过发出[`ALTER INSTANCE ROTATE BINLOG主密钥`](alter-instance.html#alter-instance-rotate-binlog-master-key)再一次然后调查各个文件的状态，看看是什么阻止了进程，尤其是如果您怀疑当前或以前的任何二进制日志主密钥可能已被泄露。

    如果无法正确完成二进制日志主密钥旋转过程的最后一步，则会发出警告消息，说明情况。警告消息标识进程是否无法清理密钥环中用于旋转二进制日志主密钥的辅助密钥，或无法清理未使用的二进制日志加密密钥。您可以选择忽略该消息，因为这些键是辅助键或不再使用，或者您可以发出[`ALTER INSTANCE ROTATE BINLOG主密钥`](alter-instance.html#alter-instance-rotate-binlog-master-key)再次尝试此过程。

    如果服务器停止并重新启动，二进制日志加密仍设置为`在…上`在二进制日志主密钥旋转过程中，使用新的二进制日志主密钥对新的二进制日志文件和重启后的中继日志文件进行加密。但是，现有文件的重新加密不会继续，因此在服务器停止之前未重新加密的文件将使用以前的二进制日志主密钥进行加密。要完成重新加密并清除未使用的二进制日志加密密钥，请发出[`ALTER INSTANCE ROTATE BINLOG主密钥`](alter-instance.html#alter-instance-rotate-binlog-master-key)重启后再次启动。

[`ALTER INSTANCE ROTATE BINLOG主密钥`](alter-instance.html#alter-instance-rotate-binlog-master-key)操作不会写入二进制日志，也不会在副本上执行。因此，二进制日志主密钥轮换可以在复制环境中执行，包括MySQL版本的混合。要在所有适用的源服务器和副本服务器上定期轮换二进制日志主密钥，可以在每台服务器上启用MySQL事件调度器，并发出[`ALTER INSTANCE ROTATE BINLOG主密钥`](alter-instance.html#alter-instance-rotate-binlog-master-key)使用[`创建事件`](create-event.html)陈述如果因为怀疑当前或之前的任何二进制日志主密钥可能已被泄露而旋转二进制日志主密钥，请在每个适用的源服务器和副本服务器上发出该语句。在单个服务器上发布该声明可确保您可以立即验证遵从性，即使是在副本滞后、属于多个复制拓扑、或者当前在复制拓扑中不活动但具有二进制日志和中继日志文件的情况下也是如此。

这个[`binlog\u旋转\u加密\u主密钥\u启动时`](replication-options-binary-log.html#sysvar_binlog_rotate_encryption_master_key_at_startup)系统变量控制服务器重启时二进制日志主密钥是否自动旋转。如果此系统变量设置为`在…上`，每当服务器重新启动时，将生成一个新的二进制日志加密密钥，并将其用作新的二进制日志主密钥。如果设置为`关`，这是默认值，重新启动后将再次使用现有的二进制日志主密钥。当二进制日志主密钥在启动时旋转时，新二进制日志和中继日志文件的文件密码将使用新密钥加密。现有加密的二进制日志文件和中继日志文件的文件密码不会重新加密，因此它们仍然使用旧密钥进行加密，旧密钥在密钥环上仍然可用。
