Documentation Home
MySQL 8.0 参考手册  / 第 23 章 MySQL NDB Cluster 8.0  / 23.6 NDB Cluster的管理  /  21.6.13 使用共享授权表的分布式权限

21.6.13 使用共享授权表的分布式权限

NDB Cluster 支持在 NDB Cluster 中的所有 SQL 节点上分配 MySQL 用户和权限。默认情况下不启用此支持;为此,您应该遵循本节中概述的程序。

通常情况下,数据库中每个 MySQL 服务器的用户权限表 mysql必须使用 MyISAM存储引擎,这意味着在一个 SQL 节点上创建的用户帐户及其关联的权限在集群的其他 SQL 节点上不可用。NDB Cluster 发行版提供的 SQL 文件ndb_dist_priv.sql可以 share在 MySQL 安装目录的目录中找到。

启用分布式权限的第一步是将此脚本加载到充当 SQL 节点的 MySQL 服务器(我们在这之后将其称为 目标SQL 节点或 MySQL 服务器)。options您可以通过在更改到其 MySQL 安装目录(其中代表连接到此 SQL 节点所需的任何其他选项) 后从目标 SQL 节点上的系统 shell 执行以下命令来执行此操作 :

$> mysql options -uroot < share/ndb_dist_priv.sql

导入会在目标 SQL 节点上ndb_dist_priv.sql的数据库中创建许多存储例程(六个存储过程和一个存储函数) 。mysql连接到mysql 客户端中的 SQL 节点后(作为 MySQLroot用户),您可以验证这些是否已创建,如下所示:

mysql> SELECT ROUTINE_NAME, ROUTINE_SCHEMA, ROUTINE_TYPE
    ->     FROM INFORMATION_SCHEMA.ROUTINES
    ->     WHERE ROUTINE_NAME LIKE 'mysql_cluster%'
    ->     ORDER BY ROUTINE_TYPE;
+---------------------------------------------+----------------+--------------+
| ROUTINE_NAME                                | ROUTINE_SCHEMA | ROUTINE_TYPE |
+---------------------------------------------+----------------+--------------+
| mysql_cluster_privileges_are_distributed    | mysql          | FUNCTION     |
| mysql_cluster_backup_privileges             | mysql          | PROCEDURE    |
| mysql_cluster_move_grant_tables             | mysql          | PROCEDURE    |
| mysql_cluster_move_privileges               | mysql          | PROCEDURE    |
| mysql_cluster_restore_local_privileges      | mysql          | PROCEDURE    |
| mysql_cluster_restore_privileges            | mysql          | PROCEDURE    |
| mysql_cluster_restore_privileges_from_local | mysql          | PROCEDURE    |
+---------------------------------------------+----------------+--------------+
7 rows in set (0.01 sec)

名为的存储过程 mysql_cluster_move_privileges创建现有权限表的备份副本,然后将它们转换为 NDB.

mysql_cluster_move_privileges分两步执行备份和转换。第一步是调用 ,它在数据库 mysql_cluster_backup_privileges中创建两组副本:mysql

  • 一组使用 MyISAM存储引擎的本地副本。它们的名称是通过 _backup在原始权限表名称中添加后缀生成的。

  • 一组使用 NDBCLUSTER存储引擎的分布式副本。这些表是通过在原始表的名称前 加前缀ndb_和附加来命名的。_backup

创建副本后, mysql_cluster_move_privileges调用 mysql_cluster_move_grant_tables,其中包含ALTER TABLE ... ENGINE = NDB将 mysql 系统表转换为NDB.

通常,您不应该调用任何一个 mysql_cluster_backup_privilegesmysql_cluster_move_grant_tables手动调用;这些存储过程仅供 . 使用 mysql_cluster_move_privileges

尽管原始权限表是自动备份的,但在继续之前手动创建所有受影响的 SQL 节点上现有权限表的备份始终是个好主意。您可以使用mysqldump以类似于此处所示的方式执行此操作:

$> mysqldump options -uroot \
    mysql user db tables_priv columns_priv procs_priv proxies_priv > backup_file

要执行转换,您必须使用mysql客户端(再次以 MySQLroot用户身份)连接到目标 SQL 节点。像这样调用存储过程:

mysql> CALL mysql.mysql_cluster_move_privileges();
Query OK, 0 rows affected (22.32 sec)

根据权限表中的行数,执行此过程可能需要一些时间。如果某些权限表为空,您可能会在返回时看到一个或多个无数据 - 零行提取、选择或处理警告mysql_cluster_move_privileges。在这种情况下,可以安全地忽略警告。要验证转换是否成功,您可以使用存储函数 mysql_cluster_privileges_are_distributed,如下所示:

mysql> SELECT CONCAT(
    ->    'Conversion ',
    ->    IF(mysql.mysql_cluster_privileges_are_distributed(), 'succeeded', 'failed'),
    ->    '.')
    ->    AS Result;
+-----------------------+
| Result                |
+-----------------------+
| Conversion succeeded. |
+-----------------------+
1 row in set (0.00 sec)

mysql_cluster_privileges_are_distributed检查分布式特权表是否存在, 1如果所有特权表都已分发则返回;否则,它返回0

您可以使用如下查询来验证是否已创建备份:

mysql> SELECT TABLE_NAME, ENGINE FROM INFORMATION_SCHEMA.TABLES
    ->     WHERE TABLE_SCHEMA = 'mysql' AND TABLE_NAME LIKE '%backup'
    ->     ORDER BY ENGINE;
+-------------------------+------------+
| TABLE_NAME              | ENGINE     |
+-------------------------+------------+
| db_backup               | MyISAM     |
| user_backup             | MyISAM     |
| columns_priv_backup     | MyISAM     |
| tables_priv_backup      | MyISAM     |
| proxies_priv_backup     | MyISAM     |
| procs_priv_backup       | MyISAM     |
| ndb_columns_priv_backup | ndbcluster |
| ndb_user_backup         | ndbcluster |
| ndb_tables_priv_backup  | ndbcluster |
| ndb_proxies_priv_backup | ndbcluster |
| ndb_procs_priv_backup   | ndbcluster |
| ndb_db_backup           | ndbcluster |
+-------------------------+------------+
12 rows in set (0.00 sec)

一旦转换为分布式权限,任何时候在任何 SQL 节点上创建、删除 MySQL 用户帐户或更新其权限,更改都会立即在连接到集群的所有其他 MySQL 服务器上生效。一旦分配了权限,任何连接到集群的新 MySQL 服务器都会自动参与分配。

笔记

对于 mysql_cluster_move_privileges执行时连接到 SQL 节点的客户端,您可能需要FLUSH PRIVILEGES在这些 SQL 节点上执行,或者断开并重新连接客户端,以便这些客户端能够看到权限的变化。

所有 MySQL 用户权限分布在所有连接的 MySQL 服务器上。这包括与视图和存储例程相关的任何特权,即使当前不支持视图和存储例程本身的分发。

如果 SQL 节点在运行时与集群断开连接mysql_cluster_move_privileges,您必须在重新连接到集群后使用诸如 DROP TABLE IF EXISTS mysql.user mysql.db mysql.tables_priv mysql.columns_priv mysql.procs_priv. 这会导致 SQL 节点使用共享权限表而不是它们自己的本地版本。第一次将新的 SQL 节点连接到集群时不需要这样做。

如果整个集群初始重启(所有数据节点关闭,然后再次启动 --initial),共享特权表将丢失。如果发生这种情况,您可以使用原始目标 SQL 节点从 mysqldumpmysql_cluster_move_privileges创建的备份或转储文件中恢复它们。如果需要使用新的MySQL Server 进行恢复,则应在首次连接集群时启动;在此之后,您可以在本地恢复权限表,然后使用. 恢复和分配表后,您应该在没有选项 的情况下重新启动此 MySQL 服务器 。--skip-grant-tablesmysql_cluster_move_privileges--skip-grant-tables

您还可以使用 ndb_restore --restore-privilege-tablesSTART BACKUPndb_mgm客户端中使用的备份还原分布式表。( MyISAM创建的表 mysql_cluster_move_privileges不会被命令备份START BACKUP。) ndb_restore默认不恢复特权表;该 --restore-privilege-tables 选项使它这样做。

您可以使用两个过程中的任何一个来恢复 SQL 节点的本地权限。 mysql_cluster_restore_privileges工作原理如下:

  1. 如果表的副本mysql.ndb_*_backup可用,请尝试从这些副本恢复系统表。

  2. 否则,尝试从命名*_backup(不带 ndb_前缀)的本地备份恢复系统表。

另一个名为 的过程 mysql_cluster_restore_local_privileges仅从本地备份恢复系统表,而不检查ndb_*备份。

重新创建 mysql_cluster_restore_privilegesmysql_cluster_restore_local_privileges使用MySQL服务器默认存储引擎的系统表;它们不以任何方式共享或分发,也不使用 NDB Cluster 的 NDB存储引擎。

额外的存储过程 mysql_cluster_restore_privileges_from_local是为使用 mysql_cluster_restore_privileges和而 设计的mysql_cluster_restore_local_privileges。不应直接调用它。

重要的

直接访问 NDB Cluster 数据的应用程序,包括 NDB API 和 ClusterJ 应用程序,不受 MySQL 特权系统的约束。这意味着,一旦您分发了授权表,这些应用程序就可以自由访问它们,就像它们可以访问任何其他NDB 表一样。特别是,您应该记住 NDB API 和 ClusterJ 应用程序可以不受任何限制地读写用户名、主机名、密码哈希以及分布式授权表的任何其他内容