TiDB ユーザーアカウント管理
このドキュメントでは、TiDB ユーザー アカウントの管理方法について説明します。
ユーザー名とパスワード
TiDB はユーザー アカウントをmysql.userシステム データベースのテーブルに保存します。各アカウントはユーザー名とクライアント ホストによって識別されます。各アカウントにはパスワードがある場合があります。
MySQL クライアントを使用して TiDBサーバーに接続し、指定されたアカウントとパスワードを使用してログインできます。各ユーザー名が 32 文字以内であることを確認してください。
mysql --port 4000 --user xxx --password
または、コマンド ライン パラメーターの省略形を使用します。
mysql -P 4000 -u xxx -p
ユーザーアカウントを追加する
TiDB アカウントは 2 つの方法で作成できます。
- アカウントの作成とその権限の確立を目的とした標準のアカウント管理 SQL ステートメント ( 
CREATE USERやGRANTなど) を使用します。 INSERT、UPDATE、またはDELETEなどのステートメントを使用して権限テーブルを直接操作します。更新が不完全になる可能性があるため、この方法を使用してアカウントを作成することはお勧めできません。
サードパーティの GUI ツールを使用してアカウントを作成することもできます。
CREATE USER [IF NOT EXISTS] user [IDENTIFIED BY 'auth_string'];
パスワードを割り当てると、TiDB はauth_string暗号化してmysql.userテーブルに保存します。
CREATE USER 'test'@'127.0.0.1' IDENTIFIED BY 'xxx';
TiDB アカウントの名前は、ユーザー名とホスト名で構成されます。アカウント名の構文は、「user_name」@「host_name」です。
user_nameでは大文字と小文字が区別されます。host_nameはホスト名または IP アドレスで、ワイルドカード%または_をサポートします。たとえば、ホスト名'%'サブネット内のすべてのホストに一致し、ホスト名'192.168.1.%'サブネット内のすべてのホストに一致します。
ホストはあいまい一致をサポートしています。
CREATE USER 'test'@'192.168.10.%';
test人のユーザーは、 192.168.10サブネット上の任意のホストからログインできます。
ホストが指定されていない場合、ユーザーは任意の IP からのログインが許可されます。パスワードが指定されていない場合、デフォルトは空のパスワードです。
CREATE USER 'test';
に相当:
CREATE USER 'test'@'%' IDENTIFIED BY '';
指定されたユーザーが存在しない場合、ユーザーを自動的に作成する動作はsql_modeに依存します。 sql_modeにNO_AUTO_CREATE_USERが含まれる場合、 GRANTステートメントはユーザーを作成せず、エラーが返されます。
たとえば、 sql_modeはNO_AUTO_CREATE_USER含まれておらず、次のCREATE USERおよびGRANTステートメントを使用して 4 つのアカウントを作成するとします。
CREATE USER 'finley'@'localhost' IDENTIFIED BY 'some_pass';
GRANT ALL PRIVILEGES ON *.* TO 'finley'@'localhost' WITH GRANT OPTION;
CREATE USER 'finley'@'%' IDENTIFIED BY 'some_pass';
GRANT ALL PRIVILEGES ON *.* TO 'finley'@'%' WITH GRANT OPTION;
CREATE USER 'admin'@'localhost' IDENTIFIED BY 'admin_pass';
GRANT RELOAD,PROCESS ON *.* TO 'admin'@'localhost';
CREATE USER 'dummy'@'localhost';
アカウントに付与された権限を確認するには、 SHOW GRANTSステートメントを使用します。
SHOW GRANTS FOR 'admin'@'localhost';
+-----------------------------------------------------+
| Grants for admin@localhost                          |
+-----------------------------------------------------+
| GRANT RELOAD, PROCESS ON *.* TO 'admin'@'localhost' |
+-----------------------------------------------------+
ユーザーアカウントを削除する
ユーザー アカウントを削除するには、 DROP USERステートメントを使用します。
DROP USER 'test'@'localhost';
この操作により、 mysql.userテーブル内のユーザーのレコードと権限テーブル内の関連レコードがクリアされます。
予約済みユーザーアカウント
TiDB は、データベースの初期化中に'root'@'%'デフォルト アカウントを作成します。
アカウントのリソース制限を設定する
現在、TiDB はアカウントのリソース制限の設定をサポートしていません。
アカウントのパスワードを割り当てる
TiDB はパスワードをmysql.userシステム データベースに保存します。パスワードを割り当てるまたは更新する操作は、 CREATE USER権限、またはmysqlデータベースに対する権限(新しいアカウントを作成するINSERT権限、既存のアカウントを更新するUPDATE権限) を持つユーザーにのみ許可されます。
新しいアカウントの作成時にパスワードを割り当てるには、
CREATE USERを使用し、IDENTIFIED BY句を含めます。CREATE USER 'test'@'localhost' IDENTIFIED BY 'mypass';既存のアカウントのパスワードを割り当てるか変更するには、
SET PASSWORD FORまたはALTER USERを使用します。SET PASSWORD FOR 'root'@'%' = 'xxx';または:
ALTER USER 'test'@'localhost' IDENTIFIED BY 'mypass';
rootパスワードを忘れた場合
構成ファイルを変更します。
tidb-server インスタンスの 1 つが配置されているマシンにログインします。
TiDB ノード展開ディレクトリの下の
confディレクトリに入り、tidb.toml構成ファイルを見つけます。構成ファイルの
securityセクションに構成項目skip-grant-tableを追加します。securityセクションがない場合は、次の 2 行を tidb.toml 構成ファイルの最後に追加します。[security] skip-grant-table = true
tidb-server プロセスを停止します。
tidb-server プロセスをビュー。
ps aux | grep tidb-servertidb-server に対応するプロセス ID (PID) を見つけ、
killコマンドを使用してプロセスを停止します。kill -9 <pid>
変更した構成を使用して TiDB を起動します。
注記:
TiDB プロセスを開始する前に
skip-grant-tableを設定すると、オペレーティング システム ユーザーのチェックが開始されます。オペレーティング システムのrootユーザーのみが TiDB プロセスを開始できます。TiDB ノード展開ディレクトリの下にある
scriptsディレクトリを入力します。オペレーティング システムの
rootアカウントに切り替えます。フォアグラウンドのディレクトリで
run_tidb.shスクリプトを実行します。新しいターミナル ウィンドウに
rootとしてログインし、パスワードを変更します。mysql -h 127.0.0.1 -P 4000 -u root
run_tidb.shスクリプトの実行を停止し、ステップ 1 で TiDB 構成ファイルに追加した内容を削除し、tidb-server が自動的に起動するまで待ちます。
FLUSH PRIVILEGES
ユーザーと権限に関連する情報は TiKVサーバーに保存され、TiDB はこの情報をプロセス内にキャッシュします。一般に、 CREATE USER 、 GRANT 、およびその他のステートメントによる関連情報の変更は、クラスター全体ですぐに有効になります。ネットワークが一時的に利用できないなどの何らかの要因によって操作が影響を受けた場合、TiDB はキャッシュ情報を定期的に再ロードするため、変更は約 15 分で有効になります。
権限テーブルを直接変更した場合は、次のコマンドを実行して変更をすぐに適用します。
FLUSH PRIVILEGES;
詳細は権限管理を参照してください。