#### 17.3.3.1 复制特权的特权\_检查\_用户帐号

使用指定的用户帐户[`将复制源更改为`](change-replication-source-to.html)\|[`将主更改为`](change-master-to.html)声明为`PRIVILEGE_CHECKS_USER`复制通道的帐户必须具有[`REPLICATION_APPLIER`](privileges-provided.html#priv_replication-applier)特权，否则复制应用程序线程不会启动。如中所述[第 17.3.3 节，“复制权限检查”](replication-privilege-checks.html)，该帐户需要足够的权限来应用复制通道上预期的所有预期事务。只有在执行相关事务时才会检查这些权限。

使用基于行的二进制日志（[`binlog_format=行`](replication-options-binary-log.html#sysvar_binlog_format)) 强烈建议用于使用 a 保护的复制通道`PRIVILEGE_CHECKS_USER`帐户。使用基于语句的二进制日志记录，可能需要一些管理员级别的权限`PRIVILEGE_CHECKS_USER`帐户以成功执行交易。从 MySQL 8.0.19 开始，`REQUIRE_ROW_FORMAT`可以将设置应用于安全通道，从而限制通道执行需要这些权限的事件。

这[`REPLICATION_APPLIER`](privileges-provided.html#priv_replication-applier)特权显式或隐式允许`PRIVILEGE_CHECKS_USER`帐户来执行复制线程需要执行的以下操作：

-   设置系统变量的值[`gtid_next`](replication-options-gtids.html#sysvar_gtid_next),[`original_commit_timestamp`](replication-options-binary-log.html#sysvar_original_commit_timestamp),[`original_server_version`](replication-options-source.html#sysvar_original_server_version),[`即时服务器版本`](replication-options-source.html#sysvar_immediate_server_version)， 和[`伪副本模式`](server-system-variables.html#sysvar_pseudo_replica_mode)要么[`伪从模式`](server-system-variables.html#sysvar_pseudo_slave_mode), 在执行事务时应用适当的元数据和行为。

-   执行内部使用[`二进制日志`](binlog.html)适用的声明[**mysqlbinlog**](mysqlbinlog.html)输出，前提是该帐户还具有对这些语句中的表和操作的权限。

-   更新系统表`mysql.gtid_executed`,`mysql.slave_relay_log_info`,`mysql.slave_worker_info`， 和`mysql.slave_master_info`，以更新复制元数据。（如果事件出于其他目的显式访问这些表，则必须授予对这些表的适当权限。）

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

    如果`REQUIRE_TABLE_PRIMARY_KEY_CHECK`的选项[`将复制源更改为`](change-replication-source-to.html)\|[`将主更改为`](change-master-to.html)语句设置为默认值`溪流`， 这`PRIVILEGE_CHECKS_USER`帐户需要足够的权限来设置受限会话变量，以便它可以更改[`sql_require_primary_key`](server-system-variables.html#sysvar_sql_require_primary_key)会话期间的系统变量，以匹配从源复制的设置。这[`SESSION_VARIABLES_ADMIN`](privileges-provided.html#priv_session-variables-admin)特权为帐户提供了此功能。此权限还允许帐户申请[**mysqlbinlog**](mysqlbinlog.html)使用创建的输出[`--disable-log-bin`](mysqlbinlog.html#option_mysqlbinlog_disable-log-bin)选项。如果你设置`REQUIRE_TABLE_PRIMARY_KEY_CHECK`要么`在`要么`离开`，副本始终使用该值作为[`sql_require_primary_key`](server-system-variables.html#sysvar_sql_require_primary_key)复制操作中的系统变量，因此不需要这些会话管理级别权限。

    如果正在使用表加密，则[`table_encryption_privilege_check`](server-system-variables.html#sysvar_table_encryption_privilege_check)系统变量设置为`在`，并且任何事件中涉及的表空间的加密设置都不同于应用服务器的默认加密设置（由[`default_table_encryption`](server-system-variables.html#sysvar_default_table_encryption)系统变量），`PRIVILEGE_CHECKS_USER`帐户需要[`TABLE_ENCRYPTION_ADMIN`](privileges-provided.html#priv_table-encryption-admin)权限以覆盖默认加密设置。强烈建议您不要授予此权限。相反，请确保副本上的默认加密设置与其复制的表空间的加密状态相匹配，并且复制组成员具有相同的默认加密设置，以便不需要特权。

    为了从中继日志执行特定的复制事务，或从[**mysqlbinlog**](mysqlbinlog.html)根据需要输出，`PRIVILEGE_CHECKS_USER`帐户必须具有以下权限：

-   对于以行格式记录的行插入（记录为`写行日志事件`）， 这[`插入`](privileges-provided.html#priv_insert)相关表的特权。

-   对于以行格式记录的行更新（记录为`更新行日志事件`）， 这[`更新`](privileges-provided.html#priv_update)相关表的特权。

-   对于以行格式记录的行删除（记录为`删除行日志事件`）， 这[`删除`](privileges-provided.html#priv_delete)相关表的特权。

    如果正在使用基于语句的二进制日志记录（不建议使用`PRIVILEGE_CHECKS_USER`account)，用于交易控制语句，例如`开始`要么`犯罪`或以语句格式记录的 DML（记录为`查询日志事件`）， 这`PRIVILEGE_CHECKS_USER`帐户需要权限才能执行事件中包含的语句。

    如果[`加载数据`](load-data.html)操作需要在复制通道上进行，使用基于行的二进制日志（[`binlog_format=行`](replication-options-binary-log.html#sysvar_binlog_format)）。使用这种日志记录格式，[`文件`](privileges-provided.html#priv_file)执行事件不需要特权，所以不要给`PRIVILEGE_CHECKS_USER`帐户此特权。强烈建议使用基于行的二进制日志记录与使用`PRIVILEGE_CHECKS_USER`帐户。如果`REQUIRE_ROW_FORMAT`为通道设置，需要基于行的二进制日志记录。这`Format_description_log_event`，它会删除由[`加载数据`](load-data.html)事件，在没有权限检查的情况下进行处理。有关详细信息，请参阅[第 17.5.1.19 节，“复制和加载数据”](replication-features-load-data.html).

    如果[`初始化副本`](replication-options-replica.html#sysvar_init_replica)要么[`init_slave`](replication-options-replica.html#sysvar_init_slave)系统变量设置为指定复制 SQL 线程启动时要执行的一条或多条 SQL 语句，`PRIVILEGE_CHECKS_USER`帐户必须具有执行这些语句所需的权限。

    建议您永远不要将任何 ACL 权限授予`PRIVILEGE_CHECKS_USER`帐户，包括[`创建用户`](privileges-provided.html#priv_create-user),[`创建角色`](privileges-provided.html#priv_create-role),[`删除角色`](privileges-provided.html#priv_drop-role)， 和[`授予选项`](privileges-provided.html#priv_grant-option)，并且不允许该帐户更新`mysql.user`桌子。使用这些权限，该帐户可用于在服务器上创建或修改用户帐户。为避免在源服务器上发出的 ACL 语句被复制到安全通道执行（在没有这些权限的情况下它们会失败），您可以发出`设置 sql_log_bin = 0`在所有 ACL 语句和`设置 sql_log_bin = 1`在它们之后，省略源二进制日志中的语句。或者，您可以在执行所有 ACL 语句之前设置一个专用的当前数据库，并使用复制过滤器 ([`--binlog-ignore-db`](replication-options-binary-log.html#option_mysqld_binlog-ignore-db)) 在副本上过滤掉这个数据库。
