NDB Cluster supports distribution of MySQL users and privileges across all SQL nodes in an NDB Cluster. This support is not enabled by default; you should follow the procedure outlined in this section in order to do so.
      Normally, each MySQL server's user privilege tables in the
      mysql database must use the
      MyISAM storage engine, which means
      that a user account and its associated privileges created on one
      SQL node are not available on the cluster's other SQL nodes.
      An SQL file ndb_dist_priv.sql provided with
      the NDB Cluster distribution can be found in the
      share directory in the MySQL installation
      directory.
    
      The first step in enabling distributed privileges is to load this
      script into a MySQL Server that functions as an SQL node (which we
      refer to after this as the
      target SQL node or MySQL
      Server). You can do this by executing the following command from
      the system shell on the target SQL node after changing to its
      MySQL installation directory (where
      options stands for any additional
      options needed to connect to this SQL node):
    
$> mysql options -uroot < share/ndb_dist_priv.sql
      Importing ndb_dist_priv.sql creates a number
      of stored routines (six stored procedures and one stored function)
      in the mysql database on the target SQL node.
      After connecting to the SQL node in the mysql
      client (as the MySQL root user), you can verify
      that these were created as shown here:
    
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)
      The stored procedure named
      mysql_cluster_move_privileges creates backup
      copies of the existing privilege tables, then converts them to
      NDB.
    
      mysql_cluster_move_privileges performs the
      backup and conversion in two steps. The first step is to call
      mysql_cluster_backup_privileges, which creates
      two sets of copies in the mysql database:
- A set of local copies that use the - MyISAMstorage engine. Their names are generated by adding the suffix- _backupto the original privilege table names.
- A set of distributed copies that use the - NDBCLUSTERstorage engine. These tables are named by prefixing- ndb_and appending- _backupto the names of the original tables.
      After the copies are created,
      mysql_cluster_move_privileges invokes
      mysql_cluster_move_grant_tables, which contains
      the ALTER TABLE ...
      ENGINE = NDB statements that convert the mysql system
      tables to NDB.
    
      Normally, you should not invoke either
      mysql_cluster_backup_privileges or
      mysql_cluster_move_grant_tables manually; these
      stored procedures are intended only for use by
      mysql_cluster_move_privileges.
    
Although the original privilege tables are backed up automatically, it is always a good idea to create backups manually of the existing privilege tables on all affected SQL nodes before proceeding. You can do this using mysqldump in a manner similar to what is shown here:
$> mysqldump options -uroot \
    mysql user db tables_priv columns_priv procs_priv proxies_priv > backup_file
      To perform the conversion, you must be connected to the target SQL
      node using the mysql client (again, as the
      MySQL root user). Invoke the stored procedure
      like this:
    
mysql> CALL mysql.mysql_cluster_move_privileges();
Query OK, 0 rows affected (22.32 sec)
      Depending on the number of rows in the privilege tables, this
      procedure may take some time to execute. If some of the privilege
      tables are empty, you may see one or more No data -
      zero rows fetched, selected, or processed warnings
      when mysql_cluster_move_privileges returns. In
      such cases, the warnings may be safely ignored. To verify that the
      conversion was successful, you can use the stored function
      mysql_cluster_privileges_are_distributed as
      shown here:
    
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 checks
      for the existence of the distributed privilege tables and returns
      1 if all of the privilege tables are
      distributed; otherwise, it returns 0.
    
You can verify that the backups have been created using a query such as this one:
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)Once the conversion to distributed privileges has been made, any time a MySQL user account is created, dropped, or has its privileges updated on any SQL node, the changes take effect immediately on all other MySQL servers attached to the cluster. Once privileges are distributed, any new MySQL Servers that connect to the cluster automatically participate in the distribution.
        For clients connected to SQL nodes at the time that
        mysql_cluster_move_privileges is executed,
        you may need to execute FLUSH
        PRIVILEGES on those SQL nodes, or to disconnect and
        then reconnect the clients, in order for those clients to be
        able to see the changes in privileges.
All MySQL user privileges are distributed across all connected MySQL Servers. This includes any privileges associated with views and stored routines, even though distribution of views and stored routines themselves is not currently supported.
      In the event that an SQL node becomes disconnected from the
      cluster while mysql_cluster_move_privileges is
      running, you must drop its privilege tables after reconnecting to
      the cluster, using a statement such as
      DROP TABLE IF EXISTS
      mysql.user mysql.db mysql.tables_priv mysql.columns_priv
      mysql.procs_priv. This causes the SQL node to use the
      shared privilege tables rather than its own local versions of
      them. This is not needed when connecting a new SQL node to the
      cluster for the first time.
    
      In the event of an initial restart of the entire cluster (all data
      nodes shut down, then started again with
      --initial), the shared privilege
      tables are lost. If this happens, you can restore them using the
      original target SQL node either from the backups made by
      mysql_cluster_move_privileges or from a dump
      file created with mysqldump. If you need to use
      a new MySQL Server to perform the restoration, you should start it
      with --skip-grant-tables when
      connecting to the cluster for the first time; after this, you can
      restore the privilege tables locally, then distribute them again
      using mysql_cluster_move_privileges. After
      restoring and distributing the tables, you should restart this
      MySQL Server without the
      --skip-grant-tables option.
    
      You can also restore the distributed tables using
      ndb_restore
      --restore-privilege-tables
      from a backup made using START
      BACKUP in the ndb_mgm client. (The
      MyISAM tables created by
      mysql_cluster_move_privileges are not backed up
      by the START BACKUP command.)
      ndb_restore does not restore the privilege
      tables by default; the
      --restore-privilege-tables
      option causes it to do so.
    
      You can restore the SQL node's local privileges using either
      of two procedures.
      mysql_cluster_restore_privileges works as
      follows:
- If copies of the - mysql.ndb_*_backuptables are available, attempt to restore the system tables from these.
- Otherwise, attempt to restore the system tables from the local backups named - *_backup(without the- ndb_prefix).
      The other procedure, named
      mysql_cluster_restore_local_privileges,
      restores the system tables from the local backups only, without
      checking the ndb_* backups.
    
      The system tables re-created by
      mysql_cluster_restore_privileges or
      mysql_cluster_restore_local_privileges use the
      MySQL server default storage engine; they are not shared or
      distributed in any way, and do not use NDB Cluster's
      NDB storage engine.
    
      The additional stored procedure
      mysql_cluster_restore_privileges_from_local is
      intended for the use of
      mysql_cluster_restore_privileges and
      mysql_cluster_restore_local_privileges. It
      should not be invoked directly.
        Applications that access NDB Cluster data directly, including
        NDB API and ClusterJ applications, are not subject to the MySQL
        privilege system. This means that, once you have distributed the
        grant tables, they can be freely accessed by such applications,
        just as they can any other NDB
        tables. In particular, you should keep in mind that
        NDB API and ClusterJ applications can read and write
        user names, host names, password hashes, and any other contents
        of the distributed grant tables without any
        restrictions.