MySQL 8.0 参考手册  / 第十七章复制  / 17.3 复制安全  / 17.3.3 复制权限检查  /  17.3.3.1 复制 PRIVILEGE_CHECKS_USER 帐户的权限

17.3.3.1 复制 PRIVILEGE_CHECKS_USER 帐户的权限

CHANGE REPLICATION SOURCE TO使用| 指定的用户帐户 CHANGE MASTER TO声明作为 PRIVILEGE_CHECKS_USER复制通道的帐户必须具有 REPLICATION_APPLIER特权,否则复制应用程序线程不会启动。如第 17.3.3 节“复制权限检查”中所述,该帐户需要进一步的权限,这些权限足以应用复制通道上预期的所有预期事务。只有在执行相关交易时才会检查这些权限。

对于使用帐户binlog_format=ROW保护的复制通道,强烈建议 使用基于行的二进制日志记录 ( )。PRIVILEGE_CHECKS_USER使用基于语句的二进制日志记录,帐户可能需要一些管理员级别的权限才能 PRIVILEGE_CHECKS_USER成功执行事务。从 MySQL 8.0.19 开始,该 REQUIRE_ROW_FORMAT设置可以应用于安全通道,这会限制通道执行需要这些权限的事件。

REPLICATION_APPLIER权限显式或隐式允许 PRIVILEGE_CHECKS_USER帐户执行复制线程需要执行的以下操作:

  • 设置系统变量 gtid_nextoriginal_commit_timestamporiginal_server_versionimmediate_server_versionpseudo_replica_mode或 的值pseudo_slave_mode,以在执行事务时应用适当的元数据和行为。

  • 执行内部使用BINLOG 语句以应用mysqlbinlog输出,前提是该帐户还具有对这些语句中的表和操作的权限。

  • 更新系统表 mysql.gtid_executedmysql.slave_relay_log_infomysql.slave_worker_infomysql.slave_master_info,以更新复制元数据。(如果事件出于其他目的显式访问这些表,您必须授予对这些表的适当权限。)

  • 应用二进制日志 Table_map_log_event,它提供表元数据但不对数据库进行任何更改。

如果|的REQUIRE_TABLE_PRIMARY_KEY_CHECK选项 语句设置为默认值,帐户需要足够的权限来设置受限会话变量,以便它可以在会话期间更改 系统变量的值以匹配从源复制的设置。该 特权赋予帐户这种能力。此权限还允许该帐户应用使用该 选项创建的mysqlbinlog输出。如果您设置为或,副本始终使用该值作为 CHANGE REPLICATION SOURCE TOCHANGE MASTER TOSTREAMPRIVILEGE_CHECKS_USERsql_require_primary_keySESSION_VARIABLES_ADMIN--disable-log-binREQUIRE_TABLE_PRIMARY_KEY_CHECKONOFFsql_require_primary_key复制操作中的系统变量,因此不需要这些会话管理级别的权限。

如果正在使用表加密, table_encryption_privilege_check 系统变量设置为ON,并且任何事件中涉及的表空间的加密设置与应用服务器的默认加密设置(由 default_table_encryption系统变量指定)不同,该PRIVILEGE_CHECKS_USER帐户需要TABLE_ENCRYPTION_ADMIN 权限才能覆盖默认加密设置。强烈建议您不要授予此特权。相反,确保副本上的默认加密设置与其复制的表空间的加密状态相匹配,并且复制组成员具有相同的默认加密设置,因此不需要特权。

为了根据需要从中继日志执行特定的复制事务,或从mysqlbinlog 输出执行事务,该PRIVILEGE_CHECKS_USER 帐户必须具有以下权限:

  • 对于以行格式记录的行插入(记录为 a Write_rows_log_event), INSERT相关表的特权。

  • 对于以行格式记录的行更新(记录为Update_rows_log_event), UPDATE相关表的特权。

  • 对于以行格式记录的行删除(记录为 a Delete_rows_log_event), DELETE相关表的特权。

如果正在使用基于语句的二进制日志记录(不建议使用帐户),对于以语句格式记录的or或 DMLPRIVILEGE_CHECKS_USER 等事务控制语句 (记录为 ),该 帐户需要执行包含的语句的权限在事件中。 BEGINCOMMITQuery_log_eventPRIVILEGE_CHECKS_USER

如果LOAD DATA需要在复制通道上进行操作,请使用基于行的二进制日志记录(binlog_format=ROW)。使用这种日志格式, FILE执行事件不需要特权,所以不要给 PRIVILEGE_CHECKS_USER帐户这个特权。强烈建议将基于行的二进制日志记录与使用 PRIVILEGE_CHECKS_USER帐户保护的复制通道一起使用。如果 REQUIRE_ROW_FORMAT为通道设置,则需要基于行的二进制日志记录。删除由事件创建的 Format_description_log_event任何临时文件LOAD DATA,在没有权限检查的情况下进行处理。有关详细信息,请参阅 第 17.5.1.19 节,“复制和加载数据”

如果init_replicaor init_slave系统变量被设置为指定在复制 SQL 线程启动时要执行的一个或多个 SQL 语句,则该 PRIVILEGE_CHECKS_USER帐户必须具有执行这些语句所需的权限。

建议您永远不要向该 PRIVILEGE_CHECKS_USER帐户授予任何 ACL 权限,包括 CREATE USERCREATE ROLEDROP ROLEGRANT OPTION,并且不允许该帐户更新mysql.user表。有了这些权限,该帐户可用于在服务器上创建或修改用户帐户。为避免在源服务器上发布的 ACL 语句被复制到安全通道执行(在没有这些权限的情况下它们会失败),您可以SET sql_log_bin = 0在所有 ACL 语句和SET sql_log_bin = 1在它们之后,省略源二进制日志中的语句。或者,您可以在执行所有 ACL 语句之前设置一个专用的当前数据库,并使用复制过滤器 ( --binlog-ignore-db) 在副本上过滤掉这个数据库。