MySQL 为NDB集群分发MySQL用户和权限

为NDB集群分发MySQL用户和权限
NDB集群支持在一个NDB集群中的所有SQL节点上分配MySQL用户和权限。默认情况下不启用此支持;为了这样做,您应该遵循以下过程。

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

[root@mysqld share]# pwd
/usr/local/mysql/share
[root@mysqld share]# ll ndb*
-rw-r--r--. 1 root mysql 12442 Sep 26  2024 ndb_dist_priv.sql

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

[root@mysqld share]# mysql -uroot -p123456 < /usr/local/mysql/share/ndb_dist_priv.sql
mysql: [Warning] Using a password on the command line interface can be insecure.

导入 ndb_dist_priv.sql 会在目标 SQL 节点的 mysql 数据库中创建多个存储例程(六个存储过程和一个存储函数)。在 mysql 客户端连接到

SQL 节点(以 MySQL 根用户身份)后,您可以按如下所示验证这些例程是否已创建:

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.03 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来实现这个目的,如下所示:

[root@mysqld /]# mysqldump  -uroot -p123456 mysql user db tables_priv columns_priv procs_priv proxies_priv > backup_file
mysqldump: [Warning] Using a password on the command line interface can be insecure.

要执行转换,必须使用mysql客户端连接到目标SQL节点(同样,作为mysql root用户)。像这样调用存储过程:

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

根据权限表中的行数,此过程可能需要一些时间来执行。如果某些权限表是空的,那么当mysql_cluster_move_privileges返回时,您可能会看到一个或多个No data – zero rows fetched, selected, or processed 警告。在这种情况下,可以安全地忽略警告。为了验证转换是否成功,

你可以使用存储函数mysql_cluster_priviles_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.01 sec)

mysql_cluster_privile_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_tables_priv_backup  | ndbcluster |
| ndb_proxies_priv_backup | ndbcluster |
| ndb_procs_priv_backup   | ndbcluster |
| ndb_db_backup           | ndbcluster |
| ndb_columns_priv_backup | ndbcluster |
| ndb_user_backup         | ndbcluster |
+-------------------------+------------+
12 rows in set (0.01 sec)

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

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

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

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

如果初始重新启动整个集群(关闭所有数据节点,然后使用–initial重新启动),则共享权限表将丢失。如果发生这种情况,您可以使用原始 目标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客户端中使用START BACKUP进行的备份中恢复分布式表。 (mysql_cluster_move_privileges创建的MyISAM表不通过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_privileges或mysql_cluster_restore_local_privileges重新创建的系统表使用MySQL服务器默认的存储引擎;它们不 以任何方式共享或分发,也不使用NDB Cluster的NDB存储引擎。

额外的存储过程mysql_cluster_restore_privile_from_local用于使用mysql_cluster_restore_privileges和 mysql_cluster_restore_local_privileges。它不应该被直接调用。

发表评论

电子邮件地址不会被公开。