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_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
权限,以便拥有这个能力。此外,该权限还允许账户应用使用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
权限,以便覆盖默认加密设置。强烈建议不要授予这个权限。相反,确保复制服务器的默认加密设置与复制的表空间加密状态相同,并且复制组成员拥有相同的默认加密设置,以便不需要这个权限。
为了执行特定的复制事务,从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
账户),对于事务控制语句,如BEGIN
或COMMIT
或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 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
)来在副本上排除这个数据库。