除了我们可能需要或想要为用户赋予 数据库/表/列 级别的权限外,还需要应用程序线程才能正常运行的全局级别权限(或动态权限):REPLICATIONAPPLIER:动态权限,显式允许目标用户用作从机应用程序线程权限前后关联。需要此权限,以便被 REPLICATION_SLAVE_ADMIN 授予(能够执行 CHANGE MASTER TO…)但没有 GRANT 权限的用户无法使用任何给定用户设置权限从机应用程序会话。
SESSION_VARIABLES_ADMIN:需要设置在二进制日志中显式设置的会话变量。
FILE:当且仅当使用基于语句的复制并在主数据库上执行 LOAD DATA 时才如此。
// On the slave
mysql> GRANT REPLICATION_APPLIER,SESSION_VARIABLES_ADMIN ON *.* TO 'rpl_applier_user'@'localhost';
mysql> GRANT CREATE,INSERT,DELETE,UPDATE ON db1.* TO 'rpl_applier_user'@'localhost';
同样,如果目标从机是我们启用权限检查拓扑结构中的唯一节点,并且已启用 sql_log_bin
,那么在创建用户之前,请不要忘记禁用二进制日志记录:// On the slave
mysql> SET @@session.sql_log_bin = 0;
mysql> GRANT REPLICATION_APPLIER,SESSION_VARIABLES_ADMIN ON *.* TO 'rpl_applier_user'@'localhost';
mysql> GRANT CREATE,INSERT,DELETE,UPDATE ON db1.* TO 'rpl_applier_user'@'localhost';
mysql> SET @@session.sql_log_bin = 1;
同样,如果我们想在整个拓扑中传递权限,只需在主服务器上运行命令:// On the master
mysql> GRANT REPLICATION_APPLIER,SESSION_VARIABLES_ADMIN ON *.* TO 'rpl_applier_user'@'localhost';
mysql> GRANT CREATE,INSERT,DELETE,UPDATE ON db1.* TO 'rpl_applier_user'@'localhost';
mysql> SET @@session.sql_log_bin = 0;
mysql> DROP USER 'rpl_applier_user'@'localhost';
mysql> SET @@session.sql_log_bin = 1;
角色也可以用于授予目标用户我们所需的权限。运行 CHANGE MASTER TO… 语句时不允许显式角色设置,但是我们可以使用默认角色来规避该设置。mysql> CREATE ROLE 'rpl_applier_role';
mysql> GRANT REPLICATION_APPLIER,SESSION_VARIABLES_ADMIN ON *.* TO 'rpl_applier_role';
mysql> GRANT 'rpl_applier_role' TO 'rpl_applier_user'@'localhost';
对于我们希望用作从机应用程序线程权限前后用户的每个用户,请将角色分配为默认角色:mysql> SET DEFAULT ROLE 'rpl_applier_role' TO 'rpl_applier_user'@'localhost';
如果需要,我们还可以向角色添加 数据库/表/列 级权限。注意:只有在重新启动线程后,在从机应用程序线程运行时(使用角色或直接授予权限时)执行的权限更改才会生效。