### 23.6.12 权限同步和 NDB\_已储存\_用户

[](<>)[](<>)

NDB 8.0 引入了一种新机制，用于在连接到 NDB Cluster 的 SQL 节点之间共享和同步用户、角色和权限。这可以通过授予[`NDB_STORED_USER`](privileges-provided.html#priv_ndb-stored-user)特权。有关使用信息，请参阅权限说明。

`NDB_STORED_USER`打印在输出中[`显示赠款`](show-grants.html)与任何其他特权一样，如下所示：

```
mysql> SHOW GRANTS for 'jon'@'localhost';
+---------------------------------------------------+
| Grants for jon@localhost                          |
+---------------------------------------------------+
| GRANT USAGE ON *.* TO `jon`@`localhost`           |
| GRANT NDB_STORED_USER ON *.* TO `jon`@`localhost` |
+---------------------------------------------------+
```

您还可以使用[**数据库\_选择\_全部**](mysql-cluster-programs-ndb-select-all.html)NDB Cluster 提供的实用程序，如下所示（一些输出被包装以保留格式）：

```
$> ndb_select_all -d mysql ndb_sql_metadata | grep '`jon`@`localhost`'
12      "'jon'@'localhost'"     0       [NULL]  "GRANT USAGE ON *.* TO `jon`@`localhost`"
11      "'jon'@'localhost'"     0       2       "CREATE USER `jon`@`localhost`
IDENTIFIED WITH 'caching_sha2_password' AS
0x2441243030352466014340225A107D590E6E653B5D587922306102716D752E6656772F3038512F
6C5072776D30376D37347A384B557A4C564F70495158656A31382E45324E33
REQUIRE NONE PASSWORD EXPIRE DEFAULT ACCOUNT UNLOCK PASSWORD HISTORY DEFAULT
PASSWORD REUSE INTERVAL DEFAULT PASSWORD REQUIRE CURRENT DEFAULT"
12      "'jon'@'localhost'"     1       [NULL]  "GRANT NDB_STORED_USER ON *.* TO `jon`@`localhost`"
```

`ndb_sql_metadata`是一个特殊的`新开发银行`使用不可见的表[**mysql**](mysql.html)或其他 MySQL 客户端。

一份声明授予[`NDB_STORED_USER`](privileges-provided.html#priv_ndb-stored-user)特权，例如`GRANT NDB_STORED_USER ON *.* TO 'cluster_app_user'@'localhost'`, 通过导演工作`新开发银行`使用查询创建快照`显示创建用户 cluster_app_user@localhost`和`显示 cluster_app_user@localhost 的授权`，然后将结果存储在`ndb_sql_metadata`.然后请求任何其他 SQL 节点来读取和应用快照。每当 MySQL 服务器启动并作为 SQL 节点加入集群时，它都会执行这些存储的[`创建用户`](create-user.html)和[`授予`](grant.html)作为集群模式同步过程的一部分的语句。

每当一条 SQL 语句在其起源之外的 SQL 节点上执行时，该语句就会在该 SQL 的实用程序线程中运行`NDBCLUSTER`存储引擎；这是在与 MySQL 复制副本应用程序线程等效的安全环境中完成的。

从 NDB 8.0.27 开始，执行更改用户权限的 SQL 节点在执行此操作之前会获取全局锁，这可以防止不同 SQL 节点上的并发 ACL 操作导致死锁。在 NDB 8.0.27 之前，对用户的更改为[`NDB_STORED_USER`](privileges-provided.html#priv_ndb-stored-user)以完全异步的方式更新，没有任何锁定。

您应该记住，因为共享模式更改操作是同步执行的，所以在对任何共享用户进行更改之后的下一个共享模式更改将用作同步点。在架构更改分发开始之前，任何待处理的用户更改都会运行完成；在此之后，架构更改本身同步运行。例如，如果一个[`删除数据库`](drop-database.html)声明如下[`删除用户`](drop-user.html)对于分布式用户，只有在所有 SQL 节点上完成用户删除后，才能删除数据库。

如果出现多个[`授予`](grant.html),[`撤销`](revoke.html)，或来自多个 SQL 节点的其他用户管理语句导致给定用户的权限在不同 SQL 节点上出现分歧，您可以通过发出`GRANT NDB_STORED_USER`对于已知权限正确的 SQL 节点上的此用户；这会导致获取权限的新快照并将其同步到其他 SQL 节点。

NDB Cluster 8.0 不支持通过更改 MySQL 权限表来跨 NDB Cluster 中的 SQL 节点分配 MySQL 用户和权限，以便它们使用`新开发银行`NDB 7.6 和更早版本中的存储引擎（请参阅[使用共享授权表的分布式特权](https://dev.mysql.com/doc/refman/5.7/en/mysql-cluster-privilege-distribution.html)）。有关此更改对从先前版本升级到 NDB 8.0 的影响的信息，请参阅[第 23.3.7 节，“升级和降级 NDB 集群”](mysql-cluster-upgrade-downgrade.html).
