| First Creation | 2005/02/11 | 
|---|---|
| Last Update | 2007/02/05 | 
さて、MySQL が動くようになったところで、コマンドラインからデータベースを操作してみよう。いろいろやらかしてしまうのはお約束だ。
まずは基本中の基本であるユーザー管理からスタート。root の他に、Administrator というスーパーユーザーを作ってみよう。その後、mysql という一般ユーザーを作成する。
それから覚えておくといいのが、grant や insert でユーザーのパスワードを扱うときは、' (シングルコーテーション)や " (ダブルコーテーション)で囲った方がいいということだ。
もしこのページのコマンドがうまく動かなかったら、ユーザー名やパスワードをその記号で囲ってみるとうまく動作するかもしれない。
mysql> show databases;
+----------+
| Database |
+----------+
| mysql    |
| test     |
| user_db  |
+----------+
3 rows in set (0.00 sec)
mysql> use mysql;
Database changed
mysql> show tables;
+-----------------+
| Tables in mysql |
+-----------------+
| columns_priv    |
| db              |
| func            |
| host            |
| tables_priv     |
| user            |
+-----------------+
6 rows in set (0.01 sec)
mysql> describe user;
+-----------------+---------------+------+-----+---------+-------+
| Field           | Type          | Null | Key | Default | Extra |
+-----------------+---------------+------+-----+---------+-------+
| Host            | char(60)      |      | PRI |         |       |
| User            | char(16)      |      | PRI |         |       |
| Password        | char(16)      |      |     |         |       |
| Select_priv     | enum('N','Y') |      |     | N       |       |
| Insert_priv     | enum('N','Y') |      |     | N       |       |
| Update_priv     | enum('N','Y') |      |     | N       |       |
| Delete_priv     | enum('N','Y') |      |     | N       |       |
| Create_priv     | enum('N','Y') |      |     | N       |       |
| Drop_priv       | enum('N','Y') |      |     | N       |       |
| Reload_priv     | enum('N','Y') |      |     | N       |       |
| Shutdown_priv   | enum('N','Y') |      |     | N       |       |
| Process_priv    | enum('N','Y') |      |     | N       |       |
| File_priv       | enum('N','Y') |      |     | N       |       |
| Grant_priv      | enum('N','Y') |      |     | N       |       |
| References_priv | enum('N','Y') |      |     | N       |       |
| Index_priv      | enum('N','Y') |      |     | N       |       |
| Alter_priv      | enum('N','Y') |      |     | N       |       |
+-----------------+---------------+------+-----+---------+-------+
17 rows in set (0.00 sec)
    describe は、Field 情報を表示させるコマンドだ。
上記表示結果から、ユーザーテーブルの中身は、ホスト名、ユーザー名、パスワードの他に、14 種類の権限を設定する項目があり、計 17 項目から成り立っていることが分かる。
以下のコマンドを打ち込むことで、Administrator という名のスーパーユーザーができあがる。
mysql> insert into user values('localhost', 'Administrator', password('hogehoge'),
    'Y', 'Y', 'Y', 'Y', 'Y', 'Y', 'Y', 'Y', 'Y', 'Y', 'Y', 'Y', 'Y', 'Y');
    また、ユーザーを追加する方法は grant コマンドからも可能だ。
mysql> grant all privileges on *.* to Administrator@localhost identified by 'hogehoge' \
       with grant opttion;
    ユーザーを確認する方法は SELECT コマンドを使う。以下のコマンドは、mysql データベースの user テーブルを表示させなさいという命令。
mysql> select host,user,password from mysql.user; +-----------+---------------+------------------+ | host | user | password | +-----------+---------------+------------------+ | localhost | root | 442455895eac74e7 | | localhost | Administrator | 442455895eac74e7 | +-----------+---------------+------------------+ 2 rows in set (0.01 sec)
Administrator のパスワードは root と同じにしたため、同じハッシュ値(暗号化されたパスワード)が表示されている。
両方あってもしょうがないので、root の方を消すことにした。
mysql> delete from user where user='root' and host='localhost'; Query OK, 1 row affected (0.00 sec)
いったん C Shell ( zaurus で使っているシェル) に戻ってサーバーを再起動させ、 Administrator で入りなおした。
ここまでくればやり方はわかると思うが・・・念のため。
# mysqlstop # mysqlstart # mysql -u Administrator -p Enter password: パスワード入れて Enter
さて、お次は一般ユーザーの作成である。一般ユーザーにはどのような権限を与えたらいいだろうか。一つ一つ確認していこう。
| 権限 | 詳細 | 実際の設定 | 
|---|---|---|
| Select_priv | すでに存在しているテーブルの 操作権限 | Y | 
| Insert_priv | すでに存在しているテーブルの 操作権限 | Y | 
| Update_priv | すでに存在しているテーブルの 操作権限 | Y | 
| Delete_priv | すでに存在しているテーブルの 操作権限 | Y | 
| Create_priv | データベース作成権限 | Y | 
| Drop_priv | データベース削除権限 | Y | 
| Reload_priv | リロード権限データベースを更新したときに使うはず | Y | 
| Shutdown_priv | MySQL サーバー停止権限 | N | 
| Process_priv | 接続中のユーザー一覧を表示させる機能 | N | 
| File_priv | バイナリデータを扱う権限 | N | 
| Grant_priv | Grant コマンド使用権限 | N | 
| References_priv | 不明 | N | 
| Index_priv | インデックスの作成と削除権限。いらないかな? | N | 
| Alter_priv | テーブル構造の変更権限 | N | 
上記の内容を反映させて、mysql という一般ユーザーを作成する。
mysql> use mysql;
Database changed
mysql>  insert into user values('localhost', 'mysql', password('hogehoge'),
    'Y', 'Y', 'Y', 'Y', 'Y', 'Y', 'Y', 'N', 'N', 'N', 'N', 'N', 'N', 'N');
Query OK, 1 row affected (0.01 sec)
mysql> flush privileges;
Query OK, 0 rows affected (0.01 sec)
    さて、ここまではいいだろうか。では、次に作ったユーザーの削除をしてみる。
mysql> delete from user where user='mysql'; Query OK, 1 row affected (0.01 sec)
基本的にはこれだけ。「flush privileges;」は忘れないように。
MySQL で遊んでいるうちに root ユーザーを消してしまった。しかもスーパーユーザーである Administrator を追加する前にだ。
簡単に復帰させることができたが、またやらかす可能性も考えてその方法を書き留めておく。
ただし、root 以外のユーザーが最低一人、登録されている必要があると思う。でないと入れないし・・・まさか一人もいなくなるということはないだろうが・・・まさか君は!?
だからこのテンションの高さは何なんだ。後から見ると分けがわからん。(2007/01/31)
mysqlstop が効かないようなら zaurus の再起動をすれば MySQL は止まってる・・・はず。いざとなったら # ps aux で MySQL のプロセス ID を調べて、 # kill [プロセス ID] する。
# safe_mysqld --skip-grant-tables --skip-networking --user=mysql &
--skip-grant-tables オプションで、すべてのユーザーが grant コマンドを使えるようになった。つまり、権限が最低なアカウントでも他のユーザーを作成できるということだ。
# mysql -u mysql -p
mysql> grant all on *.* to root@localhost identified by "my_password" with grant option;
これで root が復活する。