Documentation Home
MySQL 8.3 Reference Manual
Related Documentation Download this Manual
PDF (US Ltr) - 40.8Mb
PDF (A4) - 40.9Mb
Man Pages (TGZ) - 294.0Kb
Man Pages (Zip) - 409.0Kb
Info (Gzip) - 4.0Mb
Info (Zip) - 4.0Mb
Excerpts from this Manual

MySQL 8.3 Reference Manual  /  ...  /  Privileges For The Replication PRIVILEGE_CHECKS_USER Account

19.3.3.1 复制权限检查账户的权限

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

强烈建议使用基于行的二进制日志记录 (binlog_format=ROW) 来保护使用 PRIVILEGE_CHECKS_USER 账户的复制通道。使用基于语句的二进制日志记录,管理员级别的权限可能需要 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,该事件提供表元数据,但不进行任何数据库更改。

如果 REQUIRE_TABLE_PRIMARY_KEY_CHECK 选项的 CHANGE REPLICATION SOURCE TO 语句设置为默认值 STREAM,则 PRIVILEGE_CHECKS_USER 账户需要足够的权限,以便设置受限的会话变量,以便在会话期间更改 sql_require_primary_key 系统变量的值,以匹配来自源的设置。 SESSION_VARIABLES_ADMIN 权限授予账户这种能力。此权限还允许账户应用使用 mysqlbinlog 输出,该输出是在使用 --disable-log-bin 选项创建的。如果您将 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形式记录),PRIVILEGE_CHECKS_USER账户需要在相关表上的INSERT权限。

  • 对于以行格式记录的行更新(以Update_rows_log_event形式记录),PRIVILEGE_CHECKS_USER账户需要在相关表上的UPDATE权限。

  • 对于以行格式记录的行删除(以Delete_rows_log_event形式记录),PRIVILEGE_CHECKS_USER账户需要在相关表上的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账户必须具有执行这些语句所需的权限。

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