これは、なにをしたくて書いたもの?
これまでTiDBを使う時には、tiup playground
で起動してそのままrootユーザー(しかもパスワードなし)で接続していたのですが、
通常のユーザーアカウントを作成する方法も押さえておいた方がよいかなと思いまして。
それから、このあたりのドキュメントがTiDBにどうまとまっているのかを押さえておくことも目的ですね。
TiDBにユーザーを追加する
結論から言うと、MySQLと同じくCREATE USER
文を使います。
CREATE USER | TiDB SQL Statement Reference | PingCAP Docs
アクセス元を指定してユーザーを作成するのもの同じなようですね。
とはいえ、MySQLと完全に同じではないようで、以下が非互換のようです。
WITH MAX_QUERIES_PER_HOURTiDB
、WITH MAX_UPDATES_PER_HOUR
、WITH MAX_USER_CONNECTIONS
オプションはサポートしていないDEFAULT ROLE
オプションをサポートしていない
CREATE USER / MySQL compatibility
TiDBとMySQLとのセキュリティ面での互換性は、以下のページに記載されています。
Security Compatibility with MySQL | PingCAP Docs
WITH MAX_QUERIES_PER_HOURTiDB
、WITH MAX_UPDATES_PER_HOUR
、WITH 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と変わりませんね。
という一方で、ドキュメントのたどり方というか、どこになにがあるかがまだよくわかりませんね…。
こういうテーマをこなしつつ、覚えていきましょう。