文档首页
MySQL 8.4 参考手册
相关文档 下载本手册
PDF (US Ltr) - 39.9Mb
PDF (A4) - 40.0Mb
Man Pages (TGZ) - 258.5Kb
Man Pages (Zip) - 365.5Kb
Info (Gzip) - 4.0Mb
Info (Zip) - 4.0Mb


MySQL 8.4 参考手册  /  ...  /  复制 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.19 节“复制和 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) 来过滤掉副本上的此数据库。