使用 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_next
、original_commit_timestamp
、original_server_version
、immediate_server_version
和pseudo_replica_mode
的值,以便在执行事务时应用适当的元数据和行为。执行内部使用的
BINLOG
语句来应用 mysqlbinlog 输出,前提是该帐户还拥有对这些语句中的表和操作的权限。更新系统表
mysql.gtid_executed
、mysql.slave_relay_log_info
、mysql.slave_worker_info
和mysql.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
设置为 ON
或 OFF
,副本将在复制操作中始终使用该值作为 sql_require_primary_key
系统变量的值,因此不需要这些会话管理级别的权限。
如果使用表加密,table_encryption_privilege_check
系统变量设置为 ON
,并且任何事件中涉及的表空间的加密设置与应用服务器的默认加密设置不同(由 default_table_encryption
系统变量指定),PRIVILEGE_CHECKS_USER
帐户需要 TABLE_ENCRYPTION_ADMIN
权限才能覆盖默认加密设置。强烈建议不要授予此权限。相反,请确保副本上的默认加密设置与它复制的表空间的加密状态匹配,并且复制组成员具有相同的默认加密设置,以便不需要此权限。
为了按需执行中继日志中的特定复制事务,或者执行 mysqlbinlog 输出中的事务,PRIVILEGE_CHECKS_USER
帐户必须具有以下权限
如果使用基于语句的二进制日志记录(不建议与 PRIVILEGE_CHECKS_USER
帐户一起使用),对于以语句格式记录的事务控制语句(例如 BEGIN
或 COMMIT
或 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 USER
、CREATE ROLE
、DROP ROLE
和 GRANT OPTION
,并且不允许该帐户更新 mysql.user
表。使用这些权限,帐户可用于在服务器上创建或修改用户帐户。为了避免在源服务器上发出的 ACL 语句被复制到安全通道以进行执行(在没有这些权限的情况下会失败),您可以在所有 ACL 语句之前发出 SET sql_log_bin = 0
并在之后发出 SET sql_log_bin = 1
,以省略源的二进制日志中的语句。或者,您可以在执行所有 ACL 语句之前设置一个专用当前数据库,并使用复制过滤器 (--binlog-ignore-db
) 来过滤掉副本上的此数据库。