在MySQL 8.0.18上进行的后续工作中,我们引入了对从属应用程序线程的特权检查,在本文中,我们提出了一项新功能,可以进一步提高您安全地复制数据的能力:现在,您可以将复制流限制为仅基于行的事件。
在MySQL 8.0.19中,为复制通道添加了新的CHANGE MASTER参数REQUIRE_ROW_FORMAT,这使该通道仅接受基于行的复制事件。
该要求将通过以下方式提高整体安全性:
- 不允许复制LOAD DATA指令,因为它们意味着文件将临时存在于磁盘上,在此处可以对其进行篡改或访问以显示在插入时将被加密的数据。
- 不允许复制临时表和相关数据,从而有可能在主数据中包含可能敏感的临时数据,例如,用于计算的未加密数据将生成加密数据。
- 避免出现与文档中基于语句的复制流相关的其他常见问题
当您从安全边界之外的服务器进行复制时,这些用例变得更加相关,这意味着它们不在您的控制范围内,可能会被未知用户访问。然后,它在fan-in用例中变得非常有用,例如,当您想要聚合来自多个数据源的数据时,这些数据不是您直接控制的,而是仍然要确保没有敏感数据在磁盘上保持未加密或错误存储状态。通过临时表复制。
另一个积极的变量是,对于那些已经使用权限权限进行复制的用户来说,不再需要向FILE为此目的配置的用户授予特权。
行为
在复制通道中启用此新功能之后,对于接收和应用的所有事务,将进行检查,不允许以下任何一项:
- LOAD DATA 大事记
- 临时表的创建或删除
- 大多数INTVAR(RAND或USER_VAR事件)与基于语句的复制相关联
- 为基于语句的复制而记录的所有数据操作查询(DML)
一旦遇到这些事件中的任何事件,复制将失败并停止。
配置
要明确地使通道仅接受基于行的复制,您将必须完全停止复制。在下面,您可以看到实现它的命令:
mysql> STOP SLAVE FOR CHANNEL 'channel_1'; mysql> CHANGE MASTER TO REQUIRE_ROW_FORMAT = 1 FOR CHANNEL 'channel_1'; mysql> START SLAVE FOR CHANNEL 'channel_1';
复制
您必须停止从属服务器而不是停止其应用程序的原因是,这些检查都是在从属接收器线程和应用程序线程中进行的,因此它们也将应用于已经接收并存在于中继日志中的事务。
可观察性
与从属应用程序状态相关的Performance Schema表已得到增强,以显示新的CHANGE MASTER TO…语句选项REQUIRE_ROW_FORMAT的状态:
mysql> STOP SLAVE; mysql> CHANGE MASTER TO REQUIRE_ROW_FORMAT = 1; mysql> START SLAVE; mysql> SELECT Require_row_format FROM performance_schema.replication_applier_configuration; +--------------------+ | REQUIRE_ROW_FORMAT | +--------------------+ | YES | +--------------------+ 1 row in set (0.00 sec)
复制
对mysqlbinlog的更改
为了补充此更改,我们还为mysqlbinlog添加了新选项。
-require-row-format
复制
使用此选项,您将知道输出对于使用运行的通道有效REQUIRE_ROW_FORMAT = 1。
该选项还防止mysqlbinlog打印与内部变量有关的指令:pseudo_thread_id。如果配置了权限检查,则这些指令(仅基于行的流不需要)将需要复制应用程序中的额外权限。
摘要
因此,为了保护您的服务器免受基于语句的复制流及其允许的事件常见的问题的影响,或仅减少在副本中配置应用程序特权检查所需的特权,REQUIRE_ROW_FORMAT是MySQL服务器的一项有趣的功能。