使用 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_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
,该事件提供表元数据,但不进行任何数据库更改。
如果 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
设置为 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
账户必须具有执行这些语句所需的权限。
我们建议您永远不要授予ACL权限给PRIVILEGE_CHECKS_USER
账户,包括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
)来过滤出这个数据库在副本上。