文档首页
MySQL 9.0 参考手册
相关文档 下载本手册
PDF (US Ltr) - 40.0Mb
PDF (A4) - 40.1Mb
手册页 (TGZ) - 258.2Kb
手册页 (Zip) - 365.3Kb
Info (Gzip) - 4.0Mb
Info (Zip) - 4.0Mb


MySQL 9.0 参考手册  /  ...  /  复制 PRIVILEGE_CHECKS_USER 帐户的权限

19.3.3.1 复制 PRIVILEGE_CHECKS_USER 帐户的权限

使用 CHANGE REPLICATION SOURCE TO 语句作为复制通道的 PRIVILEGE_CHECKS_USER 帐户指定的帐户必须具有 REPLICATION_APPLIER 权限,否则复制应用器线程将不会启动。如 第 19.3.3 节,“复制权限检查” 中所述,该帐户需要进一步的权限,这些权限足以应用在复制通道上预期执行的所有预期事务。仅在执行相关事务时检查这些权限。

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

REPLICATION_APPLIER 权限明确或隐含地允许 PRIVILEGE_CHECKS_USER 帐户执行复制线程需要执行的以下操作

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

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

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

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

如果 CHANGE REPLICATION SOURCE TO 语句的 REQUIRE_TABLE_PRIMARY_KEY_CHECK 选项设置为默认值 STREAM,则 PRIVILEGE_CHECKS_USER 帐户需要足够的权限来设置受限会话变量,以便它可以在会话期间更改 sql_require_primary_key 系统变量的值,以匹配从源复制的设置。 SESSION_VARIABLES_ADMIN 权限为帐户提供了此功能。此权限还允许帐户应用使用 --disable-log-bin 选项创建的 mysqlbinlog 输出。如果将 REQUIRE_TABLE_PRIMARY_KEY_CHECK 设置为 ONOFF,副本将始终在复制操作中使用该值作为 sql_require_primary_key 系统变量,因此不需要这些会话管理级别的权限。

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

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

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

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

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

如果使用基于语句的二进制日志记录(在使用 PRIVILEGE_CHECKS_USER 帐户时不建议这样做),对于诸如 BEGINCOMMIT 或以语句格式记录的 DML 之类的交易控制语句(作为 Query_log_event 记录),PRIVILEGE_CHECKS_USER 帐户需要执行事件中包含的语句的权限。

如果需要在复制通道上执行 LOAD DATA 操作,请使用基于行的二进制日志记录 (binlog_format=ROW)。使用此日志格式,不需要 FILE 权限来执行事件,因此不要为此 PRIVILEGE_CHECKS_USER 帐户授予此权限。强烈建议在使用 PRIVILEGE_CHECKS_USER 帐户进行安全保护的复制通道中使用基于行的二进制日志记录。如果为通道设置了 REQUIRE_ROW_FORMAT,则需要基于行的二进制日志记录。 Format_description_log_event(它会删除 LOAD DATA 事件创建的任何临时文件)将在没有权限检查的情况下进行处理。有关更多信息,请参见 第 19.5.1.20 节“复制和 LOAD DATA”

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

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