Documentation Home
MySQL 8.4 Reference Manual
Related Documentation Download this Manual
PDF (US Ltr) - 39.8Mb
PDF (A4) - 39.9Mb
Man Pages (TGZ) - 257.9Kb
Man Pages (Zip) - 364.9Kb
Info (Gzip) - 4.0Mb
Info (Zip) - 4.0Mb


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

19.3.3.1 复制账户的特权-PRIVILEGE_CHECKS_USER

使用CHANGE REPLICATION SOURCE TO语句指定的用户账户作为PRIVILEGE_CHECKS_USER账户在复制通道上必须具有REPLICATION_APPLIER特权,否则复制应用程序线程将不会启动。如第19.3.3节,“复制特权检查”所解释的那样,该账户还需要其他特权,以便在复制通道上应用所有预期事务。这些特权仅在相关事务执行时被检查。

使用行级别二进制日志(binlog_format=ROW)强烈建议在使用PRIVILEGE_CHECKS_USER账户secured的复制通道上。使用语句级别二进制日志,管理员级别的特权可能需要在PRIVILEGE_CHECKS_USER账户上执行事务。可以将REQUIRE_ROW_FORMAT设置应用于secured通道,以限制通道执行需要这些特权的事件。

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 权限,以便拥有这个能力。此外,该权限还允许账户应用使用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 权限,以便覆盖默认加密设置。强烈建议不要授予这个权限。相反,确保复制服务器的默认加密设置与复制的表空间加密状态相同,并且复制组成员拥有相同的默认加密设置,以便不需要这个权限。

为了执行特定的复制事务,从relay日志中或使用mysqlbinlog 输出所需的交易,PRIVILEGE_CHECKS_USER 账户必须拥有以下权限:

  • 对于在行格式(logged as a Write_rows_log_event)中记录的行插入,INSERT 权限在相关表上。

  • 对于在行格式(logged as an 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账户secured的复制通道上。 如果init_replica变量设置为指定一或多个SQL语句在复制SQL线程启动时执行,PRIVILEGE_CHECKS_USER账户必须拥有执行这些语句的权限。

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)来在副本上排除这个数据库。