NDB 8.0.18 では、NDB Cluster に接続された SQL ノード間でユーザー、役割、および特権を共有および同期するための新しいメカニズムが導入されました。 これを有効にするには、NDB_STORED_USER
権限を付与します。 使用方法の詳細は、権限の説明を参照してください。
NDB_STORED_USER
は、他の権限と同様に SHOW GRANTS
の出力に出力されます。 特権が共有されていることを確認するには、NDB Cluster ディストリビューションに付属の ndb_select_all ユーティリティーを使用します (フォーマットを保持するためにラップされた出力の一部):
shell> ndb_select_all -d mysql ndb_sql_metadata
type name seq note sql_ddl_text
11 "'jon'@'localhost'" 0 4 "CREATE USER 'jon'@'localhost'
IDENTIFIED WITH 'caching_sha2_password' AS
'$A$005${B];3!?tI\".EFy\ZA5K5DQHrWiBvuRNYTIMeO0YeBlPpZotFRPjVTYzTA5b0' REQUIRE
NONE PASSWORD EXPIRE DEFAULT ACCOUNT UNLOCK PASSWORD HISTORY DEFAULT PASSWORD
REUSE INTERVAL DEFAULT PASSWORD REQUIRE CURRENT DEFAULT"
12 "'jon'@'localhost'" 0 [NULL] "GRANT USAGE ON *.* TO `jon`@`localhost`"
12 "'jon'@'localhost'" 3 [NULL] "GRANT ALL PRIVILEGES ON `test`.* TO `jon`@`localhost`"
12 "'jon'@'localhost'" 2 [NULL] "GRANT ALL PRIVILEGES ON `mydb`.* TO `jon`@`localhost`"
12 "'jon'@'localhost'" 1 [NULL] "GRANT NDB_STORED_USER ON *.* TO `jon`@`localhost`"
5 rows returned
ndb_sql_metadata
は、mysql または他の MySQL クライアントを使用して表示できない特別な NDB
テーブルです。
GRANT NDB_STORED_USER ON *.* TO 'cluster_app_user'@'localhost'
などの NDB_STORED_USER
権限を付与するステートメントは、SHOW CREATE USER cluster_app_user@localhost
および SHOW GRANTS FOR cluster_app_user@localhost
のクエリーを使用してスナップショットを作成し、その結果を ndb_sql_metadata
に格納するように NDB
に指示することで機能します。 その後、他の SQL ノードはスナップショットの読取りおよび適用をリクエストされます。 MySQL サーバーは、クラスタを起動して SQL ノードとして結合するたびに、これらのストアド CREATE USER
および GRANT
ステートメントをクラスタスキーマの同期プロセスの一環として実行します。
元の SQL ノード以外の SQL ノードで SQL ステートメントが実行されると、そのステートメントは NDBCLUSTER
ストレージエンジンのユーティリティスレッドで実行されます。これは、MySQL レプリケーションレプリカアプリケーションスレッドと同等のセキュリティ環境内で実行されます。
NDB_STORED_USER
を使用したユーザーへの変更は、非同期に分散されることに注意してください。 分散スキーマの変更操作は同期的に実行されるため、分散ユーザーまたはユーザーに対する変更後の次の分散スキーマの変更は同期ポイントとして機能します。 保留中のユーザー変更は、スキーマ変更分散が開始される前に完了まで実行されます。この後、スキーマ変更自体が同期的に実行されます。 たとえば、DROP DATABASE
ステートメントが分散ユーザーの DROP USER
に続く場合、ユーザーの削除がすべての SQL ノードで完了するまで、データベースの削除は実行されません。
複数の GRANT
、REVOKE
または複数の SQL ノードからの他のユーザー管理ステートメントによって、特定のユーザーの権限が異なる SQL ノードで相違する場合は、権限が正しいことがわかっている SQL ノードでこのユーザーに対して GRANT NDB_STORED_USER
を発行することで、この問題を修正できます。これにより、権限の新しいスナップショットが取得され、他の SQL ノードと同期されます。
NDB Cluster 8.0 は、NDB 7.6 以前のリリースで実装されているように、NDB
ストレージエンジンを使用するように MySQL 特権テーブルを変換することによって、NDB Cluster 内の SQL ノード間での MySQL ユーザーおよび特権の配布をサポートしていません (Distributed Privileges Using Shared Grant Tables を参照)。 以前のリリースから NDB 8.0 へのアップグレードに対するこの変更の影響については、セクション23.2.7「NDB Cluster のアップグレードおよびダウングレード」 を参照してください。