NDB集群支持将MySQL用户和权限分布到NDB集群中的所有SQL节点。默认情况下不启用此支持;为了做到这一点,您应该遵循本节中概述的步骤。
通常,每个MySQL服务器的用户权限表都在mysql
数据库必须使用MyISAM
这意味着在一个SQL节点上创建的用户帐户及其关联特权在集群的其他SQL节点上不可用。一个SQL文件ndb_dist_priv.sql
NDB Cluster 7.3及更高版本提供。此文件可以在分享
MySQL安装目录下的目录。
启用分布式特权的第一步是将此脚本加载到作为SQL节点的MySQL服务器中(在此之后我们将其称为目标SQL节点或MySQL服务器)。您可以在目标SQL节点上的系统shell中执行以下命令,然后更改其MySQL安装目录(其中选项
表示连接到此SQL节点所需的任何附加选项):
壳> mysql选项-uroot < share/ ndb_dist_privp .sql .sql . txt
进口ndb_dist_priv.sql
类中创建许多存储例程(六个存储过程和一个存储函数)mysql
数据库在目标SQL节点上。中连接SQL节点后mysql客户端(如MySQL根
用户),你可以验证这些被创建如下所示:
mysql>从信息模式中选择ROUTINE_NAME, ROUTINE_SCHEMA, ROUTINE_TYPE ->。例程-> WHERE ROUTINE_NAME LIKE 'mysql_cluster%' -> ORDER BY ROUTINE_TYPE;+---------------------------------------------+----------------+--------------+ | ROUTINE_NAME | ROUTINE_SCHEMA | ROUTINE_TYPE | +---------------------------------------------+----------------+--------------+ | mysql_cluster_privileges_are_distributed | mysql函数| | | mysql_cluster_backup_privileges | mysql程序| | | mysql_cluster_move_grant_tables | mysql程序| | | mysql_cluster_move_privileges | mysql程序| | | mysql_cluster_restore_local_privileges mysql | |过程| | mysql_cluster_restore_privileges | mysql程序| | | mysql_cluster_restore_privileges_from_local mysql | |过程 | +---------------------------------------------+----------------+--------------+ 7行集(0.01秒)
存储过程名为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
,其中包含修改表…Engine = NDB
将mysql系统表转换为NDB
.
通常情况下,您不应该调用它们mysql_cluster_backup_privileges
或mysql_cluster_move_grant_tables
手动;这些存储过程仅供mysql_cluster_move_privileges
.
尽管原始特权表是自动备份的,但在继续之前,在所有受影响的SQL节点上手动创建现有特权表的备份总是一个好主意。你可以用, mysqldump以类似于这里所示的方式:
壳>,mysqldump选项-uroot \ mysql user db tables_priv columns_priv procs_priv proxies_priv > .使用实例backup_file
方法连接到目标SQL节点,才能执行转换mysql客户端(同样,作为MySQL根
用户)。像这样调用存储过程:
调用mysql.mysql_cluster_move_privileges();查询OK, 0行受影响(22.32秒)
根据特权表中的行数,此过程可能需要一些时间来执行。如果某些特权表为空,则可能会看到一个或多个特权表无数据——获取、选择或处理的行为零警告时mysql_cluster_move_privileges
的回报。在这种情况下,可以完全忽略这些警告。要验证转换是否成功,可以使用存储的函数mysql_cluster_privileges_are_distributed
如下图:
mysql> SELECT CONCAT(-> 'Conversion ', -> IF(mysql. mysql_cluster_priviles_are_distributed (), 'succeeded', 'failed'), -> '.') -> AS Result;+-----------------------+ | 结果 | +-----------------------+ | 转换成功了。| +-----------------------+ 1行集(0.00秒)
mysql_cluster_privileges_are_distributed
检查是否存在分布式特权表并返回1
如果所有的特权表都是分布式的;否则,它会返回0
.
你可以用这样的查询来验证备份是否已经创建:
SELECT TABLE_NAME, ENGINE FROM INFORMATION_SCHEMAtable -> WHERE TABLE_SCHEMA = 'mysql' AND TABLE_NAME LIKE '%backup' -> ORDER BY ENGINE;+-------------------------+------------+ | TABLE_NAME |引擎 | +-------------------------+------------+ | db_backup | MyISAM | | user_backup | MyISAM | | columns_priv_backup | MyISAM | | tables_priv_backup | MyISAM | | proxies_priv_backup | MyISAM | | procs_priv_backup | MyISAM | | ndb_user_backup | ndbcluster | | ndb_tables_priv_backup | ndbcluster | | ndb_proxies_priv_backup | ndbcluster | | ndb_procs_priv_backup | ndbcluster | | ndb_db_backup | ndbcluster | | ndb_columns_priv_backup |ndbcluster | +-------------------------+------------+ 12行集(0.00秒)
一旦完成了向分布式权限的转换,在任何SQL节点上创建、删除或更新MySQL用户帐户的权限时,这些更改将立即在附加到集群的所有其他MySQL服务器上生效。一旦特权被分发,任何连接到集群的新MySQL服务器都会自动参与分发。
对于当时连接到SQL节点的客户端mysql_cluster_move_privileges
执行时,您可能需要执行什么冲洗的特权
或者断开连接,然后重新连接客户端,以便这些客户端能够看到特权的变化。
所有MySQL用户权限都分布在所有连接的MySQL服务器上。这包括与视图和存储例程相关的任何特权,尽管当前不支持视图和存储例程本身的分发。
当SQL节点与集群断开连接时mysql_cluster_move_privileges
正在运行,则必须在重新连接到集群后删除其特权表,使用语句删除表如果存在mysql。mysql.db用户mysql。tables_priv mysql。columns_priv mysql.procs_priv
.这将导致SQL节点使用共享特权表,而不是自己的本地版本。当一个新的SQL节点第一次连接到集群时,不需要这样做。
在整个集群初始重启的情况下(所有数据节点关闭,然后重新启动——初始
)时,共享特权表将丢失。如果发生这种情况,您可以使用原始目标SQL节点从备份恢复它们mysql_cluster_move_privileges
或从创建的转储文件, mysqldump.如果您需要使用一个新的MySQL服务器来执行恢复,您应该从——skip-grant-tables
第一次连接集群时;在此之后,您可以在本地恢复特权表,然后使用mysql_cluster_move_privileges
.在恢复和分发表之后,您应该重新启动这个MySQL服务器——skip-grant-tables
选择。
还可以使用恢复分布式表ndb_restore——restore-privilege-tables
从备份使用开始备份
在ndb_mgm客户端。(MyISAM
创建的表mysql_cluster_move_privileges
是否有备份开始备份
命令。)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集群的NDB
存储引擎。
附加的存储过程mysql_cluster_restore_privileges_from_local
是打算使用的mysql_cluster_restore_privileges
而且mysql_cluster_restore_local_privileges
.不应该直接调用它。
直接访问NDB集群数据的应用程序(包括NDB API和ClusterJ应用程序)不受MySQL特权系统的限制。这意味着,一旦您分发了授权表,这些应用程序就可以自由地访问它们,就像它们可以访问任何其他应用程序一样NDB
表。特别地,你应该记住NDB API和ClusterJ应用程序可以读写用户名、主机名、密码散列和分布式授权表的任何其他内容,不受任何限制.