CLOVER🍀

That was when it all began.

TiDBでユーザーを作成する

これは、なにをしたくて書いたもの?

これまでTiDBを使う時には、tiup playgroundで起動してそのままrootユーザー(しかもパスワードなし)で接続していたのですが、
通常のユーザーアカウントを作成する方法も押さえておいた方がよいかなと思いまして。

それから、このあたりのドキュメントがTiDBにどうまとまっているのかを押さえておくことも目的ですね。

TiDBにユーザーを追加する

結論から言うと、MySQLと同じくCREATE USER文を使います。

CREATE USER | TiDB SQL Statement Reference | PingCAP Docs

アクセス元を指定してユーザーを作成するのもの同じなようですね。

とはいえ、MySQLと完全に同じではないようで、以下が非互換のようです。

  • WITH MAX_QUERIES_PER_HOURTiDBWITH MAX_UPDATES_PER_HOURWITH MAX_USER_CONNECTIONSオプションはサポートしていない
  • DEFAULT ROLEオプションをサポートしていない

CREATE USER / MySQL compatibility

TiDBとMySQLとのセキュリティ面での互換性は、以下のページに記載されています。

Security Compatibility with MySQL | PingCAP Docs

WITH MAX_QUERIES_PER_HOURTiDBWITH MAX_UPDATES_PER_HOURWITH MAX_USER_CONNECTIONSオプションが
未サポートなことも、ここで出てきます(DEFAULT ROLEの話はありませんが…)。

また、アカウント管理に関する情報はこちらにまとまっています。

TiDB User Account Management | PingCAP Docs

デフォルトで作成されるrootアカウントについては、こちらに記載がありますね。

TiDB User Account Management / Reserved user accounts

というわけで、動作確認しておきましょう。

環境

今回の環境はこちら。

$ tiup --version
1.15.2 v1.15.0-nightly-20
Go Version: go1.21.11
Git Ref: master
GitHash: 423dd0d00e17aaea6b907cdcedaf63dd2411a2a8

TiDBは以下のコマンドで起動し、172.17.0.2で動作しているものとします。

$ tiup playground v8.1.0 --host 0.0.0.0

TiDBのバージョン。

 MySQL  localhost:4000 ssl  SQL > select version();
+--------------------+
| version()          |
+--------------------+
| 8.0.11-TiDB-v8.1.0 |
+--------------------+
1 row in set (0.0016 sec)

使用するMySQLクライアント。

$ mysqlsh --version
mysqlsh   Ver 8.0.37 for Linux on x86_64 - for MySQL 8.0.37 (MySQL Community Server (GPL))

クライアントであるMySQL Shellは、TiDBが動作しているサーバーおよび別のサーバーから利用するものとします。

TiDBにユーザーを作成する

まずはTiDBに接続します。TiDBの接続はtiup clientでも行えますが、今回はすべてMySQL Shellで行います。

$ mysqlsh root:@localhost:4000 --sql

ついでなので、新しいユーザー用のデータベースも作成しましょう。

 MySQL  localhost:4000 ssl  SQL > create database mydatabase;
Query OK, 0 rows affected (0.4298 sec)

Create a Database | PingCAP Docs

ユーザーを作成。

 MySQL  localhost:4000 ssl  SQL > create user myuser@'%' identified by 'myuser-password';
Query OK, 0 rows affected (1.2969 sec)

%ワイルドカードです。今回はどのサーバーからの接続も許可することにします。

作成したユーザーに、最初に作成したデータベースのすべての権限を与えます。

 MySQL  localhost:4000 ssl  SQL > grant all privileges on mydatabase.* to myuser@'%';
Query OK, 0 rows affected (0.9754 sec)

GRANT <privileges> | TiDB SQL Statement Reference | PingCAP Docs

作成したユーザーで接続してみます。今回はデータベースを直接指定します。

$ mysqlsh myuser@localhost:4000/mydatabase --sql

テーブルが作成できることなどを確認。

 MySQL  localhost:4000 ssl  mydatabase  SQL > create table t1(c1 int, primary key(c1));
Query OK, 0 rows affected (0.3252 sec)
 MySQL  localhost:4000 ssl  mydatabase  SQL > insert into t1(c1) values(1);
Query OK, 1 row affected (0.0157 sec)
 MySQL  localhost:4000 ssl  mydatabase  SQL > select * from t1;
+----+
| c1 |
+----+
|  1 |
+----+
1 row in set (0.0037 sec)

OKですね。

続いては、別のサーバーからアクセスしてみましょう。

$ mysqlsh myuser@172.17.0.2:4000/mydatabase --sql

アクセスできました。

 MySQL  172.17.0.2:4000 ssl  mydatabase  SQL > select * from t1;
+----+
| c1 |
+----+
|  1 |
+----+
1 row in set (0.0018 sec)

ここで、接続しているユーザーを確認しておきます。

 MySQL  localhost:4000 ssl  mydatabase  SQL > show full processlist;
+------------+--------+------------------+------------+---------+------+------------+-----------------------+
| Id         | User   | Host             | db         | Command | Time | State      | Info                  |
+------------+--------+------------------+------------+---------+------+------------+-----------------------+
| 3047161876 | myuser | 172.17.0.3:38318 | mydatabase | Sleep   |   58 | autocommit | NULL                  |
| 3047161872 | myuser | [::1]:47606      | mydatabase | Query   |    0 | autocommit | show full processlist |
+------------+--------+------------------+------------+---------+------+------------+-----------------------+
2 rows in set (0.0008 sec)

よさそうです。

ところで

ところで、rootユーザーのパスワードは設定されていません。

なので、以下のコマンドでなにも聞かれずにログインできてしまいます。
root:@:の後はパスワードです

$ mysqlsh root:@localhost:4000 --sql

以下の指定にするとパスワードは聞かれますが、そのままEnterを押すとログインできてしまいます。

$ mysqlsh root@localhost:4000 --sql

というわけで、設定しておきましょう。

 MySQL  localhost:4000 ssl  SQL > set password='root-password';
Query OK, 0 rows affected (0.1260 sec)

SET PASSWORD | TiDB SQL Statement Reference | PingCAP Docs

こんなところでしょうか。

おわりに

TiDBでユーザーを作成してみました。MySQLと変わりませんね。

という一方で、ドキュメントのたどり方というか、どこになにがあるかがまだよくわかりませんね…。
こういうテーマをこなしつつ、覚えていきましょう。