使用NDB_STORED_USER的分布式MySQL特权
NDB 8.0.18引入了一种新机制,用于在连接到NDB群集的SQL节点之间共享和同步用户,角色和特权。可以通过授予NDB_STORED_USER
特权来启用。有关用法信息,请参阅特权说明。
NDB_STORED_USER
SHOW GRANTS
与其他任何特权一样在输出中打印。要验证特权是否共享,请使用NDB Cluster发行版随附的ndb_select_all实用程序,如下所示(一些输出被包装以保留格式):
shell>ndb_select_all -d mysql ndb_sql_metadata type name seq note sql_ddl_text 11 "'jon'@'localhost'" 0 4 "CREATE USER 'jon'@'localhost' IDENTIFIED WITH 'caching_sha2_password' AS '$A$005${B];3!?tI\".EFy\ZA5K5DQHrWiBvuRNYTIMeO0YeBlPpZotFRPjVTYzTA5b0' REQUIRE NONE PASSWORD EXPIRE DEFAULT ACCOUNT UNLOCK PASSWORD HISTORY DEFAULT PASSWORD REUSE INTERVAL DEFAULT PASSWORD REQUIRE CURRENT DEFAULT" 12 "'jon'@'localhost'" 0 [NULL] "GRANT USAGE ON *.* TO `jon`@`localhost`" 12 "'jon'@'localhost'" 3 [NULL] "GRANT ALL PRIVILEGES ON `test`.* TO `jon`@`localhost`" 12 "'jon'@'localhost'" 2 [NULL] "GRANT ALL PRIVILEGES ON `mydb`.* TO `jon`@`localhost`" 12 "'jon'@'localhost'" 1 [NULL] "GRANT NDB_STORED_USER ON *.* TO `jon`@`localhost`" 5 rows returned
ndb_sql_metadata
是一个特殊的NDB
表,使用mysql或其他MySQL客户端不可见。
授予的一份声明NDB_STORED_USER
特权,比如GRANT NDB_STORED_USER ON *.* TO 'cluster_app_user'@'localhost'
,作品通过引导NDB
创建快照使用的查询SHOW CREATE USER cluster_app_user@localhost
和SHOW GRANTS FOR cluster_app_user@localhost
,然后存储到结果ndb_sql_metadata
。然后,要求任何其他SQL节点读取和应用快照。每当MySQL服务器启动并作为SQL节点加入集群时,它都会执行这些存储的语句CREATE USER
和GRANT
语句,这是集群模式同步过程的一部分。
每当在非SQL节点的SQL节点上执行SQL语句时,该语句就会在NDBCLUSTER
存储引擎的实用程序线程中运行;这是在与MySQL复制从属应用程序线程的安全性等效的安全性环境中完成的。
您应注意,对的用户更改NDB_STORED_USER
是异步分发的。因为分布式架构更改操作是同步执行的,所以更改任何一个或多个分布式用户之后的下一个分布式架构更改将用作同步点。在架构更改分发可以开始之前,所有未决的用户更改都将运行到完成;之后,架构更改本身将同步运行。例如,如果在分布式用户的a之后DROP DATABASE
跟随一条语句,则DROP USER
在所有SQL节点上完成该用户的删除之前,都无法删除数据库。
如果来自多个SQL节点的多个GRANT
,REVOKE
或其他用户管理语句导致给定用户的特权在不同的SQL节点上发散,则可以通过GRANT NDB_STORED_USER
在已知特权的SQL节点上向该用户发出此用户来解决此问题。正确;这将导致获取特权的新快照并将其同步到其他SQL节点。
NDB Cluster 8.0不支持通过将MySQL特权表转换为使用NDB
存储引擎来在NDB集群中的SQL节点之间分布MySQL用户和特权(如NDB 7.6和更早版本中所实现)(请参阅使用共享授权表的分布式特权)。有关此更改对从先前版本升级到NDB 8.0的影响的信息,请参见“升级和降级NDB群集”。