Documentation Home
MySQL 5.6 リファレンスマニュアル
Download this Manual
PDF (US Ltr) - 26.8Mb
PDF (A4) - 26.9Mb
HTML Download (TGZ) - 7.2Mb
HTML Download (Zip) - 7.2Mb


18.5.14 MySQL Cluster の配布された MySQL 権限

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 は次のように機能します。

  1. mysql.ndb_*_backup テーブルのコピーを使用できる場合は、これらからシステムテーブルのリストアを試みます。

  2. それ以外の場合は、(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 アプリケーションは制約なしで、ユーザー名、ホスト名、パスワードハッシュ、および配布された付与テーブルのその他の内容の読み取りと書き込みを行うことができることに留意してください