10bet网址
MySQL 5.6参考手册
相关的文档10bet官方网站 下载本手册
PDF(美国高级主任)- 29.5 mb
PDF (A4)- 29.5 mb
PDF (RPM)- 28.2 mb
HTML下载(TGZ)- 7.1 mb
HTML下载(Zip)- 7.1 mb
HTML下载(RPM)- 6.1 mb
手册页(TGZ)- 190.3 kb
手册页(Zip)- 305.1 kb
信息(Gzip)- 2.8 mb
信息(邮政编码)- 2.8 mb
本手册节选

18.5.12使用共享授权表实现分布式权限

NDB集群支持将MySQL用户和权限分布到NDB集群中的所有SQL节点。默认情况下不启用此支持;为了做到这一点,您应该遵循本节中概述的步骤。

通常,每个MySQL服务器的用户权限表都在mysql数据库必须使用MyISAM这意味着在一个SQL节点上创建的用户帐户及其关联特权在集群的其他SQL节点上不可用。一个SQL文件ndb_dist_priv.sqlNDB 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_privilegesmysql_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工作内容如下:

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

  2. 否则,尝试从指定的本地备份恢复系统表* _backup(没有ndb_前缀)。

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

重新创建的系统表mysql_cluster_restore_privilegesmysql_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应用程序可以读写用户名、主机名、密码散列和分布式授权表的任何其他内容,不受任何限制