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_privileges
或
mysql_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-tables
mysql_cluster_move_privileges
--skip-grant-tables
您还可以使用
ndb_restore
--restore-privilege-tables
从START
BACKUP
在ndb_mgm客户端中使用的备份还原分布式表。(
MyISAM
创建的表
mysql_cluster_move_privileges
不会被命令备份START BACKUP
。)
ndb_restore默认不恢复特权表;该
--restore-privilege-tables
选项使它这样做。
您可以使用两个过程中的任何一个来恢复 SQL 节点的本地权限。
mysql_cluster_restore_privileges
工作原理如下:
如果表的副本
mysql.ndb_*_backup
可用,请尝试从这些副本恢复系统表。否则,尝试从命名
*_backup
(不带ndb_
前缀)的本地备份恢复系统表。
另一个名为 的过程
mysql_cluster_restore_local_privileges
仅从本地备份恢复系统表,而不检查ndb_*
备份。
重新创建
mysql_cluster_restore_privileges
或
mysql_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 应用程序可以不受任何限制地读写用户名、主机名、密码哈希以及分布式授权表的任何其他内容。