10bet网址
MySQL 8.0参考手册
相关文件10bet官方网站 本手册下载 从本手册中摘录

17.3.3复制权限检查

缺省情况下,何时在副本或组成员上应用已接受的事务时,MySQL复制(包括组复制)不会执行权限检查。来自MySQL 8.0.18,您可以使用适当的权限创建用户帐户以应用通常在频道上复制的事务,并将其指定为PRIVILEGE_CHECKS_USER占Replication Plapier,使用a将复制源更改为语句(从MySQL 8.0.23)或改变大师声明(在MySQL 8.0.23之前)。然后,MySQL针对用户帐户的权限检查每个事务,以验证您是否已授权该频道的操作。该帐户也可以被管理员安全使用,以申请或重新申请交易mysqlbinlog输出,例如从通道上的复制错误恢复。

使用aPRIVILEGE_CHECKS_USER帐户有助于保护复制频道免受未经授权或意外使用特权或不需要的操作。的PRIVILEGE_CHECKS_USER帐户在诸如此类的情况下提供额外的安全性:

  • 您在组织网络上的服务器实例之间复制,另一个网络上的服务器实例,例如云服务提供商提供的实例。

  • 您希望拥有以单独的单位管理的多个内部部署或非现场部署,而无需在所有部署中提供一个管理员帐户权限。

  • 您希望拥有一个管理员帐户,它使管理员能够仅执行与复制通道和它复制的数据库直接相关的操作,而不是在服务器实例上具有广泛权限。

您可以通过将这些选项中的一个或两个添加到其中,增加复制频道的安全性将复制源更改为|改变大师指定时的声明PRIVILEGE_CHECKS_USER渠道账号:

  • Require_Row_Format.选项(可从MySQL 8.0.19获得)使复制通道仅接受基于行的复制事件。什么时候Require_Row_Format.,则必须使用基于行的二进制日志记录(binlog_format =行)。在MySQL 8.0.18,Require_Row_Format.不可用,但是仍然强烈建议为安全复制通道使用基于行的二进制日志记录。对于基于语句的二进制日志记录,可能需要一些管理员级别的特权PRIVILEGE_CHECKS_USER成功执行事务的帐户。

  • Require_table_primary_key_check.选项(可从MySQL 8.0.20获得)使复制频道使用自己的自身策略进行主键检查。环境意味着始终需要主键,设置离开意味着绝不需要主要键。默认设置,溪流的会话值sql_require_primary_key.系统变量使用从每个事务的源复制的值。什么时候PRIVILEGE_CHECKS_USER设置,设置Require_table_primary_key_check.到任一或者离开意味着用户帐户不需要会话管理级别权限来设置更改值所需的受限会话变量sql_require_primary_key..它还对不同来源的复制信道的行为正常化。

你授予Replication_Applier权限启用用户帐户以显示为PRIVILEGE_CHECKS_USER用于复制应用程序线程,并执行内部使用BINLOGmysqlbinlog使用的语句。用户名和主机名PRIVILEGE_CHECKS_USER帐户必须遵循描述的语法第6.2.4节“指定帐户名称”,并且用户不得是匿名用户(具有空白用户名)或当前用户.创建一个新帐户,使用创建用户.授予此帐户Replication_Applier特权,使用格兰特陈述。例如,要创建用户帐户Priv_repl.,可以由管理员从任何主机手动使用example.com.域,并需要加密连接,发出以下语句:

mysql> SET sql_log_bin = 0;mysql> CREATE USER 'priv_repl'@'%.example.com' IDENTIFIED BY '密码'需要SSL;mysql> grant replication_applier *。* to'priv_repl'@'%.example.com';MySQL> SET SQL_LOG_BIN = 1;

设置sql_log_bin使用语句,以便将帐户管理语句添加到二进制日志中并发送到复制渠道(参见第13.4.1.3节,“SET sql_log_bin Statement”)。

重要的

caching_sha2_password.Authentication Plugin是从MySQL 8.0创建的新用户的默认用户(有关详细信息,请参阅第6.4.1.2节,“缓存SHA-2可插拔认证”)。要使用使用此插件进行身份验证的用户帐户连接到服务器,必须设置如下所述的加密连接第17.3.1节,“设置复制使用加密连接”,或者使用RSA密钥对启用未加密的连接以支持密码交换。

设置用户帐户后,使用格兰特授权额外权限的声明使用户帐户能够使数据库更改为您希望应用程序线程执行,例如更新服务器上的特定表。如果需要在Replication Channel上手动执行任何这些事务,则这些相同的权限使管理员能够使用该帐户。如果尝试了未授予适当权限的意外操作,则禁止操作,并将Replication Plankier线程停止错误。第17.3.3.1节“Replication Privilege_Checks_user帐户的权限”解释了帐户需求的附加特权。例如,授予Priv_repl.用户帐户属性中添加行的权限保证表中DB1.,发出以下声明:

mysql> grant在db1.cus上插入'priv_repl'@'%.example.com';

你分配了PRIVILEGE_CHECKS_USER使用将复制源更改为语句(从MySQL 8.0.23)或改变大师声明(在MySQL 8.0.23之前)。强烈建议使用基于行的二进制记录的使用PRIVILEGE_CHECKS_USER已设置,来自MySQL 8.0.19您可以使用该语句设置Require_Row_Format.强制执行此操作。如果复制正在运行,问题停止副本| slave之前改变大师声明,和开始副本|奴隶在它之后。例如,要在频道上启动特权检查channel_1在一个正在运行的副本上,发出以下语句:

mysql> STOP SLAVE FOR CHANNEL 'channel_1';mysql> CHANGE MASTER TO priv_checks_user = 'priv_repl'@'%.example.com', REQUIRE_ROW_FORMAT = 1 FOR CHANNEL 'channel_1';mysql> START SLAVE FOR CHANNEL 'channel_1';或者从MySQL 8.0.22 / 8.0.23: MySQL > STOP REPLICA FOR CHANNEL 'channel_1';mysql> CHANGE REPLICATION SOURCE TO PRIVILEGE_CHECKS_USER = 'priv_repl'@'%.example.com', REQUIRE_ROW_FORMAT = 1 FOR CHANNEL 'channel_1';mysql> START REPLICA FOR CHANNEL 'channel_1';

重新启动Replication Channel时,将从该点应用权限检查。如果未指定通道,并且没有存在其他频道,则该语句将应用于默认通道。用户名和主机名PRIVILEGE_CHECKS_USER频道帐户显示在性能架构中Replication_applier_Configuration.表格,它们被正确逃脱,因此可以将它们直接复制到SQL语句中以执行单个事务。

什么时候Require_Row_Format.设置为复制通道,Replication Plankier不会创建或删除临时表,因此不会设置pseudo_thread_id会话系统变量。它没有执行加载数据INFILE.说明,因此不会尝试使用文件操作来访问或删除与数据加载关联的临时文件(以图为单位format_description_log_event.)。它没有执行Intvar.兰德, 和user_var.事件,用于重现客户端连接状态以进行基于语句的复制。(一个例外是user_var.与执行的DDL查询关联的事件)。它不执行DML事务中记录的任何语句。如果复制应用程序在尝试排队或应用事务时检测到任何这些类型的事件,则不会应用该事件,并停止复制并报错。

你可以设置Require_Row_Format.对于复制频道,无论您是否设置了PRIVILEGE_CHECKS_USER帐户。设置此选项时实现的限制即使没有权限检查也会增加复制信道的安全性。您还可以指定- 重新填写行格式选项使用时mysqlbinlog,强制执行基于行的复制事件mysqlbinlog输出。

安全上下文。默认情况下,当复制应用程序线程以指定为的用户帐户启动时PRIVILEGE_CHECKS_USER,安全上下文使用默认角色创建,或者使用所有角色创建activate_all_roles_on_login设定为

可以使用角色为用作的帐户提供通用权限集PRIVILEGE_CHECKS_USER帐户,如下面的例子所示。这里,不是授予特权特权db1.cust.表直接发送到用户帐户(如前面的示例所示),则此特权被授予角色priv_repl_role.随着Replication_Applier特权。然后使用该角色来授予对两个用户帐户的特权,两者现在可以使用它PRIVILEGE_CHECKS_USER账户:

mysql> SET sql_log_bin = 0;mysql> CREATE USER 'priv_repa'@'%.example.com' IDENTIFIED BY '密码'需要SSL;MySQL>创建用户的“riv_repb'@'%.example.com”标识密码'需要SSL;mysql>创建角色'priv_repl_role';mysql> grant replication_applier to'priv_repl_role';mysql> grant在db1.cus上插入到'priv_repl_role';mysql> grant'iv_repl_role'to'priv_repa'@'%.example.com','priv_repb'@'%.example.com';mysql>将默认角色'priv_repl_role'设置为'priv_repa'@'%.example.com','priv_repb'@'%.example.com';MySQL> SET SQL_LOG_BIN = 1;

请注意,当复制应用程序线程创建安全上下文时,它会检查权限PRIVILEGE_CHECKS_USER帐户,但不执行密码验证,并无法执行与帐户管理有关的支票,例如检查帐户是否被锁定。创建的安全上下文对于Replication Plancer线程的使用寿命保持不变。

局限性。仅在MySQL 8.0.18中,如果是副本mysqld签发?后立即重启重置副本|奴隶声明(由于意外服务器退出或刻意重启),PRIVILEGE_CHECKS_USER帐户设置,在mysql.slave_relay_log_info表,丢失,必须重新命令。当您在该版本中使用权限检查时,始终验证它们在重新启动后是否已到位,并且如果需要,请重新检查它们。来自MySQL 8.0.19,PRIVILEGE_CHECKS_USER在这种情况下,将保留帐户设置,因此将从表中检索该设置并将其重新应用到通道。