mysqlの初期設定(mysql4.1.14 gentoo)

MySQL 4.1 リファレンスマニュアル

1.mysql_install_db を実行する。

このコマンドが権限テーブルを作成する。インストール時にやればいいのに、と思ったけど誰でも何でも出来る状態はよくないよね。ユーザ自身で初期化しろと。

2.mysql 上の root ユーザのパスワードを設定する。

MySQL 権限の初期設定

初期化直後はユーザ root にパスワードが設定されていないため、全てのローカルユーザが root として mysql に接続することができる。なのでパスワードを設定する。

$ mysqladmin -u root password new_password

の方が便利そうだけど、シェルのヒストリにパスワードが残りそうな気がする。
MySQL サーバへの接続

注意: コマンドラインでパスワードを指定するのは安全ではありません。 同じシステム内のどのユーザでも、ps auxww のようなコマンドを使用してパスワードを知ることができてしまいます。

だそうです。

$ mysql -u root mysql
mysql> SET PASSWORD FOR root@localhost=PASSWORD('new_password');

3.ユーザの追加

任意のユーザ名で mysql に接続できる。個々のデータベースに接続するには grant で権限を割り当てなければいけない。mysqlのユーザとunixユーザとの間に関連はない。たぶん、ユーザ名を省略してmysqlに接続したときに unixユーザ名が利用されるだけと思われ。

ただ単にユーザを追加するって機能はないようだ。
ここでは、データ更新のみ許可するユーザを追加する。

mysql> grant 
    -> select,create temporary tables,delete,insert,lock tables,update
    -> on <データベース名>.*
    -> to <ユーザ名> identified by '<パスワード>';

ユーザ名は、username@hostnameで指定する。hostname無しの場合は、username@%と解釈される。localhostは%に含まれない。username@hostnameとusername@%が両方登録されていた場合、hostnameから接続した場合はusername@hostnameと解釈される。っていうか当たり前だ。詳細度順ってやつ?
なんていうか、だんだんmysqlが信用できなくなってきた。柔軟すぎないか?いらんよ。まー使わなきゃいいんだが。

4.セキュリティとか

4.1.リモート接続

my.cnf

bind-address=127.0.0.1

リモートからの接続はできなくなる。

4.2.ユーザ

任意のユーザ名でmysqlには接続できる。testおよびtest_%データベース以外のデータベースにはgrantで割り当てない限り接続できない。つまり、testおよびtest_%データベースには(登録されていない)任意のユーザ名で接続できる。実運用時には不要だと思うが…

  • 初期化時点で、root@localhost,root@,<空白>@localhost,<空白>@の4ユーザが登録されている。
  • root@localhost,root@は全権限を持っている。よくわからないのが、なぜroot@がわざわざ用意されるんでしょ?いらないはずなんだけど。
  • <空白>@localhost,<空白>@はtestおよびtest_%データベースに対する全権限を持っている。

というわけで、削除すべきなのは、

  1. root@
  2. <空白>@localhost
  3. <空白>@
  4. testデータベース

dbテーブルからtestデータベースのレコードが消せないよ…

mysql> select user,host,db from db;
+------+------+---------+
| user | host | db      |
+------+------+---------+
|      | %    | test    |
|      | %    | test\_% |
+------+------+---------+
2 rows in set (0.00 sec)
mysql> grant all on test.* to ''@'%';
Query OK, 0 rows affected (0.01 sec)

mysql> revoke all on test.* from ''@'%';
Query OK, 0 rows affected (0.00 sec)

testデータベースのほうの行は消せた。
drop userやっちゃうと、dbテーブルのエントリは消せないらしい。

mysql> revoke all on `test\_%`.* from ''@'%';
Query OK, 0 rows affected (0.00 sec)

test_%も消せた。'じゃなくて`らしい。バッククオートだったっけ?

5.日本語関係

my.cnfをいじるんでしょう。まだ見てませんが。
日本MySQLユーザ会/F.A.Q.

[mysqld]
default-character-set = ujis
# 5.0.13-rc 以上
#skip-character-set-client-handshake

[mysqldump]
default-character-set = ujis

[mysql]
default-character-set = ujis

http://www.mysql.gr.jp/frame/modules/bwiki/?FAQ#content_1_40
上の件はもういいのかな?

6.データベース作成など

mysql>create database <データベース名>;
Query OK, 1 row affected (0.00 sec)
mysql>use <データベース名>
mysql>describe <テーブル名>

その他

備忘録

  • データベースに接続
$ mysql -u <ユーザ名> -p <データベース名>
$ mysql -u <ユーザ名> -p
mysql>use <データベース名>
  • データベースのリスト表示
mysql>show databases;
  • テーブルのリスト表示
mysql>use <データベース名>
mysql>show tables;
  • テーブル定義の表示
mysql>describe <テーブル名>;
  • データベースをテキストでダンプ
$ mysqldump -u <ユーザ名> -p <データベース名>
  • ユーザ削除

削除したいユーザについて、登録済みのユーザ名とホスト名の組み合わせを調べる。覚えてればいいけど。

mysql> select host,user,password from user;
mysql> select host,db,user from db;
mysql> select host,db from host;

全てのユーザ名とホスト名の組み合わせについて以下を実行。ホスト名をワイルドカード(%)で指定しても登録されているすべての<ユーザ名>@'<ホスト名>'が削除されるわけでなく、<ユーザ名>@'%' が削除される。

mysql> revoke all on *.* from <ユーザ名>@'<ホスト名>';
mysql> drop user <ユーザ名>@'<ホスト名>';

revoke allではGRANT権限を削除できないので、GRANT権限があるユーザを削除する場合は

mysql> revoke grant option  on *.* from <ユーザ名>@'<ホスト名>';

も実行する。
データベースごとの権限を設定している場合は、以下も必要かも。

mysql> revoke all on <データベース名>.* from <ユーザ名>@'<ホスト名>';