MySQL Cluster では、MySQL Cluster 内のすべての SQL ノード間での MySQL ユーザーおよび権限の配布がサポートされています。このサポートは、デフォルトで無効になっています。有効にするには、このセクションで概要を示した手順に従うようにしてください。
通常は、mysql
データベース内の各 MySQL サーバーのユーザー権限テーブルで、MyISAM
ストレージエンジンが使用されている必要があります。つまり、ある SQL ノードで作成されたユーザーアカウントおよびそれに関連付けられた権限は、クラスタのその他の SQL ノードで使用できません。SQL ファイル ndb_dist_priv.sql
は、MySQL Cluster NDB 7.3 以降の配布で提供されています。このファイルは、MySQL インストールディレクトリ内の share
ディレクトリで見つけることができます。
配布された権限を有効にする最初のステップは、このスクリプトを SQL ノードとして機能する MySQL サーバー (これは、ターゲット SQL ノードまたは MySQL サーバーと呼ばれます) にロードすることです。これは、ターゲット SQL ノードで、その MySQL インストールディレクトリに移動したあとに、システムシェルから次のコマンドを実行することで実現できます (ここで、options
は、この SQL ノードに接続するために必要となる任意の追加オプションを表します)。
shell> mysql options -uroot < share/ndb_dist_priv.sql
ndb_dist_priv.sql
をインポートすると、ターゲット SQL ノード上の mysql
データベースに、いくつかのストアドルーチン (6 つのストアドプロシージャーと 1 つのストアドファンクション) が作成されます。mysql クライアント内の SQL ノードに (MySQL root
ユーザーとして) 接続すると、これらが次に示すように作成されたことを確認できます。
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
は、2 つのステップでバックアップおよび変換を実行します。1 つめのステップは、mysql_cluster_backup_privileges
を呼び出すことで、これにより、mysql
データベースに 2 セットのコピーが作成されます。
MyISAM
ストレージエンジンを使用するローカルコピーのセット。これらの名前は、元の権限テーブル名に_backup
というサフィクスを追加することで生成されます。NDBCLUSTER
ストレージエンジンを使用する配布されたコピーのセット。これらのテーブルは、元のテーブル名の前にndb_
を付け、_backup
を追加することによって、名前が付けられます。
コピーが作成されると、mysql_cluster_move_privileges
によって、mysql システムテーブルを NDB
に変換する ALTER TABLE ... ENGINE = NDB
ステートメントを含む mysql_cluster_move_grant_tables
が呼び出されます。
通常は、mysql_cluster_backup_privileges
または mysql_cluster_move_grant_tables
を手動で呼び出すべきではありません。これらのストアドプロシージャーは、mysql_cluster_move_privileges
によって使用されるためにのみ提供されています。
元の権限テーブルは自動的にバックアップされますが、影響を受けるすべての SQL ノードの既存の権限テーブルのバックアップを手動で作成してから続行することは、常に適切な方法です。これは、次に示すものと同様の方法で mysqldump を使用して実行できます。
shell> mysqldump options -uroot \
mysql host user db tables_priv columns_priv procs_priv proxies_priv > backup_file
変換を実行するには、mysql クライアントを (再度 MySQL root
ユーザーとして) 使用して、ターゲット SQL ノードに接続する必要があります。次のように、ストアドプロシージャーを呼び出します。
mysql> CALL mysql.mysql_cluster_move_privileges();
Query OK, 0 rows affected (22.32 sec)
このプロシージャーの実行には、権限テーブル内の行数に応じて、ある程度の時間がかかる可能性があります。権限テーブルの一部が空になっている場合は、1 つ以上の No data - zero rows fetched, selected, or processedという警告が 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 |
+-------------------------+------------+
| host_backup | MyISAM |
| db_backup | MyISAM |
| columns_priv_backup | MyISAM |
| user_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_host_backup | ndbcluster |
| ndb_db_backup | ndbcluster |
| ndb_columns_priv_backup | ndbcluster |
+-------------------------+------------+
14 rows in set (0.00 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
を付けて再起動される) と、共有権限テーブルが失われます。これが発生した場合は、mysql_cluster_move_privileges
によって作成されたバックアップから、または mysqldump を使用して作成されたダンプファイルから元のターゲット SQL ノードを使用して、それらをリストアできます。新しい MySQL サーバーを使用してリストアを実行する必要がある場合は、はじめてクラスタに接続するときに、--skip-grant-tables
を付けて起動してください。それ以降は、権限テーブルをローカルでリストアしてから再度 mysql_cluster_move_privileges
を使用して、それらを配布できます。テーブルをリストアして配布したあとは、--skip-grant-tables
オプションを付けずに、この MySQL サーバーを再起動してください。
ndb_mgm クライアントで START BACKUP
を使用して作成されたバックアップから ndb_restore --restore-privilege-tables
を使用して、配布されたテーブルをリストアすることもできます。(mysql_cluster_move_privileges
で作成された MyISAM
テーブルは、START BACKUP
コマンドでバックアップされません。) ndb_restore は、デフォルトで権限テーブルをリストアしません。--restore-privilege-tables
オプションを使用すれば、これを実行できます。
2 つのプロシージャーのいずれかを使用すると、SQL ノードのローカル権限をリストアできます。mysql_cluster_restore_privileges
は次のように機能します。
mysql.ndb_*_backup
テーブルのコピーを使用できる場合は、これらからシステムテーブルのリストアを試みます。それ以外の場合は、(
ndb_
プリフィクスが付けられていない)*_backup
という名前のローカルバックアップから、システムテーブルのリストアを試みます。
もう 1 つの mysql_cluster_restore_local_privileges
という名前のプロシージャーは、ndb_*
バックアップをチェックせずに、ローカルバックアップのみからシステムテーブルをリストアします。
mysql_cluster_restore_privileges
または mysql_cluster_restore_local_privileges
で再作成されたシステムテーブルでは、MySQL サーバーのデフォルトストレージエンジンが使用されます。また、それらはどのような方法でも共有も配布も行われず、MySQL Cluster の NDB
ストエージエンジンが使用されません。
追加のストアドプロシージャー mysql_cluster_restore_privileges_from_local
は、mysql_cluster_restore_privileges
および mysql_cluster_restore_local_privileges
で使用されるために提供されています。直接呼び出すべきではありません。
NDB API や ClusterJ アプリケーションを含む MySQL Cluster データに直接アクセスするアプリケーションは、MySQL 権限システムの対象外です。つまり、付与テーブルを配布したら、ほかの NDB
テーブルの場合と同様に、このようなアプリケーションからそれらに自由にアクセスできます。特に、NDB API および ClusterJ アプリケーションは制約なしで、ユーザー名、ホスト名、パスワードハッシュ、および配布された付与テーブルのその他の内容の読み取りと書き込みを行うことができることに留意してください。